【從零學習OpenCV 4】繪製幾何圖形

  • 2019 年 12 月 13 日
  • 筆記

經過幾個月的努力,小白終於完成了市面上第一本OpenCV 4入門書籍《從零學習OpenCV 4》。為了更讓小夥伴更早的了解最新版的OpenCV 4,小白與出版社溝通,提前在公眾號上連載部分內容,請持續關注小白。

1

01

繪製圓形

圓形是我們在平時中最常使用的圖形之一,OpenCV 4中提供了circle()函數用於繪製圓型,其函數的函數原型在代碼清單3-40中給出。

代碼清單3-40 circle()函數原型  1.  void cv::circle(InputOutputArray img,  2.                     Point center,  3.                     int  radius,  4.                     const Scalar & color,  5.                     int  thickness = 1,  6.                     int  lineType = LINE_8,  7.                     int  shift = 0  8.                     )
  • img:需要繪製圓形的圖像
  • center:圓形的圓心位置坐標。
  • radius:圓形的半徑長度,單位為像素。
  • color:圓形的顏色。
  • thickness:輪廓的寬度,如果數值為負,則繪製一個實心圓。
  • lineType:邊界的類型,可取值為FILLED ,LINE_4 ,LINE_8 和LINE_AA
  • shift:中心坐標和半徑數值中的小數位數。

該函數用於在一張圖像中繪製圓形的圖案,輸入的參數分別是圓形的圓形位置、半徑長度以及邊界線的寬度和線型。對於該函數的使用我們將在本節最後的代碼清單3-47中一起給出。

1

02

繪製直線

接下來介紹如何在圖像中繪製直線。OpenCV 4中提供了line()函數用於繪製直線,其函數原型在代碼清單3-41中給出。

代碼清單3-41 line()函數原型  1.  void cv::line(InputOutputArray img,  2.                   Point pt1,  3.                   Point pt2,  4.                   const Scalar & color,  5.                   int  thickness = 1,  6.                   int  lineType = LINE_8,  7.                   int  shift = 0  8.                   )
  • pt1:直線起始點在圖像中的坐標。
  • pt2:直線終點在圖像中的坐標。
  • color:圓形的顏色,用三通道表示。

該函數利用兩點確定一條直線的方式在圖像中畫出一條直線,函數中的很多參數的含義都與circle()函數一致,這裡就不在贅述。對於該函數的使用我們將在本節最後的代碼清單3-47中一起給出。

1

013

繪製橢圓

在OpenCV 4中提供了ellipse()函數用於繪製橢圓,其函數原型在代碼清單3-42中所示。

代碼清單3-42 ellipse()函數原型  1.  void cv::ellipse(InputOutputArray img,  2.                       Point center,  3.                       Size axes,  4.                       double  angle,  5.                       double  startAngle,  6.                       double  endAngle,  7.                       const Scalar & color,  8.                       int  thickness = 1,  9.                       int  lineType = LINE_8,  10.                       int  shift = 0  11.                       )
  • center:橢圓的中心坐標。
  • axes:橢圓主軸大小的一半。
  • angle:橢圓旋轉的角度,單位為度。
  • startAngle:橢圓弧起始的角度,單位為度。
  • endAngle:橢圓弧終止的角度,單位為度

該函數中的很多參數的含義都與circle()函數一致,這裡就不在贅述。函數通過選定橢圓中心位置和主軸的大小唯一確定一個橢圓,並且可以控制旋轉角度改變橢圓在坐標系中的位置。通過橢圓弧起始和終止角度,可以繪製完整的橢圓或者一部分橢圓弧。與circle()函數一致,當邊界線的厚度值為負數的時候,將繪製一個實心的橢圓。

在OpenCV 4中還提供了另外一個函數ellipse2Poly()用於輸出橢圓的邊界的像素坐標,但是不會在圖像中繪製橢圓,其函數原型在代碼清單3-43中給出。

