【问题标题】:OpenCV finds only image border as contourOpenCV仅找到图像边框作为轮廓
【发布时间】:2015-03-02 12:09:46
【问题描述】:

我想用RETR_EXTERNAL 获取所有外轮廓,但由于某些奇怪的原因,openCV 认为图像边框也是轮廓,因此丢弃了所有内轮廓。我到底做错了什么?

List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();
Imgproc.findContours(imageA, contours, hierarchy, Imgproc.RETR_EXTERNAL,
                     Imgproc.CHAIN_APPROX_SIMPLE);

for (int i = 0; i < contours.size(); i++) {
    double[] c = hierarchy.get(0, i);
    Rect rect = Imgproc.boundingRect(contours.get(i));
    Core.rectangle(image, new Point(rect.x, rect.y),
        new Point(rect.x + rect.width, rect.y + rect.height), 
        new Scalar(0, 255, 0), 3);
}

输入(图像A在轮廓查找之前被处理过):

输出:

编辑: 问题部分解决 反转像素,使黑色为背景,白色为前景,有助于上图。但是,我仍然在某些图像上得到内部轮廓。喜欢这个:

输入

输出

【问题讨论】:

  • 输入图像应该是 Cv_8UC1,前景像素必须是白色,所以你应该反转你的图像(255-imageA)然后它应该可以工作!
  • 你说得对,我把它倒过来了,现在这张图片表现得像预期的那样。然而其他人没有。绘制明显位于其他矩形内部的矩形。
  • 您可以发布其中一个示例的imageA 吗?
  • @TomTom... 尝试使用Imgproc.RETR_LIST 而不是Imgproc.RETR_EXTERNAL.
  • @Micka 当然我编辑了帖子并添加了一个示例。请注意,这不是原始图像大小。大约七分之一。

标签: java opencv


【解决方案1】:

您的输入图像不够好,无法提取您想要的轮廓。

您的输入轮廓是这些(图像的一部分):

每种颜色都是一个轮廓(以及一些白色轮廓)

对于红色轮廓,我绘制了边界矩形,这与您用来显示轮廓的方法相同。所有其他彩色轮廓都不在红色轮廓内,而是在边界矩形内,这就是为什么即使您选择仅查找外部轮廓也会找到它们的原因。

你真正想要的是这样的:

但要获得该结果,您的输入图像也必须连接椭圆的那条线!!

对于您的输入图像,如果不获取地面线,将很难提取这些线,但一种简单的方法是使用几个膨胀操作,然后对输入图像进行相同数量的腐蚀操作,在提取轮廓之前。不过,这对于所有设置都不是稳定的;)

【讨论】:

  • 让我们看看我是否能找到一个稳定的解决方案:)
猜你喜欢
  • 2020-06-08
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 2017-07-21
相关资源
最近更新 更多