OpenCV 提供了方便的繪圖功能,使用其中的繪圖函數可以繪制直線、矩形、圓、橢圓等多種幾何圖形,還能在圖像中的指定位置添加文字說明。
OpenCV 提供了繪制直線的函數 cv2.line()、繪制矩形的函數 cv2.rectangle()、繪制圓的函數cv2.circle()、繪制橢圓的函數cv2.ellipse()、繪制多邊形的函數 cv2.polylines()、在圖像內添加文字的函數 cv2.putText()等多種繪圖函數。
這些繪圖函數有一些共有的參數,主要用于設置源圖像、顏色、線條屬性等。下面對這些共有參數做簡單的介紹。
- img:在其上面繪制圖形的載體圖像(繪圖的容器載體,也稱為畫布、畫板)。
- color:繪制形狀的顏色。通常使用 BGR 模型表示顏色,例如,(0, 255, 0)表示綠色。對于灰度圖像,只能傳入灰度值。需要注意,顏色通道的順序是 BGR,而不是 RGB。
- thickness:線條的粗細。默認值是 1,如果設置為-1,表示填充圖形(即繪制的圖形是實心的)。
- lineType:線條的類型,默認是 8 連接類型。lineType 參數的值及說明如表 19-1 所示。
- shift:數據精度。該參數用來控制數值(例如圓心坐標等)的精度,一般情況下不需要設置。
繪制直線
OpenCV 提供了函數 cv2.line()用來繪制直線(線段)。該函數的語法格式為:
img = cv2.line( img, pt1, pt2, color[, thickness[, lineType ]])
式中:
- 參數 img、color、thickness、lineType 的含義如前面的說明所示。
- pt1 表示線段的第 1 個點(起點)。
- pt2 表示線段的第 2 個點(終點)。
示例:使用 cv2.line()函數在一個黑色背景圖像內繪制三條線段。
import numpy as np
import cv2
n = 300 # 圖像尺寸# 創建一個空白的彩色圖像,尺寸為(n+1) x (n+1),3通道(RGB)
img = np.zeros((n+1, n+1, 3), np.uint8)# 在圖像上繪制藍色直線,起點為(0,0),終點為(n,n),線寬為3
img = cv2.line(img, (0, 0), (n, n), (255, 0, 0), 3)# 在圖像上繪制綠色直線,起點為(0,100),終點為(n,100),線寬為1
img = cv2.line(img, (0, 100), (n, 100), (0, 255, 0), 1)# 在圖像上繪制紅色直線,起點為(100,0),終點為(100,n),線寬為6
img = cv2.line(img, (100, 0), (100, n), (0, 0, 255), 6)winname = 'line-demo' # 窗口名稱# 創建一個窗口并設置窗口名字
cv2.namedWindow(winname)# 在窗口中顯示圖像
cv2.imshow(winname, img)# 等待鍵盤按鍵,0表示無限等待
cv2.waitKey(0)
cv2.destroyAllWindows()
運行結果:
繪制矩形
OpenCV 提供了函數 cv2.rectangle()
用來繪制矩形。該函數的語法格式為:
img = cv2.rectangle( img, pt1, pt2, color[, thickness[, lineType]] )
式中:
- 參數 img、color、thickness、lineType 的含義如前面的說明所示。
- pt1 為矩形頂點。
- pt2 為矩形中與 pt1 對角的頂點。
使用函數 cv2.rectangle()在一個白色背景圖像內繪制一個實心矩形和空心矩形。
代碼如下:
import numpy as np
import cv2n = 300 # 圖像尺寸# 創建一個白色背景的彩色圖像,尺寸為n x n,3通道(RGB)
img = np.ones((n, n, 3), np.uint8) * 255# 在圖像上繪制填充的紅色矩形,左上角坐標為(50, 50),右下角坐標為(n-100, n-50),顏色為紅色,厚度為-1表示填充, 0表示不填充
img = cv2.rectangle(img, (50, 50), (n-100, n-50), (0, 0, 255), -1)winname = 'rect-shixin' # 窗口名稱# 創建一個窗口并設置窗口名字
cv2.namedWindow(winname)# 在窗口中顯示圖像
cv2.imshow(winname, img)# 等待鍵盤按鍵,0表示無限等待
cv2.waitKey(0)# 關閉所有打開的窗口
cv2.destroyAllWindows()
將img = cv2.rectangle(img, (50, 50), (n-100, n-50), (0, 0, 255), -1)
其中的 -1 改成0,就可以畫一個非實心的矩形框,效果如下。
繪制圓形
OpenCV 提供了函數 cv2.circle()
用來繪制圓。該函數的語法格式為:
img = cv2.circle( img, center, radius, color[, thickness[, lineType]] )
式中:
-
參數 img、color、thickness、lineType 的含義如前面的說明所示。
-
center 為圓心。
-
radius 為半徑
使用函數 cv2.circle()在一個白色背景圖像內繪制一組同心圓。
代碼如下:
import numpy as np
import cv2
d = 400
img = np.ones((d,d,3),dtype="uint8")*255
(centerX,centerY) = (round(img.shape[1] / 2),round(img.shape[0] / 2))
# 將圖像的中心作為圓心,實際值為 d/2
red = (0,0,255) # 設置白色變量
for r in range(5,round(d/2),12):cv2.circle(img,(centerX,centerY),r,red,3)# circle(載體圖像,圓心,半徑,顏色)
cv2.imshow("Demo19.3",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
運行效果:
繪制橢圓
OpenCV 提供了函數 cv2.ellipse()用來繪制橢圓。該函數的語法格式為:
img=cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color[,
thickness[, lineType]])
式中:
- 參數 img、color、thickness、lineType 的含義如前面的說明所示。
- center 為橢圓的圓心坐標。
- axes 為軸的長度。
- angle 為偏轉的角度。
- startAngle 為圓弧起始角的角度。
- endAngle 為圓弧終結角的角度。
使用函數 cv2.ellipse()在一個白色背景圖像內隨機繪制一組空心橢圓。
import numpy as np
import cv2
d = 400
img = np.ones((d,d,3),dtype="uint8")*255
# 生成白色背景
center=(round(d/2),round(d/2))
# 注意數值類型,不可以使用語句 center=(d/2,d/2)
size=(100,200)
# 軸的長度
for i in range(0,10):angle = np.random.randint(0,361)# 偏移角度color = np.random.randint(0,high = 256,size = (3,)).tolist()# 生成隨機顏色,3 個[0,256)的隨機數thickness = np.random.randint(1,9)cv2.ellipse(img, center, size, angle, 0, 360, color,thickness)
cv2.imshow("demo-tuoyuan",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
運行效果:
繪制多邊形
OpenCV 提供了函數 cv2.polylines()用來繪制多邊形。該函數的語法格式為:
img = cv2.polylines( img, pts, isClosed, color[, thickness[,
lineType[, shift]]])
式中:
- 參數 img、color、thickness、lineType 和 shift 的含義如前面的說明所示。
- pts 為多邊形的各個頂點。
- isClosed 為閉合標記,用來指示多邊形是否是封閉的。若該值為 True,則將最后一個點與第一個點連接,讓多邊形閉合;否則,僅僅將各個點依次連接起來,構成一條曲線。
在使用函數 cv2.polylines()繪制多邊形時,需要給出每個頂點的坐標。這些點的坐標構建了一個大小等于“頂點個數12”的數組,這個數組的數據類型必須為 numpy.int32。
使用函數 cv2.polylines()在一個白色背景圖像內繪制一個多邊形。
import numpy as np
import cv2
d = 400 # 圖像尺寸# 創建一個白色背景的彩色圖像,尺寸為d x d,3通道(RGB)
img = np.ones((d, d, 3), dtype="uint8") * 255# 生成多邊形的各個頂點坐標
pts = np.array([[200, 50], [300, 200], [200, 350], [100, 200]], np.int32)# 重新整形頂點數組,將其變為頂點數 x 1 x 2 的形狀
pts = pts.reshape((-1, 1, 2))# 使用 cv2.polylines() 函數繪制多邊形
# 第一個參數為圖像,第二個參數為頂點數組,第三個參數為True表示封閉多邊形,顏色為綠色,線寬為8
cv2.polylines(img, [pts], True, (0, 255, 0), 8)
cv2.imshow("duobianxing",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
函數 cv2.polylines()中的第 3 個參數 isClosed 是閉合標記,將該值設置為 False 時,僅僅將
各個頂點用線段連接,多邊形是不封閉的。此時的代碼為:
cv2.polylines(img,[pts],False,(0,255,0),8)
效果如下:
在圖形上繪制文字
OpenCV 提供了函數 cv2.putText()用來在圖形上繪制文字。該函數的語法格式為:
img=cv2.putText(img, text, org, fontFace, fontScale, color[,
thickness[, lineType[, bottomLeftOrigin]]])
式中:
- 參數 img、color、thickness、lineType 和 shift 的含義如前面的說明所示。
- text 為要繪制的字體。
- org 為繪制字體的位置,以文字的左下角為起點。
- fontFace 表示字體類型,其參數類型及含義如表 19-2 所示。
- fontScale 表示字體大小。
- bottomLeftOrigin 用于控制文字的方向。默認值為 False,當設置為 True 時,文字是垂直鏡像的效果。
使用函數 cv2.putText()在一個白色背景圖像內繪制文字。
代碼如下:
import numpy as np
import cv2d = 400 # 圖像尺寸# 創建一個白色背景的彩色圖像,尺寸為d x d,3通道(RGB)
img = np.ones((d, d, 3), dtype="uint8") * 255# 定義字體
font = cv2.FONT_HERSHEY_SIMPLEX# 在圖像上繪制紅色的 "OpenCV" 文本,位置同樣為(0, 200),字體大小為3,線寬為5
cv2.putText(img, 'OpenCV', (0, 200), font, 3, (0, 0, 255), 5)# 創建一個窗口并顯示圖像
cv2.imshow("weizi", img)cv2.waitKey(0)
cv2.destroyAllWindows()
該段程序在圖像 img 中使用函數 cv2.putText()繪制了文字
“OpenCV”。