5 opencv python 鼠標鍵盤事件

python 鼠標鍵盤事件

目標

  • 學習使用opencv 處理鼠標事件
  • 學會cv2.setMouseCallback()函數的使用方法
  • 學會cv2.waitKey()函數的使用方法

打印所有opencv事件

import cv2
events=[i for i in dir(cv2) if 'EVENT'in i]
print(events)
['EVENT_FLAG_ALTKEY', 'EVENT_FLAG_CTRLKEY', 'EVENT_FLAG_LBUTTON', 'EVENT_FLAG_MBUTTON', 'EVENT_FLAG_RBUTTON', 'EVENT_FLAG_SHIFTKEY', 'EVENT_LBUTTONDBLCLK', 'EVENT_LBUTTONDOWN', 'EVENT_LBUTTONUP', 'EVENT_MBUTTONDBLCLK', 'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP', 'EVENT_MOUSEHWHEEL', 'EVENT_MOUSEMOVE', 'EVENT_MOUSEWHEEL', 'EVENT_RBUTTONDBLCLK', 'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']

通過鼠標畫圓

  • 定義回調函數 draw_circle()
  • 設置鼠標回調事件 cv2.setMouseCallback()
  • 通過cv2.waitKey檢測鍵盤事件
import cv2

#鼠標回調函數定義
def draw_circle(event,x,y,flags,param):
    if event==cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img,(x,y),10,(255,0,0),1)
    # 創建圖像與窗口並將窗口與回調函數綁定

cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
    
img = cv2.imread('test.jpg')

while(1):
    cv2.imshow('image', img)
    if cv2.waitKey(20)&0xFF==27:
        break
cv2.destroyAllWindows()

通過鼠標鍵盤畫圓和畫矩形

 

import cv2
import math
import numpy as np
# 當鼠標按下時變爲 True
drawing=False
# 如果 mode 爲 true 繪製矩形。按下 'm' 變成繪製曲線。
mode=True
ix,iy=-1,-1
l = 10

# 創建回調函數
def draw_circle(event,x,y,flags,param):
    global ix,iy,drawing,mode, l
# 當按下左鍵是返回起始位置座標
    if event==cv2.EVENT_LBUTTONDOWN:
        drawing=True
        ix,iy=x,y
    elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:
        lengthX = (x-ix)    
        lengthY = (y-iy)
        l = math.sqrt(lengthX*lengthX + lengthY * lengthY)

# 當鼠標鬆開停止繪畫。
    elif event==cv2.EVENT_LBUTTONUP:
        if drawing==True:
            if mode==True:
                cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),1)
            else:
                l = int(l)  ##重點數值類型轉換
                cv2.circle(img,(ix,iy),l,(0,0,255),1)
        drawing==False
        
img = cv2.imread('test.jpg')
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
    cv2.imshow('image',img)
    k=cv2.waitKey(1)&0xFF
    if k==ord('m'):
        mode=not mode
    elif k&0xFF ==27:
        break

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章