OpenCV:嵌套轮廓的数量

发布于 2024-11-19 03:27:53 字数 493 浏览 1 评论 0原文

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

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

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

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

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

我尝试将其转换为:

Mat *oimg; IplImage img = *oimg;

但调用 cvFindContours 时出现错误。

我还尝试使用 findContours ,它是为与 Mat 一起使用而构建的,

通过遍历层次结构,但它不起作用。

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

谢谢分配,

Tamir。

This is my first question here, thank you for reading it.

I am trying to count the number of inner contours inside a contour.

I found a nice tutorial showing how to use h_next and v_next

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

The problem is I use Mat and not IplImage.

I tried to convert it with:

Mat *oimg;
IplImage img = *oimg;

But I get an error when calling cvFindContours.

I also tried usign findContours which is built to work with Mat,

by going through the hierrarchy but it didnt work.

I'm usign C++ and OpenCV2.0

Thanks allot,

Tamir.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

明媚殇 2024-11-26 03:27:53

我建议直接使用 C++ 版本的 cvFindContours(),而不是将 cv::Mat 转换为 IplImage 来使用 C API: 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 – 可选的输出向量
其中将包含有关的信息
图像拓扑。它将有如
许多元素的数量
轮廓。对于每个轮廓轮廓[i]
,元素层级[i][0],
hiearchyi , hiearchy[i][2] ,
hiearchy[i][3] 将被设置为从 0 开始
下一个和的轮廓中的索引
先前的轮廓相同
等级级别,第一个孩子
轮廓和父轮廓,
分别。
如果对于某个轮廓 i
没有下一个、上一个、父级或
嵌套轮廓,相应的
层次结构[i]的元素将是
负数

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

Instead of converting the cv::Mat to an IplImage to use the C API, I suggest directly using the C++ version of cvFindContours(): cv::findContours(). Instead of building a true tree data structure, it is flattened and stored in two vectors:

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);

Check the C++ API documentation for instructions on how to interpret hierarchy (emphasis mine):

hiararchy – The optional output vector
that will contain information about
the image topology. It will have as
many elements as the number of
contours. For each contour contours[i]
, the elements hierarchy[i][0] ,
hiearchyi , hiearchy[i][2] ,
hiearchy[i][3] will be set to 0-based
indices in contours of the next and
previous contours at the same
hierarchical level, the first child
contour and the parent contour,
respectively.
If for some contour i
there is no next, previous, parent or
nested contours, the corresponding
elements of hierarchy[i] will be
negative

Switching between the C and C++ API in the same codebase really hurts readability. I suggest only using the C API if the functionality you need is missing from the C++ API.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文