OpenCV 中的绘制功能
本文主要內(nèi)容來(lái)自于 OpenCV-Python 教程 的 OpenCV 中的 GUI 功能 部分,這個(gè)部分的主要內(nèi)容如下:
- 圖像操作入門
學(xué)習(xí)加載一幅圖像,顯示它,并保存它 - 視頻入門
學(xué)習(xí)播放視頻,從攝像頭捕捉視頻,以及寫入視頻 - OpenCV 中的繪制功能
學(xué)習(xí)通過(guò) OpenCV 繪制線、矩形、橢圓形和圓形等等 - 鼠標(biāo)作為畫筆
用鼠標(biāo)畫東西 - 軌跡欄作為調(diào)色板
創(chuàng)建軌跡欄以控制某些參數(shù)
目標(biāo)
- 學(xué)習(xí)通過(guò) OpenCV 繪制不同的幾何形狀
- 我們將學(xué)習(xí)這些函數(shù):cv.line()、cv.circle()、cv.rectangle()、cv.ellipse()、cv.putText()?等等。
代碼
在上面所有這些函數(shù)中,我們將看到一些公共的參數(shù),這些參數(shù)如下:
- img:要繪制幾何形狀的圖像。
- color:幾何形狀的顏色。對(duì)于 BGR,傳入一個(gè)元組,比如 (255,0,0) 繪制藍(lán)色的。對(duì)于灰度圖,則只需傳遞標(biāo)量值。
- thickness:線或圓等的粗細(xì)。如果為圓這樣的閉合圖形傳入 -1,則它將填充形狀。默認(rèn) thickness = 1
- lineType:線的類型,是否是 8 連接,抗鋸齒線等。默認(rèn)情況下,它是 8 連接。cv.LINE_AA?指定以抗鋸齒線繪制,這看起來(lái)對(duì)曲線非常好。
繪制線
為了繪制線,我們需要傳入線的起點(diǎn)和終點(diǎn)坐標(biāo)。我們創(chuàng)建一幅黑色的圖像,并在它上面繪制一條從左上角到右下角的藍(lán)色的線。
import numpy as np import cv2 as cvdef create_black_color_image(width, height):# Create a black imageimg = np.zeros((width, height, 3), np.uint8)return imgdef draw_line(img, start, end, color=(255, 0, 0)):# Draw a diagonal blue line with thickness of 5 pxcv.line(img, start, end, color, 5)if __name__ == "__main__":img = create_black_color_image(512, 512)draw_line(img, (0, 0), (512, 512))draw_line(img, (122, 486), (423, 54), (123, 233, 69))cv.imshow('shape', img)cv.waitKey(0)cv.destroyAllWindows()繪制矩形
要繪制一個(gè)矩形,我們需要矩形的左上角和右下角的坐標(biāo)。這次我們將在圖像的右上角繪制一個(gè)綠色的矩形。
cv.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)繪制圓形
要繪制圓形,我們需要它的圓心坐標(biāo)和半徑。我們將在上面的矩形中繪制一個(gè)圓形。
cv.circle(img,(447,63), 63, (0,0,255), -1)繪制橢圓形
要繪制橢圓,我們需要傳入多個(gè)參數(shù)。一個(gè)參數(shù)是中心位置 (x,y)。下一個(gè)參數(shù)是軸長(zhǎng)(橫軸長(zhǎng)和縱軸長(zhǎng))。angle 是橢圓沿逆時(shí)針方向旋轉(zhuǎn)的角度。startAngle 和 endAngle 表示從主軸順時(shí)針方向測(cè)量的橢圓弧的起點(diǎn)和終點(diǎn)。即給出值 0 和 360 繪出完整的橢圓。更多細(xì)節(jié),請(qǐng)參考?cv.ellipse() 的文檔。下面的例子在圖像的中心繪制了半個(gè)橢圓。
cv.ellipse(img, (255, 255), (192, 116), 0, 0, 180, (23, 243, 234), -1)繪制多邊形
要繪制多邊形,首先我們需要頂點(diǎn)的坐標(biāo)。將這些點(diǎn)放入一個(gè)形狀為 ROWSx1x2 的數(shù)組中,其中 ROWS 是頂點(diǎn)數(shù),它應(yīng)該是 int32 類型。這里我們用黃色繪制一個(gè)具有四個(gè)頂點(diǎn)的多邊形。
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32) pts = pts.reshape((-1,1,2)) cv.polylines(img,[pts],True,(0,255,255))注意:如果第三個(gè)參數(shù)是 False,我們將獲得連接所有點(diǎn)的一組線,而不是閉合的形狀。
cv.polylines() 可用于繪制多條線。只需創(chuàng)建要繪制的所有線條的列表并將其傳遞給函數(shù)即可。所有線條都將單獨(dú)繪制。與為每條線調(diào)用?cv.line() 相比,它是繪制一組線的一種更好更快的方法。
給圖像添加文字
要把文字放進(jìn)圖像中,我們需要指定如下這些東西。
- 想要寫入的文字?jǐn)?shù)據(jù)。
- 想要放置文字的位置的坐標(biāo)(比如數(shù)據(jù)開始的左下角)。
- 字體類型(檢查?cv.putText() 的文檔了解支持的字體)
- 字體比例(指定字體大小)
- 常規(guī)的東西,如 color、thickness、lineType 等等。為了更好看,建議設(shè)置 lineType =?cv.LINE_AA
我們將以白色在我們的圖像上寫入 OpenCV。
font = cv.FONT_HERSHEY_COMPLEX cv.putText(img, u'OpenCV', (10, 500), font, 4, (255, 255, 255), 4, cv.LINE_AA)結(jié)果
是時(shí)候看一下我們的繪制最終的效果了。如之前的文檔中了解到的那樣,在窗口中顯示我們繪制的圖像。
繪制幾何圖形對(duì)于計(jì)算機(jī)視覺來(lái)說(shuō),可以用來(lái)給對(duì)象繪制邊界等。
繪制幾何圖形時(shí),只會(huì)修改幾何圖形影響到的像素點(diǎn)的數(shù)據(jù),圖像中其它的數(shù)據(jù)則保持不變。比如,繪制線條時(shí),只有在線條上的像素點(diǎn)的數(shù)據(jù)被修改為了繪制顏色。這樣我們可以通過(guò)多次調(diào)用不同的接口,構(gòu)建一幅更加復(fù)雜更多彩的圖像。
在繪制時(shí),這里的各個(gè)接口都要求指定坐標(biāo)。坐標(biāo)都是特定于坐標(biāo)系的。在 OpenCV 的圖像中,坐標(biāo)系的方向?yàn)閺淖笊辖堑接蚁陆?#xff0c;即從左到右橫坐標(biāo)值逐漸遞增,從上到下,縱坐標(biāo)值逐漸遞增。
其它資源
參考文檔
Drawing Functions in OpenCV
Done.
總結(jié)
以上是生活随笔為你收集整理的OpenCV 中的绘制功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像操作入门
- 下一篇: OpenCV_006-OpenCV 轨迹