在 C++ 中使用 OpenCV 2.4 计算凸性缺陷 [英] Calculating convexityDefects using OpenCV 2.4 in c++

查看:41
本文介绍了在 C++ 中使用 OpenCV 2.4 计算凸性缺陷的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 OpenCV 2.4 来计算图像的凸包.

I'm using OpenCV 2.4 to calculate the convex hull of a image.

我也在做一些处理以去除图像中的一些噪音,这与问题无关.

I'm also doing some processing to remove some noise from the image, which is not really relevant to the question.

计算convexHull的代码如下:

The code to calculate the convexHull is the following:

...
cv::Mat sourceImage; // assume something is already here please
cv::vector<cv::Vec4i> hierarchy;    
std::vector<std::vector<cv::Point> > contours;

cv::findContours( sourceImage, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE,cv::Point(0, 0));

// Find the convex hull object for each contour
vector<cv::vector<cv::Point> >hull( contours.size() );

for (int i = 0; i < contours.size(); i++)
{
    convexHull( contours[i], hull[i], false );
}
...

同时拥有convexHull和轮廓我现在想计算船体的convexityDefects,通过查看opencv文档,我认为它会是这样的:

Having both the convexHull and the contours I now want to calculate the convexityDefects of the hull(s), which by looking at opencv documentation I thought it would be like this:

cv::Vec4i defects;  
convexityDefects(cv::Mat(contours),  hull, defects);

这样做我得到这个错误:

Doing this I get this error:

OpenCV Error: Assertion failed (ptnum > 3) in convexityDefects, file ./opencv/opencv/modules/imgproc/src/contours.cpp, line 1969

关于使用凸性缺陷时我做错了什么的任何想法?

Any ideas on what I'm doing wrong when using convexityDefects?

Opencv 凸性缺陷文档

提前致谢.

更新

感谢 Innuendo 的回答,我将主循环代码更新为:

Thanks to Innuendo answer I updated the main loop code to:

std::vector<Vec4i> defects; 
vector<cv::vector<cv::Point> >hull( contours.size() );

for (int i = 0; i < contours.size(); i++)
{  
    convexHull( contours[i], hull[i], false );
    convexityDefects(contours[i], hull[i], defects[i]);
}

使用这个,我现在得到的错误是:

Using this, the error that I now get is:

OpenCV Error: Assertion failed (hull.checkVector(1, CV_32S) > 2) in convexityDefects

推荐答案

来自 openCV wiki :

From openCV wiki :

找出轮廓的凸面缺陷.

所以你应该把它包含在你的循环中.

So you should include it in your loop.

std::vector<Vec4i> defects; 
vector<cv::vector<int> >hull( contours.size() );

for (int i = 0; i < contours.size(); i++)
{  
    convexHull( contours[i], hull[i], false );
    convexityDefects(contours[i], hull[i], defects[i]);
}

另外,正如你所提到的,在维基中是这样说的:

Also, as you mentioned, in wiki is said:

hull – 输出凸包.它是索引的整数向量或点向量.在第一种情况下,船体元素是基于 0 的原始数组中凸包点的索引(因为集合的凸包点是原始点集的子集).在里面第二种情况,包元素是凸包点本身.

hull – Output convex hull. It is either an integer vector of indices or vector of points. In the first case, the hull elements are 0-based indices of the convex hull points in the original array (since the set of convex hull points is a subset of the original point set). In the second case, hull elements are the convex hull points themselves.

这篇关于在 C++ 中使用 OpenCV 2.4 计算凸性缺陷的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