使用 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 图像捕获使用 C#

来自 Emgu CV(或 OpenCV)中多边形集的 Voronoi 图

如何使用 twain/emgu/open cv 获得良好的清晰度?

使用 OpenCV 从轮廓中获取掩码

如何使用 C# 中的 Emgu CV 库在图像上绘制矩形。举个例子