python + opencv 第五節 鼠標響應事件

#查看 cv2 有哪些被支持的事件
import cv2
import numpy as np
dir_cv2 = dir((cv2))
print(type(dir_cv2))
print(len(dir_cv2))
events = [i for i in dir(cv2) if 'EVENT' in i]
print(len(events))
print(events)
'''
18個事件
['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']
'''
# 用到的函數
# def setMouseCallback(windowName, onMouse, param=None)
# cv2.setMouseCallback()


# 鼠標回調函數
# 這裏注意,回調函數一定是要有五個參數
# 這裏event 參數是事件  響應 EVENT_*事件的 (但是不響應 EVENT_FALG_*事件)
# x, y 參數是鼠標的座標
# flags 參數是有沒有其他特殊控制,比如在按左鍵的時候,按了Ctrl,Shift,Alt鍵等,參數也是剛剛上面的EVENT列表中的,通過事件名可以找到對應flags
#       flags 參數是相應 EVENT_FLAG_* 的事件名
# param 參數是 setMouseCallback 的第三個參數
def mouse_call_back_fun(event, x, y, flags, param):
    # print(f'tpye(parma) = {type(param)}') #這裏 輸出 <class 'list'>
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(param[0], (x, y), param[1], (255, 255, 0), -1)
    if flags == cv2.EVENT_FLAG_ALTKEY: # 按下alt鍵,拖動鼠標
        cv2.rectangle(param[0], (x, y), (x + param[1], y + param[1]), (0, 255, 0), 3)

img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('mouse_call_back')
cv2.setMouseCallback('mouse_call_back', mouse_call_back_fun, [img, 20]) #這裏通過設置 param參數,傳遞了 img 和 一個整數給回調函數

while(True):
    cv2.imshow('mouse_call_back', img)
    if cv2.waitKey(20) & 0xFF == 27:
        break

cv2.destroyAllWindows()

 

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