OpenCV:嵌套轮廓的数量

时间:2011-07-09 12:15:49

标签: opencv contour

这是我的第一个问题,感谢您阅读。

我正在尝试计算轮廓内部轮廓的数量。

我找到了一个很好的教程,展示了如何使用h_next和v_next

http://jmpelletier.com/a-simple-opencv-tutorial/

问题是我使用Mat而不是IplImage。

我尝试将其转换为:

Mat * oimg; IplImage img = * oimg;

但是我在调​​用cvFindContours时遇到错误。

我也试过使用findContours来构建与Mat一起使用,

通过层级结构,但它没有工作。

我使用的是C ++和OpenCV2.0

感谢分配,

塔米尔。

1 个答案:

答案 0 :(得分:3)

我建议您不要将cv::Mat转换为IplImage以使用C API,而是直接使用cvFindContours()的C ++版本:cv::findContours()。它不是构建真正的树数据结构,而是扁平化并存储在两个向量中:

cv::Mat image = // ...
std::vector<std::vector<cv::Point> > contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(image, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE);

查看C++ API documentation有关如何解释hierarchy(强调我的)的说明:

  

hiararchy - 可选的输出向量   这将包含有关的信息   图像拓扑。它将具有   很多元素作为数量   轮廓。对于每个轮廓轮廓[i]   ,元素层次[i] [0],   hiearchy i,hiearchy [i] [2],   hiearchy [i] [3] 将设置为0   下一个和下一个轮廓的指数   以前的轮廓同样如此   等级,第一个孩子   轮廓和父轮廓,   分别。如果对于某些轮廓我   没有下一个,前一个,父母或   嵌套轮廓,相应的   等级[i]的元素将是   负

在同一代码库中切换C和C ++ API确实会损害可读性。如果C ++ API中缺少您需要的功能,我建议仅使用C API。