я уже прочитал посты Вот а также Вот но они не решают ошибку, которую я получаю.
Мой код
vector<Vec4i> defects;
vector<vector<int> >hull( contours.size() );
for (int i = 0; i < contours.size(); i++)
{
convexHull( contours[i], hull[i], false, false );
if(contours[i].size() > 3 )
convexityDefects(contours[i], hull[i], defects[i]);
}
Согласно сообщениям выше, это должно работать, но это не так. Я все еще получаю ошибку
error: (-215) hull.checkVector(1, CV_32S) > 2 in function convexityDefects
Я действительно не вижу проблемы здесь.
Хорошо, проблема была в основном потому, что по какой-то странной причине у меня были настолько маленькие контуры, что корпус был просто прямой линией (то есть состоящей только из 2 точек).
Таким образом, ошибка была связана с размером вектора корпуса, отличным от других постов, где, казалось, что-то было связано с типом вектора.
Итак, просто заменив
if(contours[i].size() > 3 )
с
if(hulls[i].size() > 2 )
работает отлично.
Как сообщается на OpenCV ссылки:
ConvexityDefects(contour, convexhull, storage) → convexity_defects
Finds the convexity defects of a contour.
Parameters:
contour (CvArr or CvSeq) – Input contour
convexhull (CvSeq) – Convex hull obtained using ConvexHull2 that should contain pointers or indices to the contour points, not the hull points themselves (the return_points parameter in ConvexHull2 should be 0)
storage (CvMemStorage) – Container for the output sequence of convexity defects. If it is NULL, the contour or hull (in that order) storage is used
В частности, взгляните на второй параметр: вы уверены, что получается с помощью ConvexHull2?