这是我的第一个问题,感谢您阅读。
我正在尝试计算轮廓内部轮廓的数量。
我找到了一个很好的教程,展示了如何使用h_next和v_next
http://jmpelletier.com/a-simple-opencv-tutorial/
问题是我使用Mat而不是IplImage。
我尝试将其转换为:
Mat * oimg; IplImage img = * oimg;
但是我在调用cvFindContours时遇到错误。
我也试过使用findContours来构建与Mat一起使用,
通过层级结构,但它没有工作。
我使用的是C ++和OpenCV2.0
感谢分配,
塔米尔。
答案 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。