1. 程式人生 > 實用技巧 >Python OpenCV的繪圖功能簡介

Python OpenCV的繪圖功能簡介

前言

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理。

作者:大Z

在影象中我們經常需要用到將某個區域性特徵畫出來,比如物體檢測,物體追蹤等等,今天來看看有哪些好玩的繪圖工具吧!

▼畫線

首先要為畫的線創造出環境,就要生成一個空的黑底影象。我們使用numpy進行實驗:

import cv2
import numpy as np
img=np.zeros((512,512,3), np.uint8)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

這是黑色的底,我們的畫布,我把視窗名叫做img,np.zeros()有兩個引數,一個是建立的圖片矩陣大小,另一個是資料型別,512,512是畫素(第一個512畫素高,第二個是512畫素寬),3指BGR三種顏色,uint8是用0-255表示所有顏色。

我們看一下畫線函式的原型:

cv2.line(img,start,end,color,thickness)

函式例項:

cv2.line(img,(0,0),(511,511),(255,0,0),5)

這個函式有5個引數,分別為:img是影象名稱,(0,0)為起點座標,(511,511)為終點座標,(255,0,0)是藍色,5是線的寬度。

會畫一條從左上方到右下角的藍色線段,我們看實驗效果↓:

▼畫矩形

畫矩形函式將是十分重要的環節,在以後的實際操作專案中,我們基本上就會發現,OpenCV使用最多的繪圖函式,就是畫矩形函式,它使用範圍非常廣泛,包括畫輪廓,實時跟蹤目標時我們也是使用畫矩形函式對跟蹤的目標進行標註。接下來我們先了解一下矩形函式:

cv2.rectangle(img,(50,50),(400,400),(0,0,255),3)

這個函式有5個引數,img為影象名稱,(50,50)為左上頂點座標,(400,400)為右下頂點座標,(0,255,0)代表綠色,線寬為3。

畫矩形兩個要素:左上頂點和右下頂點座標。

我們來看一下程式碼:

import cv2
import numpy as np
img = np.zeros((512, 512, 3), np.uint8)
cv2.rectangle(img,(50,50),(400,400),(0,0,255),3)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

實驗效果↓:

▼畫圓

函式:

cv2.circle(img,(447,63), 63, (0,0,255), -1)

這個函式有5個引數:影象名稱,圓心座標,半徑63,(0,0,255)紅色,線寬為-1.當線寬-1時,表示封閉圖形的顏色填充。

畫圓的兩要素:指定圓形的中心點座標和半徑大小。

程式碼:

import cv2
import numpy as np
img=np.zeros((512,512,3), np.uint8)
cv2.circle(img,(256,256), 63, (0,0,255), -1)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

演示效果↓:

▼畫橢圓

函式原型:

cv2.ellipse(img,center,axes,angle,start_angle,end_angle,color,thickness,line_type,shift)

img是操作的圖片、center是橢圓的中心的,axes是橢圓的長軸和短軸、angle是偏轉角度、start_angle和end_angle分別是圓弧的起始角度和終結角度、color是線條顏色、thickness是線條粗細程度、line_type是線條的型別、shift是圓心座標點和數軸的精度。

給出一個函式例項:

cv2.ellipse(img,(256,256),(100,50),0,0,180,255,-1)

這個函式有8個引數:img為影象名稱,(256,256)為中心點座標,100為長軸長度,50為短軸長度,0旋轉角度,影象出現的部分(長軸順時針方向起始的角度和結束角度)0,180是下半個橢圓,顏色陣列這裡255是藍色。-1則為實心,大於0的數值則為空心,線條寬度由自己決定。

畫橢圓的幾個要素:中心點的位置座標;長軸和短軸的長度;橢圓沿逆時針方向旋轉的角度;長軸順時針方向起始的角度和結束角度。

程式碼:

import cv2
import numpy as np
img=np.zeros((512,512,3), np.uint8)
cv2.ellipse(img,(256,256),(100,50),0,0,180,255,-1)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

演示效果↓:

現在我們畫出整個橢圓,將程式碼中倒數第三個引數由180修改為360就可以了:

cv2.ellipse(img,(256,256),(100,50),0,0,360,255,-1)

若想畫出空心圓,只需要將最後一個引數修改為正值,即為線寬:

cv2.ellipse(img,(256,256),(100,50),0,0,360,255,4)

效果↓:

▼畫多邊形

OpenCV中可以通過API進而畫出多邊形,其函式例項為:

pts=np.array([[20,20],[350,40],[420,400],[60,420]], np.int32)
pts = pts.reshape((-1,1,2))
img = cv2.polylines(img,[pts],True,(0,255,0),2)

cv2. polylines()有5個引數:影象名稱,頂點列表(這個多邊形在array中有四個頂點),True表示閉合,(0,255,255)是黃色,3是線寬。pts則是使用numpy構建的四個頂點的陣列,這個陣列的資料型別必須為 int32。

程式碼:

import cv2
import numpy as np
img = np.zeros((512, 512, 3), np.uint8)
pts=np.array([[20,20],[350,40],[420,400],[60,420]], np.int32)
pts=pts.reshape((-1,1,2))
cv2.polylines(img,[pts],True,(0,255,0),2)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果演示↓:

如果我修改頂點陣列的順序,就會得到不一樣的結果:

pts=np.array([[20,20],[350,40],[60,420],[420,400]], np.int32)

效果↓:

▼在圖片上新增文字

使用OpenCV我們可以在影象上新增文字,函式例項為:

font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'OpenCV',(10,250), font, 4,(255,255,255),2)

這個函式有八個引數,分別為:影象名稱、字串、座標、字型、字號、(255,255,255)為白色、線寬為2。

當然,OpenCV是不支援新增中文的,要想新增中文的文字,可以新增中文的字型檔,也可以使用PIL來進行操作。官方解釋不支援漢字是為了保持庫的簡單和輕量, 並且表明以後也不會支援中文,所以大家還是儘量使用英文,畢竟我們以後也是需要使用英文來閱讀大量的檔案的。

程式碼:

import cv2
import numpy as np
img=np.zeros((512,512,3), np.uint8)
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'OpenCV',(10,250), font, 4,(255,255,255),2)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果演示↓:

至此,OpenCV的繪圖功能基本上就這些了,需要特別注意的是

所 有 的 繪 圖 函 數 的 返 回 值 都 是 None, 所 以 不 能 使 用 類似:img =cv2.line(img,(0,0),(511,511),(255,0,0),5),繪圖函式直接呼叫即可。