OpenCV中的凸包

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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值