【问题标题】:Do contours returned by cv::findContours have a consistent orientation?cv::findContours 返回的轮廓是否具有一致的方向?
【发布时间】:2018-01-01 13:51:57
【问题描述】:

我正在使用 OpenCV 的 cv::findContours 函数来提取二进制图像中的轮廓,特别是,我正在提取轮廓的层次结构(使用 CV_RETR_CCOMP 标志)。在我进一步处理这些轮廓的某个时刻,我需要依赖这些轮廓的一致顶点方向(即逆时针与顺时针)

当然,我可以使用轮廓区域的符号(由cv::contourArea(..., true) 计算)自己确定该方向,但我想知道这是否有必要(除此之外,它甚至不适用于具有面积为 0,即源图像中的细线)或者cv::findContours 已经保证生成的轮廓的方向一致。我确实检查了一些生成的轮廓,cv::contourArea 确实 似乎 为外部轮廓返回负值,为内部轮廓返回正值。但是,我在 OpenCV 文档中找不到任何实际的保证

那么,是否特别保证cv::findContours 返回的轮廓始终具有一致的方向?这是否记录在任何地方?或者它是否因版本而异(我的版本是 2.4.5)?实际的paper on the algorithm referenced in the documentation 是否已经对此有所说明?或者也许对 OpenCV 的实际实现有更深入了解的人可以比接口文档多说一点?

【问题讨论】:

    标签: opencv opencv-contour


    【解决方案1】:

    我相信 Appendix I 的步骤 14(在您引用的 [Suzuki85] 论文中,“Topological通过边界跟踪对数字化二进制图像的结构分析”)涵盖了您的以下问题:

    (1) 选择以下选项之一:
    (a) 若 f i, j = 1 且 f i, j - 1 = 0,则判定像素 ( i, j ) 为 外边框的起点,递增NBD,与(i 1, j 1) + (i, j - 1)。
    (b) ...

    (2) 取决于新发现的边框的类型和...

    (3) 从起点 (i, j) 开始,沿着检测到的边界...

    (4) 如果 f i, j != 1,则 LNBD = | f i, j |并从像素( i, j + 1 )恢复光栅扫描。当扫描到达图片的右下角时,算法终止

    【讨论】:

      【解决方案2】:

      cv:findContours 返回的轮廓应该具有一致的方向。外轮廓应为逆时针方向,内轮廓应为顺时针方向。这直接来自Suzuki's and Abe's paper 的附录 1 中描述的算法。

      图像从左上角到右下角逐行扫描。当找到属于边界的像素时,沿着边界以逆时针顺序查看第一个像素的邻居(参见算法中的步骤 3.3),直到找到非背景像素。这被添加到轮廓中,并从该像素继续搜索。

      重要的是,在第一次迭代中,首先查看的邻居取决于它是内边界还是外边界。在外边界的情况下,首先访问右侧的邻居;在内部边界的情况下,它是左侧邻居。在下一个搜索步骤中,搜索从最后访问的像素开始。

      由于扫描从左上角到右下角,在检测到外边界时,可以确保左侧的所有相邻像素和边界像素的顶部都是背景像素。内边框则正好相反,左侧和顶部的所有邻居都是非背景像素。

      结合访问相邻像素的不同起始位置,可以预测轮廓的方向。

      此算法在icvFetchContour function 中实现,cv:findContour 在内部使用该算法。从那里可以清楚地看出,像素是按照访问顺序添加到轮廓多边形中的。

      正如documentation for cv::findContours 特别指出的那样,他们实现了 Suzuki 等人的算法。并且在本文中,访问像素的方向和顺序是明确定义的,我认为可以假设方向是有保证的。

      【讨论】:

      • 只是想指出你说的和我一样,引用了同一篇论文,并在我之后 7 小时发布......
      • 从您的回答中,我完全不清楚您突出显示的点如何保证轮廓的方向。只有在自己阅读论文之后,我才明白是什么使方向一致。我仍然无法真正将您的答案与我的理解联系起来。这就是为什么我决定提供另一个答案来解释我对算法保证的理解。该论文实际上已经在问题中被引用。由于实现是基于它的,所以没有太多选择是引用这个还是其他的。
      • 我同意。如果较早的答案确实包含该信息,那么它是以非直观的方式传达的。
      • 没有难过的感觉;如果您的回复增加了对 OP 的洞察力,那么欢迎您。从阅读你的开场白来看,它似乎只是在说我用更多的话做的事情。有时我猜这些话很重要。 :) ..再一次,不用担心。
      猜你喜欢
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 2012-07-03
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多