OpenCV中的凸包
凸包是指给定一个二维平面上的点集,凸包就是将这个点集最外层的点连接起来构成的凸多边形。
上一节的找到图像的边界点的坐标信息,在此基础之上,进行凸包操作。
具体流程:
找到图像的轮廓边界坐标信息,存储在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);
}