Using hierarchy in findContours () in OpenCV?(在 OpenCV 的 findContours () 中使用层次结构?)
问题描述
在查找轮廓时,我使用了 CV_RETR_CCOMP 参数.这应该创建一个两级层次结构 - 第一级用于外轮廓,第二级用于孔的边界.然而,我之前从未使用过层次结构,所以我对此并不熟悉.
When finding contours, I used the CV_RETR_CCOMP argument. This is supposed to create a two level hierarchy - the the first level are for outer contours, the second level are for boundaries of the holes. However, I have never used a hierarchy before so I am not familiar with this.
有人可以指导我如何仅访问孔的边界吗?我想忽略外部轮廓,只绘制孔边界.代码示例将不胜感激.我使用的是 C++ 接口而不是 C,所以请不要建议使用 C 函数(即使用 findContours () 而不是 cvFindContours ()).
Could someone instruct my on how to access the boundaries of the holes only? I want to disregard the outer contours and only draw the hole boundaries. Code examples will be appreciated. I am using the C++ interface not the C, so please don't suggest C functions (i.e. use findContours () instead of cvFindContours ()).
推荐答案
findContours 返回的层次结构具有以下形式:hierarchy[idx][{0,1,2,3}]={下一个轮廓(同级),前一个轮廓(同级),子轮廓,父轮廓}
The hierarchy returned by findContours has the following form:
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:也就是说,每个元素要么没有父级或子级,要么有父级但没有子级,或者一个孩子,但没有父母.
CV_RETR_CCOMP, returns a hierarchy of outer contours and holes.
This means elements 2 and 3 of hierarchy[idx] have at most one of these not equal to -1: that is, each element has either no parent or child, or a parent but no child, or a child but no parent.
具有父元素但没有子元素的元素将是孔的边界.
An element with a parent but no child would be a boundary of a hole.
这意味着您基本上要通过 hierarchy[idx] 并使用 hierarchy[idx][3]>-1 绘制任何内容.
That means you basically go through hierarchy[idx] and draw anything with hierarchy[idx][3]>-1.
类似的东西(在 Python 中工作,但还没有测试 C++.不过这个想法很好.):
Something like (works in Python, but haven't tested the C++. Idea is fine though.):
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 );
}
}
}
这篇关于在 OpenCV 的 findContours () 中使用层次结构?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在 OpenCV 的 findContours () 中使用层次结构?
基础教程推荐
- 在 C++ 中计算滚动/移动平均值 2021-01-01
- 我有静态或动态 boost 库吗? 2021-01-01
- 这个宏可以转换成函数吗? 2022-01-01
- C++结构和函数声明。为什么它不能编译? 2022-11-07
- 如何在 C++ 中初始化静态常量成员? 2022-01-01
- 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01
- 如何通过C程序打开命令提示符Cmd 2022-12-09
- 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
- 常量变量在标题中不起作用 2021-01-01
- 如何检查GTK+3.0中的小部件类型? 2022-11-30
