- 本文是個人快速入門OpenCV-Python的電子筆記,由於水平有限,難免出現錯漏,敬請批評改正。
繪制矩形
import cv2 import numpy as np ''' img = cv2.rectangle( img, pt1, pt2, color[, thickness[, lineType]] ) 參數說明: img:在其上面繪制圖形的載體圖像(繪圖的容器載體,也稱為畫布、畫板)。 pt1 為矩形頂點。 pt2 為矩形中與 pt1 對角的頂點。 color:繪制形狀的顏色。通常使用 BGR 模型表示顏色, 例如,(0, 255, 0)表示綠色。對於灰度圖像,只能傳入灰度值。 需要注意,顏色通道的順序是 BGR,而不是 RGB。 thickness:線條的粗細。 默認值是 1,如果設置為-1,表示填充圖形(即繪制的圖形是實心的)。 lineType:線條的類型,默認是 8 連接類型。 ''' img = np.zeros((400,400,3), np.uint8) img = cv2.rectangle(img,(100,100),(300,300),(0,0,255),-1) cv2.namedWindow('cv2.rectangle') cv2.imshow('cv2.rectangle', img) cv2.waitKey(0) cv2.destroyAllWindows()
繪制圓形
import cv2 import numpy as np ''' img = cv2.circle( img, center, radius, color[, thickness[, lineType]] ) 參數說明: img:在其上面繪制圖形的載體圖像(繪圖的容器載體,也稱為畫布、畫板)。 center 為圓心。 radius 為半徑。 color:繪制形狀的顏色。通常使用 BGR 模型表示顏色, 例如,(0, 255, 0)表示綠色。對於灰度圖像,只能傳入灰度值。 需要注意,顏色通道的順序是 BGR,而不是 RGB。 thickness:線條的粗細。 默認值是 1,如果設置為-1,表示填充圖形(即繪制的圖形是實心的)。 lineType:線條的類型,默認是 8 連接類型。 ''' img = np.zeros((400,400,3),dtype="uint8") (centerX,centerY) = (round(img.shape[1] / 2),round(img.shape[0] / 2)) # 將圖像的中心作為圓心,實際值為 400/2 for r in range(5,round(400/2),12): cv2.circle(img,(centerX,centerY),r,(255,255,255),3) # circle(載體圖像,圓心,半徑,顏色) cv2.imshow("cv2.circle",img) cv2.waitKey(0) cv2.destroyAllWindows()
繪制橢圓
import cv2 import numpy as np ''' img=cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color[,thickness[, lineType]]) 參數說明: img:在其上面繪制圖形的載體圖像(繪圖的容器載體,也稱為畫布、畫板)。 center 為橢圓的圓心坐標。 axes 為軸的長度。 angle 為偏轉的角度。 startAngle 為圓弧起始角的角度。 endAngle 為圓弧終結角的角度。 color:繪制形狀的顏色。通常使用 BGR 模型表示顏色, 例如,(0, 255, 0)表示綠色。對於灰度圖像,只能傳入灰度值。 需要注意,顏色通道的順序是 BGR,而不是 RGB。 thickness:線條的粗細。 默認值是 1,如果設置為-1,表示填充圖形(即繪制的圖形是實心的)。 lineType:線條的類型,默認是 8 連接類型。 ''' img = np.zeros((400,400,3),dtype="uint8") center=(round(400/2),round(400/2)) size=(100,200) # 軸的長度 for i in range(0,5): # 偏移角度 angle = np.random.randint(0,361) # 生成隨機顏色,3 個[0,256)的隨機數 color = np.random.randint(0,high = 256,size = (3,)).tolist() # 隨機粗細 thickness = np.random.randint(1,9) cv2.ellipse(img, center, size, angle, 0, 360, color,thickness) cv2.imshow("cv2.ellipse",img) cv2.waitKey(0) cv2.destroyAllWindows()
繪制多邊形
import cv2 import numpy as np ''' img = cv2.polylines( img, pts, isClosed, color[, thickness[, lineType[, shift]]]) 參數說明: img:在其上面繪制圖形的載體圖像(繪圖的容器載體,也稱為畫布、畫板)。 pts 為多邊形的各個頂點。 isClosed 為閉合標記,用來指示多邊形是否是封閉的。 若該值為 True,則將最後一個點與第一個點連接,讓多邊形閉合; 否則,僅僅將各個點依次連接起來,構成一條曲線。 color:繪制形狀的顏色。通常使用 BGR 模型表示顏色, 例如,(0, 255, 0)表示綠色。對於灰度圖像,只能傳入灰度值。 需要注意,顏色通道的順序是 BGR,而不是 RGB。 thickness:線條的粗細。 默認值是 1,如果設置為-1,表示填充圖形(即繪制的圖形是實心的)。 lineType:線條的類型,默認是 8 連接類型。 注:需要給出每個頂點的坐標。這些點的坐標構建了 一個大小等於“頂點個數*1*2”的數組, 這個數組的數據類型必須為 numpy.int32。 ''' img = np.zeros((400,400,3),dtype="uint8") # 生成各個頂點,注意數據類型為 int32 pts=np.array([[200,50],[300,200],[200,350],[100,200]], np.int32) # 第 1 個參數為-1, 表明它未設置具體值,它所表示的維度值是通過其他參數值計算得到的 pts=pts.reshape((-1,1,2)) # # 調用函數 cv2.polylines()完成多邊形繪圖。注意,第 3 個參數控制多邊形是否封閉 cv2.polylines(img,[pts],True,(255,255,255),8) cv2.imshow("cv2.polylines",img) cv2.waitKey(0) cv2.destroyAllWindows()
繪制文字
import cv2 import numpy as np from PIL import Image, ImageDraw, ImageFont ''' img=cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[,lineType[, bottomLeftOrigin]]]) 參數說明: img:在其上面繪制圖形的載體圖像(繪圖的容器載體,也稱為畫布、畫板)。 text 為要繪制的字體。 org 為繪制字體的位置,以文字的左下角為起點。 fontFace 表示字體類型,其參數類型及含義。 fontScale 表示字體大小。 color:繪制形狀的顏色。通常使用 BGR 模型表示顏色, 例如,(0, 255, 0)表示綠色。對於灰度圖像,只能傳入灰度值。 需要注意,顏色通道的順序是 BGR,而不是 RGB。 thickness:線條的粗細。 默認值是 1,如果設置為-1,表示填充圖形(即繪制的圖形是實心的)。 lineType:線條的類型,默認是 8 連接類型。 bottomLeftOrigin 用於控制文字的方向。 默認值為 False,當設置為 True 時,文字是垂直鏡像的效果。 ''' img = np.zeros((400,400,3),dtype="uint8") cv2.putText(img,'OpenCV',(20,150), cv2.FONT_HERSHEY_SIMPLEX, 3,(0,255,0),15) cv2.putText(img,'OpenCV',(20,150), cv2.FONT_HERSHEY_SIMPLEX, 3,(0,0,255),5) # 繪制中文 # 創建一個可以在給定圖像上繪圖的對象 img_np= Image.fromarray(img) draw = ImageDraw.Draw(img_np) # 字體的格式 fontStyle = ImageFont.truetype("simsun.ttc", size=64 ,encoding="utf-8") # 繪制文本 draw.text((10, 250),"數字圖像處理",(0, 255, 0),font=fontStyle) img = np.array(img_np) cv2.imshow("cv2.putText",img) cv2.waitKey(0) cv2.destroyAllWindows()
參考文獻
[1] https://opencv.org/
[2] 李立宗. OpenCV輕松入門:面向Python. 北京: 電子工業出版社,2019
- 更多精彩內容,可點擊進入
OpenCV-Python快速入門專欄或我的個人主頁查看