凸包是指给定一个二维平面上的点集,凸包就是将这个点集最外层的点连接起来构成的凸多边形。 上一节的找到图像的边界点的坐标信息,在此基础之上,进行凸包操作。 具体流程: 找到图像的轮廓边界坐标信息,存储在vector<vector> contours中,则每一个contours[i]代表了一条边际,即是一系列点的集合,然后,我们利用凸包的定义,在这个点集上找到凸包,遍历contours得到所有的凸包,也存储在vector<vector>类型中。 最后根据得到的凸包信息,将凸多边形绘制在图像之上,可以使用line函数自己每条线都自己绘制,也可以使用提供的API绘制:
convexHull( Mat(求凸包的点集contours[i]), 存储凸包的vector<vector<Point>>[i], bool 操作方向符,为true时,起始点到结束点顺势针, bool 返回点类型,当输出vector<Point>时,这个参数被忽略。 ); #include "opencv2/opencv.hpp" #include <vector> using namespace std; using namespace cv; Mat src,dst,src_gray; int thresvalue = 100; void dis(int,void*); int main(int argc, char *argv[]) { src = imread("/home/dynamicw/Project/C++_Project/opencvtest/src/lesson01/source/map.png"); imshow("src",src); cvtColor(src,src_gray,CV_BGR2GRAY); imshow("src_gray",src_gray); blur(src_gray,src,Size(3,3)); namedWindow("test",CV_WINDOW_AUTOSIZE); createTrackbar("value","test",&thresvalue,255,dis); dis(0,0); waitKey(0); return 0; } void dis(int,void*) { Canny(src,dst,thresvalue,thresvalue*2,3); vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(dst,contours,hierarchy,CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE,Point(0,0)); vector<vector<Point>> hull(contours.size()); for(int i = 0;i < contours.size();i++) { cout << contours[i] << endl; convexHull(Mat(contours[i]),hull[i],false); } Mat drawing = Mat::zeros(dst.size(),CV_8UC3); for(int i = 0;i < contours.size();i++) { drawContours(drawing,contours,i,Scalar(0,0,255),1,8,vector<Vec4i>(),0,Point()); drawContours(drawing,hull,i,Scalar(0,255,0),1,8,vector<Vec4i>(),0,Point()); } imshow("drawing",drawing); }