使用 Emgu CV C# 创建轮廓蒙版以仅在原始图像上显示 ROI
Posted
技术标签:
【中文标题】使用 Emgu CV C# 创建轮廓蒙版以仅在原始图像上显示 ROI【英文标题】:Creating Contour Mask To Display Only ROI On Original Image With Emgu CV C# 【发布时间】:2018-01-05 23:54:48 【问题描述】:我进行了大量的挖掘工作,但没有发现任何与我的确切问题相符的问题。我也是一个 CV 菜鸟,所以我试图从我目前发现的解决方案中找到一个解决方案。
我有一组轮廓,可以通过以下方式在图像上显示(填充):
Mat img = CvInvoke.Imread(HttpContext.Current.Server.MapPath("IMAGELOCATION"));
VectorOfMat contours = new VectorOfMat();
..
//Various Morphological Transformations
..
CvInvoke.FindContours(maskDilate, contours, null, Emgu.CV.CvEnum.RetrType.External, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxNone);
CvInvoke.DrawContours(img, contours,-6, new MCvScalar(255), -1);
这些轮廓是非矩形的,其中的数据很有趣。最初我计划裁剪掉所有的轮廓,但似乎更好的解决方案只是在不影响轮廓内部的情况下,将除轮廓勾勒的 ROI 之外的原始图像的其余部分消隐。
这似乎是覆盖在原始图像上的轮廓蒙版的工作,类似于包含原始图像的矩阵,除了轮廓勾勒出的每个 ROI 之外,它们都被空白为零。
我最接近我需要的是来自这个线程 copying non-rectangular roi opencv 但是我正在使用 C# 并且没有概述我的 ROI 的坐标,因为它们通常形状奇怪并且位置可能会有所不同图片。一些指导或帮助将不胜感激!
【问题讨论】:
【参考方案1】:好吧,我想通了。看来我让事情变得比必要的更复杂。
首先我创建了一个矩阵来保存最终结果。我的印象是我可以使用 MCvScalar 指定背景颜色,但是当我尝试不同的 args 并且总是导致黑色背景时,它似乎并没有影响我的最终结果。如果有人对此有解释,那就太好了。
Matrix<int> blackedOut = new Matrix<int>(img.Size);
crop.SetValue(new MCvScalar(255, 255, 255));
完全没有必要查找和绘制轮廓,因为我已经有一个遮罩 (maskDilate) 来勾勒出我感兴趣的区域。
所以我所要做的就是将原始图像复制到应用了 maskDilate 的 blackedOut 矩阵。
img.CopyTo(crop, maskDilate);
因此,如果您遇到与我类似的情况,您应该已经有一个要传递给 FindContours 的遮罩,您可以直接使用它而不会弄乱轮廓。
我以此为参考https://www.bytefish.de/blog/extracting_contours_with_opencv/
【讨论】:
以上是关于使用 Emgu CV C# 创建轮廓蒙版以仅在原始图像上显示 ROI的主要内容,如果未能解决你的问题,请参考以下文章
如何将轮廓层次结构从 python openCV 转换为 emgu cv 以查找封闭轮廓
来自 Emgu CV(或 OpenCV)中多边形集的 Voronoi 图