cv :: findContours返回的轮廓是否具有一致的方向?

Chr*_*ica 12 opencv opencv-contour

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

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

那么,它是否特别保证返回的轮廓cv::findContours始终具有一致的方向?这记录在哪里?或者它是否因版本而异(我的情况是2.4.5)?文档中引用的算法上的实际论文是否已经说明了这一点?或者,对OpenCV的实际实现有一点洞察力的人可以比界面文档更多地说明这一点吗?

Chr*_*hme 9

返回的轮廓cv:findContours应该具有一致的方向.外轮廓应逆时针方向,内轮廓顺时针方向.这直接来自铃木和安倍的论文附录1中描述的算法.

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

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

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

结合访问相邻像素的不同起始位置,这导致轮廓的可预测取向.

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

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

  • 根据你的回答,我根本不清楚你突出的点如何保证轮廓的方向.只有在自己阅读了论文后,我才明白是什么让这个方向保持一致.我仍然无法将你的答案与我的理解联系起来.这就是我决定提供另一个答案的原因,这个答案解释了我对算法保证的理解.该论文实际上已在问题中被引用.由于实施是基于它,因此无论是引用这个还是其他内容都没有多少选择. (3认同)
  • 我同意。如果之前的答案确实包含该信息,那么它会以非直观的方式传达。 (2认同)