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),繪圖函式直接呼叫即可。