【问题标题】:OpenCV - find or access shape contour not surrounded by bg, only separated by an outlineOpenCV - 查找或访问未被bg包围的形状轮廓,仅由轮廓分隔
【发布时间】:2012-04-13 01:04:48
【问题描述】:

我一直在尝试使用 OpenCV 的 findContour(我想使用 C++ 语法)在非常简单的背景中找到单个形状的轮廓。然而,它不断地使其轮廓成为轮廓,而不是形状本身。我认为这是因为 Canny 产生的白色边缘不会使形状闭合。

案例 A:形状位于图像的边缘 (这不是实际的输入图像,而是更简单的输入图像来说明这个问题。)

案例 B:背景围绕形状

我使用的主要功能有:

findContours( grayImage, contours, hierarchy, RETR_LIST,CHAIN_APPROX_SIMPLE);
approxPolyDP(Mat(contours.at(largestContourIndex)),poly,3,true);
drawContours(output, contours, largestContourIndex, RGB(250,0,100), -1, 8, hierarchy, 0, Point() );

编辑:跳过边缘检测给出了我需要的轮廓,但我需要有我能得到的最佳轮廓近似值。

提前致谢。

【问题讨论】:

  • 我看到你在我回答后编辑了你的帖子。如果您对我的回答发表评论,说明天气有帮助,如果没有,为什么该方法不起作用(即您尝试时发生了什么)
  • 我实际上已经尝试过您的方法和其他几种方法。我只是在犹豫是否让这个问题变得复杂并且令人沮丧。很快就会做出回复和编辑。感谢您的帮助。

标签: c++ image-processing opencv contour


【解决方案1】:

我仍然没有找到无法获得形状轮廓的原因,但我找到了解决方法。在做了腐蚀和膨胀之后,我基本上要在输入图像的最外层像素上画一个边框或一个矩形,让背景包围形状,...

rectangle(input,Point(0,0),Point(input.cols-1,input.rows-1),Scalar(0,0,0),1,8,0);

...因此,让 Canny 绘制一个封闭的形状轮廓并给我想要的形状轮廓。我仍在尝试像@dvhamme 所建议的那样成功地反转 Canny 的输出,但它仍然给我错误。如果有人指出如何正确获取或访问形状轮廓会更好,但感谢大家的帮助。

【讨论】:

  • 我复制了您的问题,并且反转精明的图像没有帮助。然而,起作用的是使用threshold() 来分割对象,然后运行findContours()。轮廓检测器显然并不打算在线检测之后使用,但在二进制分割图像上工作得很好,无论对象是否接触边缘。
  • 感谢您的宝贵时间!一旦我回到这个项目,我会记住尝试threshold()。我一直在做类似inRange(src_Mat, min, max, dst_Mat) 的事情,从那以后就没有碰过。
【解决方案2】:

在我看来,您正在寻找的轮廓可能已被检测到,但您没有使用它。相反,您使用的是最大的轮廓。尝试将所有找到的轮廓一一绘制出来,看看它是否在其中。

如果不是,请尝试反转 canny 图像并重复该过程。

【讨论】:

  • 这正是我所期望的,但我确实尝试一一绘制轮廓并更改轮廓模式和轮廓方法,这些轮廓模式和轮廓方法被 OpenCV 的 findContour 作为参数。我尝试了我的初始阈值,但形成的轮廓总是会围绕轮廓汇集。我会试试你的建议。谢谢。
【解决方案3】:

您是否尝试过使用形态学操作

如果您的基本问题是您获得的轮廓位于对象的外部而不是内部,特别是如果您的对象是由如此清晰且大部分规则的形状制成的,那么形态学可能会有所帮助。

我知道 OpenCV 实现了 dilationerosion,以及 openingclose 操作。一种可能适用于您的情况的非常简单的方法只是稍微腐蚀形状(可能是 1-2-3 次迭代),然后完全按照您已经在做的事情。希望你能得到侵蚀形状的外轮廓,这实际上应该是原始形状的内轮廓。

我认为 OpenCV 实际上实现了一些更复杂的形态,但一如既往,先尝试简单的东西 :D

【讨论】:

  • 我实际上是在输入图像上进行腐蚀然后膨胀,并使用轨迹栏来控制每个图像的内核。我了解您的方法允许我消除靠近边缘的形状部分。但是我必须先使用边缘检测,然后才能找到它的轮廓来改进近似的轮廓。进行边缘检测仍然会给我一个带有轮廓的黑色图像。基本上会有 3 组像素 - (1) 背景、(2) 白色轮廓和 (3) 形状,这让我想到了我的主要问题 - 为什么第 3 组没有被 OpenCV 包围在轮廓中? TIA
猜你喜欢
  • 2012-11-06
  • 1970-01-01
  • 2018-02-13
  • 2017-05-15
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 2021-09-01
相关资源
最近更新 更多