1. 程式人生 > >查詢輪廓並繪製

查詢輪廓並繪製

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入門程式設計 毛星)