一、OpenCV中的多邊形輪廓
在OpenCV中,多邊形輪廓是指由一組點連接而成的多邊形邊緣線。這些點是通過輪廓檢測演算法找出來的,比如findContours等。輪廓是在二值圖像中檢測出來的,因此在使用輪廓之前,需要先得到二值圖像。在得到了輪廓點集之後,可以使用polylines函數將輪廓畫出來。
二、使用polylines畫出多邊形輪廓
在OpenCV中,polylines函數用於繪製由一組點連接而成的多邊形。它的函數原型為:
void polylines(InputOutputArray img, InputArrayOfArrays pts, bool isClosed, const Scalar& color, int thickness=1, int lineType=LINE_8, int shift=0);
該函數接受3個必選參數:
- img: 用於繪製的圖像
- pts: 多邊形輪廓點的容器,其中每個元素都是表示多邊形某一部分的點集,通常是一個vector類型。
- isClosed: 多邊形是否閉合(布爾類型)
接下來是一些可選參數:
- color: 多邊形輪廓的顏色
- thickness: 多邊形輪廓線寬
- lineType: 多邊形輪廓線型
- shift: 定點坐標小數位數
示例代碼如下:
//讀入圖像和處理後的二值圖像 Mat image = imread("example.jpg"); Mat gray, binary; cvtColor(image, gray, COLOR_BGR2GRAY); //灰度化 threshold(gray, binary, 0, 255, THRESH_BINARY); //二值化 //尋找輪廓並繪製 vector< vector > contour; //定義輪廓點集 findContours(binary, contour, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); //尋找輪廓 Mat result; cvtColor(binary, result, COLOR_GRAY2BGR); //轉換為3通道圖像 polylines(result, contour, true, Scalar(0,255,0), 1); //繪製多邊形輪廓 imshow("polylines", result); //顯示圖像 waitKey(0);
三、關於函數參數的詳解
在上面的代碼中,我們使用了findContours函數找到了多個輪廓點集,然後使用polylines函數一次性將所有輪廓繪製出來。但是在實際應用中,也會有隻想繪製其中的一個輪廓的情況。這時候需要對函數參數進行一定的修改。
首先,pts參數需要傳入指向要繪製的輪廓點集的指針或引用。對於只想繪製其中一個輪廓的情況,可以使用如下代碼:
vector contour = contours[0]; //指向第1個輪廓點集 polylines(image, &contour, true, Scalar(0,255,0), 1);
注意,將vector傳給InputArrayOfArrays類型的參數時,需要使用&符號取地址。這是因為進一步封裝時,vector是一個Object_類型,其數組的指針存儲在Object_類的指針中。
其次,color參數需要傳入Scalar類型的值,表示輪廓的顏色。Scalar有4個構造函數,分別是無參、單參、雙參和四參,具體如下:
Scalar s1; //Scalar(0, 0, 0, 0) Scalar s2(val); //Scalar(val, val, val, val) Scalar s3(val1, val2);//Scalar(val1, val2, 0, 0) Scalar s4(val1, val2, val3, val4);//Scalar(val1, val2, val3, val4)
如有需要,可以根據實際情況傳不同的參數。
四、更多常見用法
在OpenCV中,polylines函數使用非常廣泛,下面是一些常見的用法:
1. 繪製多線段輪廓
當設置isClosed=false時,polylines函數可以繪製多個不相連的線段。示例代碼如下:
vector pts1(3); pts1[0] = Point(100,100); pts1[1] = Point(200,200); pts1[2] = Point(300,100); vector pts2(3); pts2[0] = Point(100,200); pts2[1] = Point(200,300); pts2[2] = Point(300,200); vector<vector> pts(2); pts[0] = pts1; pts[1] = pts2; polylines(result, pts, false, Scalar(0,0,255), 2);
執行該代碼後,會在圖像中繪製出由多個線段組成的圖形。如下圖所示:
2. 連接末尾和起始點的輪廓
當設置isClosed=true時,polylines函數可以繪製一個封閉的多邊形輪廓。示例代碼如下:
Point pts1[3]; pts1[0] = Point(100,100); pts1[1] = Point(200,200); pts1[2] = Point(300,100); Point pts2[3]; pts2[0] = Point(100,200); pts2[1] = Point(200,300); pts2[2] = Point(300,200); Point* pts[] = {pts1, pts2}; const int npts[] = {3, 3}; polylines(result, pts, npts, 2, true, Scalar(0,0,255), 2);
執行該代碼後,會在圖像中繪製出由兩個多邊形(三角形)組成的圖形。如下圖所示:
五、總結
本文主要講述了如何使用OpenCV polylines函數繪製多邊形輪廓。我們介紹了polylines的函數原型,以及傳入參數的具體含義。除此之外,我們還針對常見用法進行了講解,如繪製多線段輪廓、連接末尾和起始點的輪廓等。通過本文的學習,讀者可以更加深入地了解OpenCV中的多邊形輪廓的相關知識。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/291967.html