生活随笔
收集整理的這篇文章主要介紹了
OpenCV中图像轮廓检测
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OpenCV中圖像輪廓檢測
通過之前的Canny方法可以得到圖像的邊界,但是我們無法得到邊界的數學信息。所以就有了今天的圖像輪廓檢測。
在OpenCV中圖像輪廓檢測的API:
findContours(輸入圖像,單通道
8位閾值化圖像,也就是對應canny之后的圖像。輸出點集,格式為Vector
<vector
<Point
>> contours,每個向量包含多個向量,包含的向量就是一條輪廓,而包含的向量是由一個個點構成。輸出向量的拓撲信息,形式為Vector
<Vec4i
>h,h
[0]為前一個輪廓編號,h
[1]為后一個輪廓編號,h
[2]父輪廓編號,h
[3]內嵌輪廓編號輪廓的檢索模式,輪廓的近似方法可選偏移量,
Point(0,
0)
);
輪廓檢索模式:RETR_EXTERNAL只檢測外圍輪廓、RETR_LIST提取所有輪廓只有兄弟等級關系、RETR_CCOMP提取所有輪廓建立雙層結構、 RETR_TREE提取所有輪廓,建立網狀結構
輪廓的近似方法:CHAIN_APPROX_NONE獲取輪廓的每一個像素;
CHAIN_APPROX_SIMPLE壓縮水平垂直對角線的元素,只保留該方向的終點坐標;
#include "opencv2/opencv.hpp"using namespace std
;
using namespace cv
;Mat src
,src_gray
;
int thresh
= 100;void callback(int,void*);int main()
{src
= imread("/home/dynamicw/Project/C++_Project/opencvtest/src/lesson01/source/map.png");cvtColor(src
,src_gray
,CV_BGR2GRAY
);blur(src_gray
,src_gray
,Size(3,3));namedWindow("Source",CV_WINDOW_AUTOSIZE
);createTrackbar("Canny thresh:","Source",&thresh
,255,callback
);callback(0,0);waitKey(0);return 0;
}void callback(int,void*)
{Mat canny_out
;Canny(src_gray
,canny_out
,thresh
,thresh
*2,3);vector
<vector
<Point
>> contours
;vector
<Vec4i
> hierarchy
;findContours(canny_out
,contours
,hierarchy
,CV_RETR_TREE
,CV_CHAIN_APPROX_SIMPLE
,Point(0,0));Mat drawing
= Mat
::zeros(canny_out
.size(),CV_8UC3
);for(int i
= 0;i
< contours
.size();i
++){for(int j
= 1;j
< contours
[i
].size();j
++){line(drawing
,contours
[i
][j
-1],contours
[i
][j
],Scalar(0,255,0),2,8);}}imshow("hands",drawing
);for(int i
= 0;i
< contours
.size();i
++){drawContours(drawing
,contours
,i
,Scalar(0,0,255),2,8,hierarchy
,0,Point());}imshow("api",drawing
);}
在結果中,中可以看到有hads和api,通過findcontours函數找到對應的輪廓點信息后,可以使用OpenCV提供的API函數將輪廓繪制出來,也可以使用line根據找到的點集將所有的數據繪制出來。
總結
以上是生活随笔為你收集整理的OpenCV中图像轮廓检测的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。