文章目录
- [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();
按说可以,但叠加显示没变化