opencv學習(三)——繪圖功能

墨戈發表於2021-12-06

繪圖功能

我們將學習以下函式: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)

image

二、畫矩形

要繪製矩形,需要矩形的左上角和右下角。這次,我們將在影像的右上角繪製一個綠色矩形。

rectangle = cv2.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)
cv_show('rectangle', rectangle)

image

三、畫圓圈

要繪製一個圓,需要其中心座標和半徑。我們將在上面繪製的矩形內繪製一個圓。

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

image

四、畫橢圓

要繪製橢圓,我們需要傳遞幾個引數。一個引數是中心位置(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)

image

五、畫多邊形

要繪製多邊形,首先需要頂點的座標。將這些點組成形狀為 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)

image

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)

image

相關文章