我做了很多挖掘,但没有发现任何与我的确切问题相符的问题。我也是一个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#工作并且没有勾勒出我的投资回报率的坐标,因为它们通常形状奇特而且可能有所不同图像上的位置。一些方向或帮助将非常感谢!
答案 0 :(得分:0)
好吧我明白了。看起来我做的事情比必要的更复杂。
首先,我创建了一个Matrix来保存最终结果。我的印象是我可以使用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/