opencv繪圖函數(cv2.line(), cv2.circle(), cv2.rectangle(),cv2.ellipse() cv2. cv2.putText() )
- 2020 年 2 月 13 日
- 筆記
主要有cv2.line()//畫線, cv2.circle()//畫圓, cv2.rectangle()//長方形,cv2.ellipse()//橢圓, cv2.putText()//文字繪製
主要參數
- img:源影像
- color:需要傳入的顏色
- thickness:線條的粗細,默認值是1
- linetype:線條的類型,8 連接,抗鋸齒等。默認情況是 8 連接。cv2.LINE_AA 為抗鋸齒,這樣看起來會非常平滑。
1、畫線
- 畫線——設置起點和終點,顏色,線條寬度
#創建一個影像,300×400大小,數據類型無符號8位 img=np.zeros((300,400,3),np.uint8) cv2.line(img,(10,10),(200,200),(0,255,0),3)#綠色,3個像素寬度

2、畫矩形
- 矩形——設置左上頂點和右下頂點,顏色,線條寬度
cv2.rectangle(img,(10,10),(30,40),(134,2,34),1)
3、畫圓
- 圓——指定圓心和半徑
cv2.circle(img,(60,60),30,(0,0,213),-1)
4、橢圓
畫橢圓——需要輸入中心點位置,長軸和短軸的長度,橢圓沿逆時針選擇角度,橢圓沿順時針方向起始角度和結束角度
cv2.ellipse(img,(256,256),(100,50),0,0,180,(20,213,79),-1) #線型-1表示填充
5、多邊形
- 畫多邊形——需要指定每個頂點的坐標
import numpy as np pts=np.array([[10,3],[48,19],[60,3],[98,19]],np.int32) #數據類型必須是int32 pts=pts.reshape((-1,1,2)) '''這裡 reshape 的第一個參數為-1, 表明這一維的長度是根據後面的維度的計算出來的。 如果第三個參數是 False,我們得到的多邊形是不閉合的(首尾不相連)。 ''' cv2.polylines(img,[pts],True,(0,0,255),1) # 影像,點集,是否閉合,顏色,線條粗細

6、添加文字
- 設置參數——繪製的文字,位置,字型,字體大小,文字顏色,線型
font=cv2.FONT_HERSHEY_SIMPLEX cv2.putText(img,』OpenCV』,(80,90), font, 2,(255,255,255),3)

7、用滑鼠繪製圖形
- opencv滑鼠處理事件
- cv2.setMouseCallback()函數
- 滑鼠事件如下:
- cv2.EVENT_MOUSEMOVE 0 滑鼠移動
- cv2.EVENT_LBUTTONDOWN 1 左鍵單擊
- cv2.EVENT_RBUTTONDOWN 2 右鍵單擊
- cv2.EVENT_MBUTTONDOWN 3 中鍵單擊
- cv2.EVENT_LBUTTONUP 4 左鍵釋放
- cv2.EVENT_RBUTTONUP 5 右鍵釋放
- cv2.EVENT_MBUTTONUP 6 中鍵釋放
- cv2.EVENT_LBUTTONDBLCLK 7 左鍵雙擊
- cv2.EVENT_RBUTTONDBLCLK 8 右鍵雙擊
- cv2.EVENT_MBUTTONDBLCLK 9 中鍵雙擊
- 滑鼠事件標誌:
- cv2.EVENT_FLAG_LBUTTON 1 滑鼠左鍵按下狀態
- cv2.EVENT_FLAG_RBUTTON 2 滑鼠右鍵按下狀態
- cv2.EVENT_FlAG_MBUTTON 4 滑鼠中鍵按下狀態
- cv2.EVENT_FLAG_CTRLKEY 8 指示CTRL鍵按下狀態
- cv2.EVENT_FLAG_SHIFTKEY 16 指示SHIFT鍵按下狀態
- cv2.EVENT_FLAG_ALTKEY 32 指示ALT鍵按下狀態
示例——滑鼠雙擊畫圓
import cv2 import numpy as np def CircleCallback(event,x,y,flags,param): if event==cv2.EVENT_LBUTTONDBLCLK: cv2.circle(img,(x,y),50,(76,201,255),1) print('圓心坐標x=:{0},y=:{1}'.format(x,y)) img=cv2.imread('empire.jpg',1) print(img.dtype) cv2.namedWindow('mouse_callback') cv2.setMouseCallback('mouse_callback',CircleCallback) while(True): cv2.imshow('mouse_callback',img) #這裡注意cv2.waitKey()裡面等待時間不要寫0,否則畫面不刷新。切記!!! if cv2.waitKey(10)&0xFF==ord('q'): break cv2.destroyAllWindows()
效果如下:

拖動畫矩形或者滑鼠移動軌跡,檢測滑鼠是否按下,按下後確定初始點(ix,iy),滑鼠按下狀態繪製滑鼠軌跡,鬆開後繪製矩形
import cv2 import numpy as np drawing = False # 滑鼠未按下時不繪製 mode = True # true時繪製矩形,按'm'變成繪製曲線 ix, iy = -1, -1 # 定義滑鼠回調函數 def MouseCallback(event, x, y, flags, param): global ix, iy, drawing, mode # 按下左鍵確定滑鼠起始位置 if event == cv2.EVENT_LBUTTONDOWN: drawing = True ix, iy = x, y # 左鍵按下狀態並且移動開始繪製 elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON: if drawing is True: if mode is False: pass # cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1) else: # 默認開啟繪製滑鼠軌跡,按m取消 cv2.circle(img, (x, y), 1, (255, 0, 0), -1) elif event == cv2.EVENT_LBUTTONUP: if drawing is True: if mode is True: cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 1) drawing = False img = cv2.imread('empire.jpg', 1) cv2.namedWindow('rectangle') cv2.setMouseCallback('rectangle', MouseCallback) while(True): cv2.imshow('rectangle', img) k = cv2.waitKey(20) & 0xFF if k == ord('m'): mode = not mode elif k == ord('q'): break