【05】OpenCV C#——OpenCvSharp 图像基本操作---转灰度图、边缘提取、兴趣区域ROI,图像叠加

文章目录

  • [1 转灰度图、边缘提取](#1 转灰度图、边缘提取)
  • [2 兴趣区域ROI,图像叠加](#2 兴趣区域ROI,图像叠加)
    • [2.1 感兴趣区域](#2.1 感兴趣区域)
    • [2.2 图像叠加](#2.2 图像叠加)
      • [2.2.1 第一种:重载一般就是原封不动的叠加上去](#2.2.1 第一种:重载一般就是原封不动的叠加上去)
  • [2.2.2 图像叠加](#2.2.2 图像叠加)

1 转灰度图、边缘提取

cpp 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using OpenCvSharp;


namespace CvSharp
{
    class Program
    {
        static void Main(string[] args)
        {
             //创建一张128*128全白图像,和读取一张本地图像,进行显示测试
            Mat src = new Mat(@"D:\Projects\Programming_test\test_Images\12.png");
            Mat dst = new Mat();
            Mat gray = new Mat();
            Mat img2 = new Mat();


            //彩色转灰度图,边缘提取
            Cv2.CvtColor(src,gray,ColorConversionCodes.BGR2GRAY);
            Cv2.Canny(gray, dst, 50, 200);
            Cv2.ImShow("src image", src);
            Cv2.ImShow("gray image", gray);
            Cv2.ImShow("dst image", dst);

            Cv2.WaitKey();
        }
    }
}

2 兴趣区域ROI,图像叠加

2.1 感兴趣区域

cpp 复制代码
            //定义感兴趣区域
            Rect roi = new Rect(100, 30, 288, 200);//首先要用个rect确定我们的兴趣区域在哪
            Mat ImageROI = new Mat(src, roi);//新建一个mat,把roi内的图像加载到里面去。
            img2 = src.Clone();
            Cv2.Rectangle(img2, roi,new Scalar(255,0,0),2);
            Cv2.ImShow("兴趣区域", ImageROI);
            Cv2.ImShow("绘制感兴趣区域", img2);

2.2 图像叠加

现在要把我们选取的兴趣区域叠加在原图上。这里会涉及到一个函数copyto,

cpp 复制代码
  // 摘要:
        //     Copies the matrix to another one.将矩阵复制到另一个
        //
        // 参数:
        //   m:
        //     Destination matrix. If it does not have a proper size or type before the operation,
        //     it is reallocated.目标矩阵。如果操作前没有合适的尺寸或型号,这是重新分配。
        public void CopyTo(Mat m);如果直接等于的话,对等于中的一个矩阵进行操作,其它矩阵也会被修改,他们是是指向同一个数据缓冲区
        //
        // 摘要:
        //     Copies the matrix to another one.
        // 参数:
        //   m:
        //     Destination matrix. If it does not have a proper size or type before the operation,
        //     it is reallocated.
        //
        //   mask:
        //     Operation mask. Its non-zero elements indicate which matrix elements need to
        //     be copied.操作掩码,它的非零元素表示哪些矩阵元素需要被复制。
        public void CopyTo(Mat m, Mat mask);

2.2.1 第一种:重载一般就是原封不动的叠加上去

cpp 复制代码
 //创建一张128*128全白图像,和读取一张本地图像,进行显示测试
            Mat src = new Mat(@"D:\Projects\Programming_test\test_Images\12.png" ,ImreadModes.AnyColor);
            Mat dst = new Mat();
            Mat gray = new Mat();
            Mat img2 = new Mat();

            //定义感兴趣区域
            Rect roi = new Rect(100, 30, 288, 200);//首先要用个rect确定我们的兴趣区域在哪
            Mat ImageROI = new Mat(src, roi);//新建一个mat,把roi内的图像加载到里面去。
            img2 = src.Clone();
            Cv2.Rectangle(img2, roi,new Scalar(255,0,0),2);
            Cv2.ImShow("兴趣区域", ImageROI);
            Cv2.ImShow("绘制感兴趣区域", img2);

            //图像叠加
            Rect rect = new Rect(0, 0, ImageROI.Rows, ImageROI.Cols);//定义第一个矩阵,前2个参数是要放的位置,后面插入图片的大小
            Mat pos = new Mat(src, rect);//将感兴趣区域叠加到原图左上角位置
            ImageROI.CopyTo(pos);
            Cv2.ImShow("图像叠加", src);
 
            Cv2.WaitKey();

按说可以,但叠加显示没变化

2.2.2 图像叠加

cpp 复制代码
           //在这里插入代码片
           //创建一张128*128全白图像,和读取一张本地图像,进行显示测试
            Mat src = new Mat(@"D:\Projects\Programming_test\test_Images\12.png" ,ImreadModes.AnyColor);
            Mat dst = new Mat();
            Mat gray = new Mat();
            Mat img2 = new Mat();
            
            //定义感兴趣区域
            Rect roi = new Rect(100, 30, 288, 200);//首先要用个rect确定我们的兴趣区域在哪
            Mat ImageROI = new Mat(src, roi);//新建一个mat,把roi内的图像加载到里面去。
            img2 = src.Clone();
            Cv2.Rectangle(img2, roi,new Scalar(255,0,0),2);
            Cv2.ImShow("兴趣区域", ImageROI);
            Cv2.ImShow("绘制感兴趣区域", img2);

            //图像叠加
            Mat mask = ImageROI.CvtColor(ColorConversionCodes.BGR2GRAY);//新建一个掩码接收变成灰度图的滑稽
            Cv2.Threshold(mask, mask, 240, 255, ThresholdTypes.BinaryInv);//灰度图二值化,高于240的变成黑色,其它白色
            Rect rect = new Rect(30, 30, ImageROI.Rows, ImageROI.Cols);//复制到哪去
            Mat pos = new Mat(src, rect);
            ImageROI.CopyTo(pos, mask);//掩码黑色的区域不复制

            Cv2.ImShow("mask", mask);
            Cv2.ImShow("图像叠加", src);
 
            Cv2.WaitKey();

按说可以,但叠加显示没变化

相关推荐
格林威16 小时前
工业相机参数解析:曝光时间与运动模糊的“生死博弈”
c++·人工智能·数码相机·opencv·算法·计算机视觉·工业相机
脑电信号要分类16 小时前
将多张图片拼接成一个pdf文件输出
pdf·c#·apache
njsgcs17 小时前
c# solidworks 折弯系数检查
开发语言·c#
格林威18 小时前
工业相机图像采集:Grab Timeout 设置建议——拒绝“假死”与“丢帧”的黄金法则
开发语言·人工智能·数码相机·计算机视觉·c#·机器视觉·工业相机
唐青枫18 小时前
C#.NET SignalR + Redis Backplane 深入解析:多节点部署与跨实例消息同步
c#·.net
AI科技星1 天前
全尺度角速度统一:基于 v ≡ c 的纯推导与验证
c语言·开发语言·人工智能·opencv·算法·机器学习·数据挖掘
FL16238631291 天前
[C#][winform]segment-anything分割万物部署onnx模型一键抠图演示
开发语言·c#
love530love1 天前
OpenClaw 手机直连配置全流程
人工智能·windows·python·智能手机·c#·agent·openclaw
bcbobo21cn1 天前
C# byte类型和byte数组的使用
开发语言·c#·字节数组·byte类型
月巴月巴白勺合鸟月半2 天前
一次PDF文件的处理(一)
pdf·c#