您好,登錄后才能下訂單哦!
輪廓:一個輪廓代表一系列的點(像素),這一系列的點構成一個有序的點集,所以可以把一個輪廓理解為一個有序的點集。
在opencv中,提供了一個函數返回一個有序的點集或者有序的點集的集合(指多個有序的點集),函數findContour是從二值圖像中來計算輪廓的,一般使用Canny()函數處理后的圖像,因為這樣的圖像含有邊緣像素。
尋找輪廓的API函數:
findContours(image,vector<vector<Point>> contours,vector<Vec4i>hierarchy,int mode,int method,Point offset = Point(0,0));
參數解釋:
(1)image:單通道圖像矩陣,一般是經過canny處理后的二值圖像;
(2)contours:vector<vector<Point>>類型,是一個向量,并且是一個雙重向量,向量內每個元素保存了一組由連續的Point點構成的點的集合的向量,每一組Point點集就是一個輪廓。有多少輪廓,向量contours就有多少元素;
(3)hierarchy:vector<Vec4i> 類型, 即容器內每一個元素都是一個包含了4個int型變量的向量,向量內每個元素保存了一個包含4個int整型的數組。向量hiararchy內的元素和輪廓向量contours內的元素是一一對應的,向量的容量相同。hierarchy向量內每一個元素的4個int型變量——hierarchy[i][0] ~hierarchy[i][3],分別表示第i個輪廓的后一個輪廓、前一個輪廓、父輪廓、內嵌輪廓的索引編號。如果當前輪廓沒有對應的后一個輪廓、前一個輪廓、父輪廓或內嵌輪廓的話,則hierarchy[i][0] ~hierarchy[i][3]的相應位被設置為默認值-1;
(4)mode:int類型的,定義輪廓的檢索模式:
(5)method:int類型,定義輪廓的近似方法:
(6) Point:偏移量,所有的輪廓信息相對于原始圖像對應點的偏移量,相當于在每一個檢測出的輪廓點上加上該偏移量,一般不偏移取Point(0,0)。
畫輪廓的API函數:
drawContours(Outputimage,contours,hierarchy,int contourIdx,color,int thickness ,int lineType,hierarchy = noArray(),int maxLevel = INT_MAX,Point offset = Point(0,0))
參數解釋:
(1)outputimage: 將輪廓畫在該圖上;
(2)contours:前面尋找到的輪廓;
(3)contourIdx:是一個索引,代表繪制contours中的第幾個輪廓;
(4) color:顏色;
(5)thickness: 線寬;
(6)lineType: 線型;
(7)hierarchy:可選層次信息結構,這里面是findContours所的到的基于Contours的層級信息;
(8)maxLevel: 繪制輪廓的最大等級。如果等級為0,繪制單獨的輪廓。如果為1,繪制輪廓及在其后的相同的級別下輪廓。如果等級為2,繪制所有同級輪廓及所有低一級輪廓,諸此種種。如果值為負數,函數不繪制同級輪廓,但會升序繪制直到級別為abs(max_level)-1的子輪廓;
(9)offset:照給出的偏移量移動每一個輪廓點坐標.當輪廓是從某些感興趣區域(ROI)中提取的然后需要在運算中考慮ROI偏移量時,將會用到這個參數。
以上定義摘自該篇博客:OpenCV實現輪廓的發現。
#include<opencv2/opencv.hpp> using namespace cv; using namespace std; int value = 50; Mat src, dst, canny_img; void callback(int, void*); int main(int arc, char** argv) { src = imread("2.jpg"); namedWindow("src",CV_WINDOW_AUTOSIZE); imshow("src", src); cvtColor(src, src, CV_BGR2GRAY); namedWindow("output", CV_WINDOW_AUTOSIZE); createTrackbar("threshold", "output", &value, 255, callback); callback(0, 0); waitKey(0); return 0; } void callback(int, void*) { Canny(src, canny_img, value, 2 * value); imshow("canny", canny_img); vector<vector<Point>>contours; vector<Vec4i>hierarchy; findContours(canny_img, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE,Point(0,0)); dst = Mat::zeros(src.size(), CV_8UC3); RNG rng(1); for (int i = 0; i < contours.size(); i++) { Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); drawContours(dst, contours, i, color, 2, 8, hierarchy, 0, Point(0, 0)); } imshow("output", dst); }
運行結果如下:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。