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);}
凸包检测的结果: