1

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

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

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

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

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

我尝试将其转换为:

垫 *oimg; IplImage img = *oimg;

但是在调用 cvFindContours 时出现错误。

我还尝试了 ussign findContours,它是为与 Mat 一起工作而构建的,

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

我正在使用 C++ 和 OpenCV2.0

谢谢分配,

塔米尔。

4

1 回答 1

3

我建议直接使用 C++ 版本的: ,而不是将 转换cv::Mat为使用 C API 。与其构建真正的树数据结构,不如将其展平并存储在两个向量中:IplImagecvFindContours()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 文档以获取有关如何解释的说明hierarchy(强调我的):

hiararchy – 可选的输出向量,将包含有关图像拓扑的信息。它将具有与轮廓数一样多的元素。对于每个轮廓 contours[i] ,元素 hierarchy[i][0] , hiearchy i, hiearchy[i][2] , hiearchy[i][3]将设置为下一个轮廓中基于 0 的索引,并且同一层级的先前轮廓,分别是第一个子轮廓和父轮廓。如果对于某个轮廓 i 没有下一个、上一个、父级或嵌套轮廓,则相应的 hierarchy[i] 元素将为负

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

于 2011-07-09T18:13:25.010 回答