在OpenCV的findContours()中使用层次结构
Using hierarchy in findContours () in OpenCV?
当找到轮廓时,我使用CV_RETR_CCOMP参数。这应该创建一个两层的层次结构-第一层是外部轮廓,第二层是孔的边界。但是,我以前从未使用过层次结构,所以我对它不熟悉。
有人能告诉我如何只访问洞的边界吗?我想忽略外部轮廓,只画洞的边界。代码示例将受到赞赏。我使用的是c++接口而不是C,所以请不要建议使用C函数(即使用findContours()而不是cvFindContours())。
findContours
返回的层次结构有如下形式:hierarchy[idx][{0,1,2,3}]={next contour (same level), previous contour (same level), child contour, parent contour}
CV_RETR_CCOMP
,返回外部轮廓和孔的层次结构。这意味着hierarchy[idx]
的元素2和元素3最多有一个不等于-1的元素:即每个元素要么没有父元素也没有子元素,要么有父元素但没有子元素,要么有子元素但没有父元素。
一个有父元素但没有子元素的元素将是一个洞的边界。
这意味着你基本上通过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 );
}
}
}
我敢说,当使用CV_RETR_CCOMP时,所有的洞都在同一水平上。
int firstHoleIndex = hierarchy[0][2];
for (int i = firstHoleIndex; i >= 0 ; i = hierarchy[i][0])
// contours.at(i) is a hole. Do something with it.
相关文章:
- 如何重构类层次结构以避免菱形问题
- C++ 中模板化类型的类层次结构
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 继承层次结构并将元素添加到向量
- C++ 类层次结构中的"对齐"是什么意思?
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 类层次结构中的运算符重载
- 如何在层次结构中实现运算符使用?
- 反向层次结构中的可变参数模板参数
- 如何在继承层次结构中调用具有默认参数的构造函数?
- C++ 提升 - 包含类层次结构对象的类的序列化
- 在C++继承层次结构时提取实现者
- 在C++中将类实例添加到对象层次结构中的问题
- 确定大层次结构中基本指针的实际类型,无需dynamic_cast
- 在继承层次结构中复制和移动
- 模板冲突的类型-但类型应该是相同的cfr类层次结构
- 删除父/子窗口层次结构的最佳方法
- 是否可以使一个类成为两个不同层次结构的子类?
- 我们可以在层次结构中创建多个纯虚拟接口及其实现而不会代码爆炸吗?
- 在OpenCV的findContours()中使用层次结构