生活随笔
收集整理的這篇文章主要介紹了
OpenCV中的凸包
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
OpenCV中的凸包
凸包是指給定一個二維平面上的點集,凸包就是將這個點集最外層的點連接起來構(gòu)成的凸多邊形。
上一節(jié)的找到圖像的邊界點的坐標(biāo)信息,在此基礎(chǔ)之上,進(jìn)行凸包操作。
具體流程:
找到圖像的輪廓邊界坐標(biāo)信息,存儲在vector<vector> contours中,則每一個contours[i]代表了一條邊際,即是一系列點的集合,然后,我們利用凸包的定義,在這個點集上找到凸包,遍歷contours得到所有的凸包,也存儲在vector<vector>類型中。
最后根據(jù)得到的凸包信息,將凸多邊形繪制在圖像之上,可以使用line函數(shù)自己每條線都自己繪制,也可以使用提供的API繪制:
convexHull(Mat(求凸包的點集contours
[i
]),存儲凸包的vector
<vector
<Point
>>[i
],bool 操作方向符,為
true時,起始點到結(jié)束點順勢針,
bool 返回點類型,當(dāng)輸出vector
<Point
>時,這個參數(shù)被忽略。
);
#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
);
}
總結(jié)
以上是生活随笔為你收集整理的OpenCV中的凸包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。