绘制各种形状
这篇教学会介绍如何运用 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()
微信扫码关注
抖音扫码关注