使用OpenCV polylines畫出多邊形輪廓

一、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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-25 14:07
下一篇 2024-12-25 14:07

相關推薦

  • 如何在PyCharm中安裝OpenCV?

    本文將從以下幾個方面詳細介紹如何在PyCharm中安裝OpenCV。 一、安裝Python 在安裝OpenCV之前,請確保已經安裝了Python。 如果您還沒有安裝Python,可…

    編程 2025-04-29
  • Python OpenCV 直線檢測

    本文將介紹在Python OpenCV中進行直線檢測的方法,主要涉及到圖像的邊緣檢測、霍夫變換和繪製直線等操作。 一、邊緣檢測 由於直線檢測是從圖像的邊緣開始的,因此必須先找到圖像…

    編程 2025-04-29
  • Python 初學者:如何使用Python畫出可愛的小動物

    Python是一種功能強大的編程語言,可以幫助您開發各種有趣的應用程序,包括圖像處理、遊戲設計、機器學習等。在這篇文章中,我們將向初學者介紹如何使用Python畫出可愛的小動物。我…

    編程 2025-04-29
  • 如何用簡筆畫畫出小豬佩奇全家福

    要想畫出小豬佩奇全家福,我們可以按照以下步驟進行。 一、畫出小豬佩奇 首先,我們需要畫出小豬佩奇的臉。可以用一個圓形來表示小豬佩奇的頭部,然後再在頭部上畫上兩個小耳朵,耳朵的形狀和…

    編程 2025-04-28
  • Opencv 實現讀取 BMP 圖片

    Opencv 是一個基於 C/C++ 語言的開源計算機視覺庫,可以用於圖像處理、特徵識別、目標跟蹤、機器學習等領域。在圖像處理中,讀取 BMP 圖片是常見操作之一。 一、打開 BM…

    編程 2025-04-27
  • opencv滑鼠繪圖

    本文將為您詳細介紹如何使用opencv在原始圖片上進行滑鼠繪圖。 一、準備工作 在開始繪製之前,您需要先準備好以下的工作: 1、安裝opencv庫,可以通過pip install …

    編程 2025-04-27
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • OpenCV的全面介紹

    OpenCV是一款強大的開源計算機視覺庫,它包含了各種用於圖像和視頻處理,圖像識別和機器學習的函數,它可以用於開發實時的計算機視覺軟體和系統,特別適用於圖像處理、物體識別、人臉識別…

    編程 2025-04-25
  • Opencv CUDA編譯用法介紹

    本文將從多個方面對Opencv CUDA編譯進行詳細的闡述和解讀。通過以下小標題,我們將詳細介紹如何進行編譯。 一、環境搭建 在使用CUDA進行加速之前,需要進行CUDA的環境搭建…

    編程 2025-04-25
  • 詳解OpenCV高斯濾波

    一、高斯濾波的介紹 OpenCV高斯濾波是一種平滑圖像的處理方法,通常用於去除雜訊、模糊化圖像等。它的原理是利用高斯函數進行加權平均,從而減少雜訊的干擾。 在圖像處理中,雜訊是一種…

    編程 2025-04-25

發表回復

登錄後才能評論