作者:翟天保Steven 版權(quán)聲明:著作權(quán)歸作者所有,商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處
函數(shù)原型
void findContours( InputArray image, OutputArrayOfArrays contours,
OutputArray hierarchy, int mode,
int method, Point offset = Point());
void drawContours( InputOutputArray image, InputArrayOfArrays contours,
int contourIdx, const Scalar& color,
int thickness = 1, int lineType = LINE_8,
InputArray hierarchy = noArray(),
int maxLevel = INT_MAX, Point offset = Point() );
參數(shù)說明
? ? ? ?findContours:
- InputArray類型的image,輸入圖像,需是8位單通道圖像,。非零像素視為1,0像素為0,二進(jìn)制表示,。
- OutputArrayOfArrays類型的contours,檢測到的輪廓結(jié)果存放在此,每個(gè)輪廓存儲為一個(gè)點(diǎn)向量,用point類型的vetor表示,。
- OutputArray類型的hierarchy,可選的輸出向量,包含圖像的拓?fù)湫畔?。其作為輪廓?shù)量的表示,包括多個(gè)元素,。每個(gè)輪廓contours[i]有4個(gè)hierarchy元素——hierarchy[i][0]~hierarchy[i][3],分別表示后一個(gè)輪廓,、前一個(gè)輪廓、父輪廓,、內(nèi)嵌輪廓的索引編號,如果沒有對應(yīng)項(xiàng),對應(yīng)值設(shè)為負(fù)數(shù),。
- int類型的mode,輪廓檢索模式。RETR_EXTERNAL表示只檢測最外圍輪廓;RETR_LIST表示提取所有輪廓并放置在list中,無等級關(guān)系;RETR_CCOMP表示提取所有輪廓,并將其組織為雙層結(jié)構(gòu);RETR_TREE表示提取所有輪廓,并重新建立網(wǎng)狀的輪廓結(jié)構(gòu),。
- int類型的method,輪廓近似方法。CHAIN_APPROX_NONE表示獲取每個(gè)輪廓的每個(gè)像素;CHAIN_APPROX_SIMPLE表示壓縮水平方向,、垂直方向,、對角方向的元素,只保留該方向的終點(diǎn)坐標(biāo);CHAIN_APPROX_TC89_L1和CHAIN_APPROX_TC89——KCOS表示Teh-Chinl鏈逼近算法。
- Point類型的offset,每個(gè)輪廓點(diǎn)的可選偏移量,。
? ? ? ?drawContours:
- InputArray類型的image,輸入圖像,。
- OutputArrayOfArrays類型的contours,檢測到的輪廓結(jié)果存放在此,每個(gè)輪廓存儲為一個(gè)點(diǎn)向量,用point類型的vetor表示。
- int類型的contourIdx,輪廓繪制的指示變量,。如果其為負(fù)值,則繪制所有輪廓,。
- const Scalar&類型的color,輪廓的顏色。
- int類型的thickness,輪廓線條的粗細(xì)度,有默認(rèn)值1,。如果其為負(fù)值,則會繪制在輪廓的內(nèi)部,。可選為FILLED,。
- int類型的lineType,線條的類型,默認(rèn)值為8,。可取8(8連通線型),、4,、LINE_AA(抗鋸齒線型)。
- InputArray類型的hierarchy,可選的層次結(jié)構(gòu)信息,。
- int類型的maxLevel,表示用于繪制輪廓的最大等級,默認(rèn)為INT_MAX,。
- Point類型的offset,可選的輪廓偏移參數(shù)。
測試代碼
#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<ctime>
using namespace std;
using namespace cv;
int main(void)
{
// 輸入測試圖片
Mat in = imread("tangsan.jpg", 0);
imshow("original", in);
// 初始化結(jié)果矩陣
Mat out = Mat::zeros(in.size(), in.type());
Mat temp= Mat::zeros(in.size(), in.type());
// 閾值計(jì)算,最大類間方差法
threshold(in, temp, 0, 255, cv::THRESH_OTSU);
imshow("thresh", temp);
// 尋找輪廓
vector<vector<Point>> contour;
vector<Vec4i> hierarchy;
// RETR_TREE以網(wǎng)狀結(jié)構(gòu)提取所有輪廓,CHAIN_APPROX_NONE獲取輪廓的每個(gè)像素
findContours(temp, contour, hierarchy, RETR_TREE, CHAIN_APPROX_NONE);
// 隨機(jī)選擇一個(gè)顏色,并繪制輪廓
Scalar color( rand() % 255, rand() % 255, rand() % 255);
drawContours(out, contour, -1,color, FILLED, 8, hierarchy);
imshow("result", out);
waitKey(0);
system("pause");
return 0;
}
測試效果
? ? ? ?不難看出,輪廓結(jié)果圖中間少了些東西,這是因?yàn)樘崛≥喞x用的是最外圈提取法,外圈輪廓的內(nèi)嵌輪廓都被清除了~
? ? ? ?如果文章幫助到你了,可以點(diǎn)個(gè)贊讓我知道,我會很快樂~加油!
|