对于任意contour都能接受代码(仅限于图片)。
1.首先,若要使用convexityDefects 则必须声明 contour_hull的形式为
vector<int> contour_hull(contour.size());
否则会报错,这点必须注意。
2.其次,一个可能的愚蠢问题来自 contour的size是不够的。
contour.size() > 3
这个就是说,不够四个点,没有凸包,原理很好理解。但也是大家最容易犯的错误。切记。
这条报错基本处在isContourConvex这个函数上。
编程中最主要的还是要关注具体问题的逻辑,不光是代码没问题。
编译能通过,只是说代码基础逻辑没问题,但业务逻辑未必符合。
下面是代码。
int ConvexHullTest(vector<Point> contour)
{
vector<int> contour_hull(contour.size());
Mat contour_image(contour_hull);
if (contour.size() > 3)
cv::convexHull(Mat(contour), contour_hull, false);
else
return 0;
vector<Vec4i> defects(contour.size());
if (!isContourConvex(contour) && contour_hull.size() > 3) {
//cout<<"轮廓不是凸包"<<endl;
convexityDefects(
contour,
Mat(contour_hull),
defects
);
return defects.size();
}
else
return 0;
//contour_hull.swap(contour_hull);
//defects.swap(defects);
}