在寻找轮廓时,我使用了 CV_RETR_CCOMP 参数。这应该创建一个两级层次结构 - 第一级用于外部轮廓,第二级用于孔的边界。但是,我以前从未使用过层次结构,因此对此并不熟悉。
有人可以指导我如何仅访问孔的边界吗?我想忽略外部轮廓,只绘制孔边界。代码示例将不胜感激。我使用的是 C++ 接口(interface)而不是 C,所以请不要建议使用 C 函数(即使用 findContours () 而不是 cvFindContours ())。
最佳答案
findContours
返回的层次结构如下:
hierarchy[idx][{0,1,2,3}]={下一个轮廓(同级),前一个轮廓(同级),子轮廓,父轮廓}
CV_RETR_CCOMP
,返回外部轮廓和孔的层次结构。
这意味着 hierarchy[idx]
的元素 2 和 3 最多有一个不等于 -1:也就是说,每个元素要么没有父级或子级,要么有父级但没有子级,或者一个 child ,但没有 parent 。
具有父元素但没有子元素的元素将成为孔的边界。
这意味着你基本上通过 hierarchy[idx]
并使用 hierarchy[idx][3]>-1
绘制任何东西。
类似的东西(在 Python 中工作,但尚未测试 C++。不过想法很好。):
findContours( image, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
if ( !contours.empty() && !hierarchy.empty() ) {
// loop through the contours/hierarchy
for ( int i=0; i<contours.size(); i++ ) {
// look for hierarchy[i][3]!=-1, ie hole boundaries
if ( hierarchy[i][3] != -1 ) {
// random colour
Scalar colour( (rand()&255), (rand()&255), (rand()&255) );
drawContours( outImage, contours, i, colour );
}
}
}
关于c++ - 在 OpenCV 的 findContours() 中使用层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8461612/