查詢輪廓並繪製
1、查詢影象輪廓
void findContours(InputArray image,OutputArray contours,OutputArray hierarchy,int mode,int method,Point offset=Point())
引數一:八位單通道影象陣列
引數二:儲存函式運算後的結果
引數三:hierarchy[i][0]~hierarchy[i][3]分別表示後一個輪廓、前一個輪廓、父輪廓、內嵌輪廓的索引編號,如果沒有該選項則預設為-1
引數四:輪廓檢索模式
RETR_EXTERNAL:只檢測最外層輪廓,hierarchy[i][2]=hierarchy[i][3]=-1
RETR_LIST:提取所有輪廓,並且放在list中,輪廓間不建立 等級關係
RETR_CCMOP:提取所有輪廓,並且將其組織為雙層結構:頂層為連通域的外圍邊界,次層為孔的內層邊界
RETR_TREE:提取所有輪廓,並重新建立網狀輪廓結構
引數五:輪廓近似辦法
CHAIN_APPROX_NONE:獲取每隔輪廓的每隔畫素,相鄰的兩個畫素位置差不超過1
CHAIN_APPROX_SIMPLE:壓縮水平、垂直、對角元素,只保留該方向的終點座標
CHAIN_APPROX_TC89L1
CHAIN_APPROX_TC89L_KCOS:使用teh-chinl鏈逼近演算法中的一個
引數六:每隔輪廓點的可偏移量
2、繪製輪廓函式
void drawContours(InputArray dst,InputArray contours,int contourIdx,const Scalar &color,int thickness=1,int thicktype=8,InputArray hierarchy=noArray(),int maxLevel =INT_MAX,Point offset = Point() )
引數一:目標影象陣列(輸出)
引數二:所有輸入的輪廓,每隔輪廓儲存一個點的向量
引數三:輪廓繪製指示變數,如果為負值則繪製所有輪廓
引數四:輪廓線的顏色
引數五:線的大小,可選FILLED填充輪廓內部
引數六:線的型別4,8,LINE_AA
引數七:可選層次結構資訊
引數八:繪製輪廓的最大等級
引數九:輪廓的偏移量
pdf綜合程式碼:
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#define WINDOW_NAME1 "【原始視窗】"
#define WINDOW_NAME2 "【輪廓圖】"
using namespace std;
using namespace cv;
Mat g_srcImage,g_grayImage;
int g_thresh = 80;
int g_thresh_max = 255;
RNG g_rng(12345);
Mat g_cannyMat_output;
vector< vector<Point> > g_vContours;
vector<Vec4i> g_vHierarchy;
void on_Thresh_Change(int,void *);
int main(int argc,char * argv[])
{
if(argc!=2)
{
cout<<"input error"<<endl;
return -1;
}
g_srcImage = imread(argv[1]);
if(g_srcImage.empty())
{
cout<<"read photo fail"<<endl;
return -1;
}
cvtColor(g_srcImage,g_grayImage,COLOR_BGR2GRAY);
blur(g_grayImage,g_grayImage,Size(3,3));
namedWindow(WINDOW_NAME1,WINDOW_AUTOSIZE);
namedWindow(WINDOW_NAME2);
imshow(WINDOW_NAME1,g_srcImage);
createTrackbar("canny檢測",WINDOW_NAME2,&g_thresh,g_thresh_max,on_Thresh_Change);
on_Thresh_Change(0,0);
waitKey(0);
return 0;
}
void on_Thresh_Change(int,void *)
{
Canny(g_grayImage,g_cannyMat_output,g_thresh,g_thresh*2,3);
findContours(g_cannyMat_output,g_vContours,g_vHierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point(0,0)
);
Mat drawing = Mat::zeros(g_cannyMat_output.size(),CV_8UC3);
for(int i=0;i<g_vContours.size();i++)
{
Scalar color = Scalar(g_rng.uniform(0,255),g_rng.uniform(0,255),g_rng.uniform(0,255));
drawContours(drawing,g_vContours,i,color,2,8,g_vHierarchy,0,Point());
}
imshow(WINDOW_NAME2,drawing);
}
--------------(來自opencv3入門程式設計 毛星)