我正在使用 OpenCVcv::findContours http://docs.opencv.org/2.4/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#findcontours函数来提取二进制图像中的轮廓,特别是,我正在提取轮廓的层次结构(使用CV_RETR_CCOMP
旗帜)。在我进一步处理这些轮廓的某个时刻,我需要依赖这些轮廓的顶点方向一致(即逆时针与顺时针).
当然,我可以使用轮廓面积的符号自己确定方向(由下式计算)cv::contourArea(..., true) http://docs.opencv.org/2.4/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#contourarea),但我想知道这是否有必要(除此之外,它甚至不适用于面积为 0 的轮廓,即源图像中的细线)或者如果cv::findContours
已经保证了生成的轮廓的方向一致。我确实检查了一些生成的轮廓cv::contourArea
确实seem返回外轮廓的负值和内轮廓的正值。然而我并没有找到任何实际的保证OpenCV 文档中对此进行了说明。
So, is it 特别保证返回的轮廓cv::findContours
总是有一个一致的方向?这有记录在任何地方吗?或者它是否因版本而异(我的是 2.4.5)?实际情况是否关于文档中引用的算法的论文 http://docs.opencv.org/2.4/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#suzuki85已经说过这件事了吗?或者也许对 OpenCV 的实际实现有更多了解的人可以比接口文档对此说得更多一些?
返回的轮廓cv:findContours
应该有一个一致的方向。外轮廓应逆时针方向,内轮廓顺时针方向。这直接来自附录 1 中描述的算法铃木和安倍的论文 http://download.xuebalib.com/xuebalib.com.17233.pdf.
从左上到右下逐行扫描图像。当找到属于边界的像素时,沿着边界按逆时针顺序查看第一个像素的邻居(参见算法中的步骤 3.3),直到找到非背景像素。这将被添加到轮廓中,并且从该像素继续搜索。
重要的是,在第一次迭代中,首先查看的邻居取决于它是内部边界还是外部边界。如果是外边界,首先访问右边的邻居;如果是内部边界,则它是左侧邻居。在下一个搜索步骤中,搜索从最后访问的像素开始。
由于扫描是从左上到右下进行的,因此在检测到外边界时,可以确保边界像素左侧和顶部的所有相邻像素都是背景像素。对于内边框,情况正好相反,左侧和顶部的所有邻居都是非背景像素。
与访问相邻像素的不同起始位置相结合,这会产生可预测的轮廓方向。
该算法的实现是在icvFetchContour功能 https://github.com/opencv/opencv/blob/master/modules/imgproc/src/contours.cpp#L515这是内部使用的cv:findContour
。从那里可以清楚地看出,像素按照访问的顺序添加到轮廓多边形中。
As the 的文档cv::findContours http://docs.opencv.org/2.4/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#findcontours具体说他们实现了铃木等人的算法。由于本文中明确定义了访问像素的方向和顺序,因此我认为可以假设方向是有保证的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)