在 C++ 中使用 OpenCV 2.4 计算凸性缺陷 [英] Calculating convexityDefects using OpenCV 2.4 in c++
问题描述
我使用 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?
提前致谢.
更新
感谢 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屋!