我建议直接使用 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。