繪圖功能
我們將學習以下函式:cv.line(),cv.circle(),cv.rectangle(),cv.ellipse(),cv.putText()
等。
在這些功能中,有一些相同的引數:
- img:你要繪製形狀的影像。
- 形狀的顏色。對於BGR,將其作為元組傳遞,例如:(255,0,0)對於藍色。對於灰度,只需傳遞標量值即可。
- thickness: 線或圓等的厚度。如果傳 -1 就是像圓的閉合圖形,它將填充形狀。預設 thickness = 1。
- lineType:線條型別,如 8 連線線,抗鋸齒線等。預設情況下,是 8 連線線。
cv.LINE_AA
給出了抗鋸齒的線條,看起來非常適合曲線。
一、畫線
要繪製一條線,需要傳遞線的開始和結束座標。我們將建立一個黑色影像,並從左上角到右下角在其上繪製一條藍線。
import cv2
import numpy as np
def cv_show(name, img):
cv2.imshow(name, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#建立黑色的影像
img = np.zeros((512, 512, 3), np.uint8)
#繪製一條厚度為5的藍色對角線
line = cv2.line(img, (0, 0), (511, 511), (255, 0, 0), 5)
cv_show('line', line)
二、畫矩形
要繪製矩形,需要矩形的左上角和右下角。這次,我們將在影像的右上角繪製一個綠色矩形。
rectangle = cv2.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)
cv_show('rectangle', rectangle)
三、畫圓圈
要繪製一個圓,需要其中心座標和半徑。我們將在上面繪製的矩形內繪製一個圓。
circle = cv2.circle(img, (447, 63), 63, (0, 0, 255), -1)
cv_show('circle', circle)
四、畫橢圓
要繪製橢圓,我們需要傳遞幾個引數。一個引數是中心位置(x,y)。第二個引數是軸長度(長軸長度,短軸長度)。angle是橢圓沿逆時針方向旋轉的角度。startAngle和endAngle表示從主軸沿順時針方向測量的橢圓弧的開始和結束。如整圓就傳 0 和 360。
elipse = cv2.ellipse(img, (256, 256), (100, 50), 0, 0, 180, (15, 255, 212), -1)
cv_show('elipse', elipse)
五、畫多邊形
要繪製多邊形,首先需要頂點的座標。將這些點組成形狀為 ROWSx1x2
的陣列,其中 ROWS
是頂點數,並且其型別應為int32。在這裡,我們繪製了一個帶有四個頂點的黃色小多邊形。
pts = np.array([
[10, 5],
[20, 30],
[70, 20],
[50, 10]
], np.int32)
pts = pts.reshape((4, 1, 2))
polylines = cv2.polylines(img, [pts], True, (0, 255, 255))
cv_show('polylines', polylines)
如果第三個引數為False,您將獲得一條連線所有點的折線,而不是閉合形狀。cv.polylines()可用於繪製多條線。只需建立要繪製的所有線條的列表,然後將其傳遞給函式即可。所有線條將單獨繪製。與為每條線呼叫cv.line相比,繪製一組線是一種更好,更快的方法。
六、向影像新增文字
在影像上加文字,你需要指定以下內容。
- 你想寫的文字資料。
- 你想寫的位置座標 (如 左下角開始)。
- 字型型別。
- 常規的如顏色,粗細,線型等。為了更好看,線型使用 lintType = cv.LINE_AA。
我們將在影像上寫一個白色的 ”OpenCV“。
font = cv2.FONT_HERSHEY_SIMPLEX
text = cv2.putText(img, 'OpenCV', (10, 500), font, 4, (255, 255, 255), 2, cv2.LINE_AA)
cv_show('text', text)
七、畫OpenCV的logo
import cv2
import numpy as np
def cv_show(name, img):
cv2.imshow(name, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#建立黑色背景
background = np.zeros((512, 512, 3), np.uint8)
#畫紅圓
red_circle = cv2.circle(background, (256, 122), 50, (0, 0, 255), 40)
cv_show('red_circle', red_circle)
#畫綠圓
green_circle = cv2.circle(background, (172, 282), 50, (0, 255, 0), 40)
cv_show('green_circle', green_circle)
#畫藍圓
blue_circle = cv2.circle(background, (342, 282), 50, (255, 0, 0), 40)
cv_show('blue_circle', blue_circle)
#畫線(三角形)
pts1 = np.array([
[256, 122],
[202, 202],
[312, 202]
], np.int32)
pts1.reshape((3, 1, 2))
pts2 = np.array([
[162, 282],
[196, 202],
[270, 278]
], np.int32)
pts2.reshape((3, 1, 2))
pts3 = np.array([
[352, 282],
[292, 202],
[402, 202]
], np.int32)
pts3.reshape((3, 1, 2))
fillline = cv2.fillPoly(background, [pts1, pts2, pts3], (0, 0, 0))
cv_show('fillline', fillline)