代碼清單3-43 ellipse2Poly()函數原型  1.  void cv::ellipse2Poly(Point center,  2.                             Size axes,  3.                             int   angle,  4.                             int  arcStart,  5.                             int   arcEnd,  6.                             int   delta,  7.                             std::vector< Point > & pts  8.                             )
  • delta:後續折線頂點之間的角度,它定義了近似精度。
  • pts:橢圓邊緣像素坐標向量集合。

該函數與繪製橢圓需要輸入的參數一致,只是不將橢圓輸出到圖像中,而是通過vector向量將橢圓邊緣的坐標點存儲起來,便於後續的再處理。對於繪製橢圓相關函數的使用我們將在本節最後的代碼清單3-47中一起給出。

1

04

繪製多邊形

在幾何中多邊形也是一個重要的成員,而多邊形中矩形又是一個比較特殊的類型,因此OpenCV 4中除了提供繪製多邊形的函數fillPoly()外,也提供了繪製矩形的函數rectangle()。我們先介紹矩形的繪製,之後再介紹多邊形的繪製。在代碼清單3-44中給出了rectangle()函數的函數原型。

代碼清單3-44 rectangle()函數原型  1.  void cv::rectangle(InputOutputArray img,  2.                         Point pt1,  3.                         Point pt2,  4.                         const Scalar & color,  5.                         int  thickness = 1,  6.                         int  lineType = LINE_8,  7.                         int  shift = 0  8.                         )  9.  10.  void cv::rectangle(InputOutputArray img,  11.                         Rect rec,  12.                         const Scalar & color,  13.                         int  thickness = 1,  14.                         int  lineType = LINE_8,  15.                         int  shift = 0  16.                         )
  • pt1:矩形的一個頂點
  • pt2:矩形中與pt1相對的頂點,即兩個點在對角線上。
  • rec:矩形左上角定點和長寬。

函數中與前文參數含義一致的參數不再重複介紹。在OpenCV 4中定義了兩種函數原型,分別利用矩形對角線上的兩個頂點的坐標或者利用左上角頂點坐標和矩形的長和寬唯一確定一個矩形。在繪製矩形時,同樣可以控制邊緣線的寬度繪製一個實心的矩形。

這裡我們詳細介紹Rect變量,該變量在OpenCV 4中表示矩形的含義,與Point、Vec3b等類型相同,都是在圖像處理中常用的類型。Rect表示的是一個矩形的左上角和矩形的長和寬,該類型定義的格式為Rect(像素的x坐標,像素的y坐標,矩形的寬,矩形的高),其中可以存放的數據類型也分別為int型(Rect2i或者Rect)、double類型(Rect2d)和float類型(Rect2f)。

接下來介紹多邊形繪製函數fillPoly()的使用方法,其函數原型在代碼清單3-45中給出。

代碼清單3-45 fillPoly()函數原型  1.  void cv::fillPoly(InputOutputArray img,  2.                        const Point ** pts,  3.                        const int * npts,  4.                        int   ncontours,  5.                        const Scalar & color,  6.                        int  lineType = LINE_8,  7.                        int   shift = 0,  8.                        Point offset = Point()  9.                        )
  • pts:多邊形頂點數組,可以存放多個多邊形的頂點坐標的數組。
  • npts:每個多邊形頂點數組中頂點個數。
  • ncontours:繪製多邊形的個數。
  • offset:所有頂點的可選偏移。

該函數中與前文含義相同的參數不再重複介紹。函數通過依次連接多邊形的頂點來實現多邊形的繪製,多邊形的頂點需要按照順時針或者逆時針的順序依次給出,通過控制邊界線寬度可以實現是否繪製實心的多邊形。需要說明的是pts參數是一個數組,數組中存放的是每個多邊形頂點坐標數組,npts參數也是一個數組,用於存放pts數組中每個元素中頂點的個數。關於多邊形繪製的相關函數使用方法將在代碼清單3-47中給出,讀者一定要格外認真的體會使用方法。