原文鏈接:http://www.juzicode.com/archives/5323
因為繪圖操作需要用到起點、終點坐標等參數,繪圖前需要先了解在OpenCV中圖像像素位置的坐標表示方法。一般我們用的直角坐標系x軸向右增長,y軸向上增長,但是在OpenCV圖像中,y卻是向下增長的,也就說一張圖片左上角頂點的坐標為(0,0),這樣的處理也符合人類從左到右、從上到下的閱讀習慣。
另外有點和常識不同的地方是我們常說“R-G-B”三原色,一個像素可以用R、G、B三種像素組合成各種不同的顏色,但是在OpenCV彩色圖像中一個像素卻是按照“B-G-R”模式組織的。
繪圖操作函數的一些公共參數:
- img:圖像對象。
- color:顏色,如果是彩色用一個三元組表示,三元組的元素按照B-G-R組織,三元組(0,255,0)中B,R為0,G為255,所以表示的是純綠色。如果是灰度,則用單個數值表示
- thickness:線條寬度。
- point:點位置,用一個二元組表示,二元組元素按照x-y組織,比如(10,20)表示的是從左到右x=10,從上到下y=20的位置。
- lineType : 線條類型,在繪制曲線時通常使用CV2.LINE_AA可以有更好的平滑效果。
1、直線
在一個坐標系中知道兩個點,兩點之間的連線就構成了一條直線,所以畫直線需要起點和終點的x-y坐標。
繪圖方法用cv2.line(),
- 第1個位置參數為要繪圖的圖像實例。
- 第2個參數為起點,二元組。
- 第3個參數為終點,二元組。
- 第4個參數為顏色。
- 第5個參數為線寬。
先用numpy構建一個512×512大小的純白色圖片對象:img = np.ones((512,512,3)),起點選在start=(50,50),終點選擇stop=(300,300),顏色設置為紅色color=(0,0,255),線寬thick=5:
import cv2
import numpy as np
print('VX公眾號: 桔子code / juzicode.com')
print('cv2.__version__:',cv2.__version__)
img = np.ones((512,512,3))
start=(50,50)
stop=(300,300)
color=(0,0,255)
thick=5
cv2.line(img,start,stop,color,thick)
cv2.imshow('img',img)
cv2.waitKey()
運行結果:
如果使用灰度圖,img構建成單通道圖像,color雖然可以用三元組表示,但是實際只用到了第0個元素。在白色背景下,用0值表示黑色,黑色背景下大於0的值表示白色:
import cv2
import numpy as np
print('VX公眾號: 桔子code / juzicode.com')
print('cv2.__version__:',cv2.__version__)
img = np.ones((512,512)) #白色背景
start=(50,50)
stop=(300,300)
color=(0,255,255) #白色背景下顯示黑色線條,雖然可以用三元組表示顏色,實際只取第0個元素
thick=5
cv2.line(img,start,stop,color,thick)
cv2.imshow('img-white',img)
img = np.zeros((512,512)) #黑色背景
start=(50,50)
stop=(300,300)
color=1 #黑色背景下顯示白色線條,大於0即可
thick=5
cv2.line(img,start,stop,color,thick)
cv2.imshow('img-black',img)
cv2.waitKey()
運行結果:
2、圓形
使用cv2.circle()畫圓
- 第1參數是圖像對象;
- 第2個參數為圓心;
- 第3個參數為半徑;
- 第4個參數為顏色;
- 第5個參數為線條寬度,如果使用-1會自動填充圓形的內部;
下面這個例子中在圓心(100,100)處畫一個黃色外框半徑為50的空心圓,在圓心(200,200)處畫一個半徑為50的實心圓。
import cv2
import numpy as np
print('VX公眾號: 桔子code / juzicode.com')
print('cv2.__version__:',cv2.__version__)
img = np.ones((512,512,3)) #白色背景
center=(100,100)
radius=50
color=(0,255,255) #黃色
cv2.circle(img,center, radius, color, 5) #線條
center=(200,200)
cv2.circle(img,center, radius, color, -1) #填充
cv2.imshow('img',img)
cv2.waitKey()
運行結果:
3、方形
cv2.rectangle()用來畫方形,包括長方形和正方形。
- 第1個參數為圖像對象;
- 第2個參數為方形左上角坐標;
- 第3個參數為方形右下角坐標,方形的寬高自動根據起始點坐標計算;
- 第4個參數為顏色;
- 第5個參數為線條寬度,如果使用-1會自動填充圓形的內部;
下面的例子畫出2個方形:
import cv2
import numpy as np
print('VX公眾號: 桔子code / juzicode.com')
print('cv2.__version__:',cv2.__version__)
img = np.ones((512,512,3)) #白色背景
topleft=(10,100)
downright=(111,333)
color=(255,0,0) #藍色
cv2.rectangle(img,topleft, downright, color, 2) #線條
topleft=(300,100)
downright=(500,300)
color=(0,255,0) #藍色
cv2.rectangle(img,topleft, downright, color, -1) #填充
cv2.imshow('juzicode',img)
cv2.waitKey()
運行結果:
小結:本文介紹了如何在OpenCV圖像中繪制直線、圓形、方形,用的比較多的是繪制方形,比如人臉識別時將人臉部分用方框標注出來。