繪製各種形狀
這篇教學會介紹如何運用 OpenCV 裡的 line()、rectangle()、circle()、ellipse()、polylines() 方法,在影像上繪製直線、方形、圓形、橢圓、多邊形、實心多邊形、箭頭線條...等形狀。
快速導覽:
因為程式中的 OpenCV 會需要使用鏡頭或 GPU,所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda ) ,並安裝 OpenCV 函式庫 ( 參考:OpenCV 函式庫 )。
line() 畫直線
line() 方法可以在影像裡繪製直線,使用方法如下:
cv2.line(img, pt1, pt2, color, thickness)
# img 來源影像
# pt1 起始點座標 pt2 結束點座標
# color 線條顏色,使用 BGR
# thickness 線條粗細,預設 1
下方的程式執行後,會在 300x300 的黑色畫布上,產生一條左上到右下的紅色直線:
import cv2
import numpy as np
img = np.zeros((300,300,3), dtype='uint8') # 繪製 300x300 的黑色畫布
cv2.line(img,(50,50),(250,250),(0,0,255),5) # 繪製線條
cv2.imshow('oxxostudio', img)
cv2.waitKey(0) # 按下任意鍵停止
cv2.destroyAllWindows()
arrowedLine() 畫箭頭線條
arrowedLine() 方法可以在影像裡繪製箭頭線條,使用方法如下:
cv2.arrowedLine(img, pt1, pt2, color, thickness, tipLength)
# img 來源影像
# pt1 起始點座標 pt2 結束點座標
# color 線條顏色,使用 BGR
# thickness 線條粗細,預設 1
# tipLength 箭頭長度,預設 0.1 ( 箭頭線條長度 x 0.1 )
下方的程式執行後,會在 300x300 的黑色畫布上,產生一條左上到右下帶有箭頭的紅色直線:
import cv2
import numpy as np
img = np.zeros((300,300,3), dtype='uint8')
cv2.arrowedLine(img,(50,50),(250,250),(0,0,255),5) # 繪製箭頭線條
cv2.imshow('oxxostudio', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
rectangle() 畫四邊形
rectangle() 方法可以在影像裡繪製四邊形,使用方法如下:
cv2.rectangle(img, pt1, pt2, color, thickness)
# img 來源影像
# pt1 左上座標 pt2 右下座標
# color 線條顏色,使用 BGR
# thickness 線條粗細,預設 1,設定 -1 表示填滿
下方的程式執行後,會在 300x300 的黑色畫布上,產生一個 200x200 的紅色正方形外框:
import cv2
import numpy as np
img = np.zeros((300,300,3), dtype='uint8')
cv2.rectangle(img,(50,50),(250,250),(0,0,255),5) # 繪製正方形
cv2.imshow('oxxostudio', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果要繪製「實心」正方形,可以有兩種方法,第一種只要將 thickness 參數設定為 -1,就可以填滿正方形。
import cv2
import numpy as np
img = np.zeros((300,300,3), dtype='uint8')
cv2.rectangle(img,(50,50),(250,250),(0,0,255),-1) # 設定 -1
cv2.imshow('oxxostudio', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
第二種直接使用 numpy 產生對應的陣列就能產生實心正方形。
import cv2
import numpy as np
img = np.zeros((300,300,3), dtype='uint8')
img[50:250, 50:250] = [0,0,255] # 將中間 200x200 的陣列內容改成 [0,0,255]
cv2.imshow('oxxostudio', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
circle() 畫圓形
circle() 方法可以在影像裡繪製圓形,使用方法如下:
cv2.circle(img, center, radius, color, thickness)
# img 來源影像
# center 中心點座標
# radius 半徑
# color 線條顏色,使用 BGR
# thickness 線條粗細,預設 1,設定 -1 表示填滿
下方的程式執行後,會在 300x300 的黑色畫布上,產生一個半徑為 100 的紅色圓形外框:
import cv2
import numpy as np
img = np.zeros((300,300,3), dtype='uint8')
cv2.circle(img,(150,150),100,(0,0,255),5) # 繪製圓形
cv2.imshow('oxxostudio', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果要繪製「實心」圓形,只要將 thickness 參數設定為 -1,就可以繪製實心圓形。
import cv2
import numpy as np
img = np.zeros((300,300,3), dtype='uint8')
cv2.circle(img,(150,150),100,(0,0,255),-1) # 設定 -1
cv2.imshow('oxxostudio', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
ellipse() 畫橢圓形
ellipse() 方法可以在影像裡繪製橢圓形,使用方法如下:
cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness)
# img 來源影像
# center 中心點座標
# axes 長軸與短軸
# angle 轉向角度,正值逆時針,負值順時針
# startAngle 起始角度,endAngle 結束角度,範圍 0~360
# color 線條顏色,使用 BGR
# thickness 線條粗細,預設 1,設定 -1 表示填滿
下方的程式執行後,會在 300x300 的黑色畫布上,產生三個不同的橢圓形外框:
import cv2
import numpy as np
img = np.zeros((300,300,3), dtype='uint8')
cv2.ellipse(img,(150,150),(100,50),45,0,360,(0,0,255),5)
cv2.ellipse(img,(150,150),(30,100),90,0,360,(255,150,0),5)
cv2.ellipse(img,(150,150),(20,120),30,0,360,(0,255,255),5)
cv2.imshow('oxxostudio', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
polylines() 畫多邊形
polylines() 方法可以在影像裡繪製多邊形,使用方法如下:
cv2.polylines(img, pts, isClosed, color, thickness)
# img 來源影像
# pts 座標陣列 ( 使用 numpy 陣列 )
# isClosed 多邊形是否閉合,True 閉合,False 不閉合
# color 線條顏色,使用 BGR
# thickness 線條粗細,預設 1
下方的程式執行後,會在 300x300 的黑色畫布上,產生一個紅色外框多邊形:
import cv2
import numpy as np
img = np.zeros((300,300,3), dtype='uint8')
pts = np.array([[150,50],[250,100],[150,250],[50,100]]) # 產生座標陣列
cv2.polylines(img,[pts],True,(0,0,255),5) # 繪製多邊形
cv2.imshow('oxxostudio', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果要繪製「實心」多邊形,則需使用 fillPoly() 方法,使用方法如下:
cv2.fillPoly(img, pts, color)
# img 來源影像
# pts 座標陣列 ( 使用 numpy 陣列 )
# color 線條顏色,使用 BGR
下方的程式執行後,會在 300x300 的黑色畫布上,產生一個紅色實心多邊形:
import cv2
import numpy as np
img = np.zeros((300,300,3), dtype='uint8')
pts = np.array([[150,50],[250,100],[150,250],[50,100]])
cv2.fillPoly(img,[pts],(0,0,255))
cv2.imshow('oxxostudio', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~