ROI(region of interest),感兴趣区域。机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI。在Halcon、OpenCV、Matlab等机器视觉软件上常用到各种算子(Operator)和函数来求得感兴趣区域ROI,并进行图像的下一步处理。以上来自百度百科。
lenna太丑了,下面换成滚滚。
1.定义兴趣区域
Mat panda = new Mat(@"滚滚.png", ImreadModes.AnyColor);
Rect roi = new Rect(400, 300, 400, 400);//首先要用个rect确定我们的兴趣区域在哪
Mat ImageROI = new Mat(panda, roi);//新建一个mat,把roi内的图像加载到里面去。
Cv2.ImShow("兴趣区域", ImageROI);
Cv2.ImShow("滚滚",panda);
Cv2.WaitKey();
兴趣区域实际上就是一个mat对象,方便我们完成下一步的工作。
2.图像叠加
现在要把我们选取的兴趣区域叠加在原图上。这里会涉及到一个函数copyto,
// 摘要:
// 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);
第一种重载一般就是原封不动的叠加上去,第二种复杂点,下面再说。
Mat panda = new Mat(@"滚滚.png", ImreadModes.AnyColor);
Rect roi = new Rect(400, 300, 400, 400);//首先要用个rect确定我们的兴趣区域在哪
Mat ImageROI = new Mat(panda, roi);//新建一个mat,把roi内的图像加载到里面去。
Rect rect = new Rect(0,0, ImageROI.Rows, ImageROI.Cols);//定义第一个矩阵,前2个参数是要放的位置,后面插入图片的大小
Mat pos = new Mat(panda, rect);
ImageROI.CopyTo(pos);
Cv2.ImShow("滚滚",panda);
Cv2.WaitKey();
把插入的图片复制到pos,而panda却被修改了。这是因为mat pos =new (panda,rect),使用等于号连接,它并没有新建一个图片,而是pos带着rect指向panda,所以在修改pos的时候也就相当于修改了panda。有点指针的感觉啊。
emmm就是这样。
第二种
Mat panda = new Mat(@"滚滚.png", ImreadModes.AnyColor);
Mat ImageROI = new Mat(@"huaji.png",ImreadModes.Color);//读取滑稽
Mat mask = ImageROI.CvtColor(ColorConversionCodes.BGR2GRAY);//新建一个掩码接收变成灰度图的滑稽
Cv2.Threshold(mask, mask, 240,255, ThresholdTypes.BinaryInv);//灰度图二值化,高于240的变成黑色,其它白色
Rect rect = new Rect(430,300, ImageROI.Rows, ImageROI.Cols);//复制到哪去
Mat pos = new Mat(panda, rect);
ImageROI.CopyTo(pos, mask);//掩码黑色的区域不复制
Cv2.ImShow("mask", mask);
Cv2.ImShow("滚滚", panda);
Cv2.WaitKey();
cvtcolor是颜色转换,颜色空间转换的函数,例如把BGR(注意opencv是BGR而不是RGB)和HSV互转。当然彩色变灰色也可以,BGR2GARY中间2就是to的意思。
Threshold阈值函数
五个参数分别是源,目的地,阈值,最大值,阈值类型。
常用的阈值类型有binary,和binaryinv
选用binary的时候是某个像素的灰度大于阈值的时候,这个像素的灰度变成最大值,小于的时候则为0.
选用binaryinv的时候与之相反,其它类型百度。