1.凸包检测介绍
凸包检测是计算凸包的一种技术,凸包就是:给定二维平面上的点集,将最外层的点连接起来构成的凸边形,它是包含点集中所有的点。
2.凸包检测函数convexHull()
void cv::convexHull ( InputArray points,
OutputArray hull,
boolclockwise = false,
bool returnPoints = true
)
- points:输入的2D点集
- hull:输出凸包的顶点
- clockwise: 方向标志,当参数为true时,凸包顺序为顺时针方向,否则为逆时针方向。returnPoints:输出数据的类型标志,当参数为true时第二个参数输出的结果是凸包顶点的坐标,否则第二个参数输出的结果是凸包顶点的索引。
3.示例代码:
//凸包检测 void Convex_hull_detection(Mat image){ Mat gray,binary; cvtColor(image,gray,COLOR_BGR2GRAY);//灰度化 threshold(gray,binary,40,255,THRESH_BINARY);//自适应二值化 //开运算消除细小区域 Mat k= getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1)); morphologyEx(binary,binary,MORPH_OPEN,k); //轮廓的发现与绘制 vector<vector<Point>> contours;//轮廓 vector<Vec4i> hierarchy;//存放轮廓结构变量 findContours(binary,contours,hierarchy,0,2,Point()); for(int n=0;n<contours.size();n++){ //计算凸包 vector<Point> hull; convexHull(contours[n],hull); //绘制凸包 for(int i=0;i<hull.size();i++){ //绘制凸包顶点 circle(image,hull[i],4,Scalar(255,0,0,255),2,8,0); //连接凸包 if(i==hull.size()-1){ line(image,hull[i],hull[0],Scalar(0,0,255,255),2,8,0); break; } line(image,hull[i],hull[i-1],Scalar(0,0,255,255),2,8,0); } } imwrite("/sdcard/DCIM/hull.png",image); }
凸包检测的结果: