1. 鼠标支持的事件
import cv2 as cv
events = [i for i in dir(cv) 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']
cv是module object,所以返回的是cv模块的属性.
def dir(p_object=None): # real signature unknown; restored from __doc__
"""
dir([object]) -> list of strings
If called without an argument, return the names in the current scope.
Else, return an alphabetized list of names comprising (some of) the attributes
of the given object, and of attributes reachable from it.
If the object supplies a method named __dir__, it will be used; otherwise
the default dir() logic is used and returns:
for a module object: the module's attributes.
for a class object: its attributes, and recursively the attributes
of its bases.
for any other object: its attributes, its class's attributes, and
recursively the attributes of its class's base classes.
"""
2. 设置回调函数
功能:双击鼠标左键,生成一个圆。
import numpy as np
import cv2 as cv
# mouse callback function
def draw_circle(event, x, y, flags, param):
if event == cv.EVENT_LBUTTONDBLCLK: # 双击鼠标左键
cv.circle(img, (x, y), 100, (255, 0, 0), -1)
# Create a black image, a window and bind the function to window
img = np.zeros((512, 512, 3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image', draw_circle)
while 1:
cv.imshow('image', img)
if cv.waitKey(20) & 0xFF == 27:
break
cv.destroyAllWindows()
3. 设置回调函数
功能:画矩形,或者画曲线。
# -*- coding: utf-8 -*-
# @Time : 2021/2/5 下午9:46
# @Author : zxq
# @File : demo.py
# @Software: PyCharm
import numpy as np
import cv2 as cv
drawing = False # true if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix, iy = -1, -1 # ix, iy is start location
# mouse callback function
def draw_adv_circle(event, x, y, flags, param):
global ix, iy, drawing, mode
if event == cv.EVENT_LBUTTONDOWN: # 1 按下鼠标左键
drawing = True
ix, iy = x, y
elif event == cv.EVENT_MOUSEMOVE: # 拖到鼠标,拖动的过程中,画图,其中ix, iy在按下左键后一直是不变的
if drawing:
if mode:
cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
else:
cv.circle(img, (x, y), 5, (0, 0, 255), -1) # 曲线是由一系列的小圆组成。
elif event == cv.EVENT_LBUTTONUP:
drawing = False
if mode:
cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
else:
cv.circle(img, (x, y), 5, (0, 0, 255), -1)
# Create a black image, a window and bind the function to window
img = np.zeros((512, 512, 3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image', draw_adv_circle)
while 1:
cv.imshow('image', img)
k = cv.waitKey(1) & 0xFF
if k == ord('m'):
mode = not mode
elif k == 27: # esc
break
cv.destroyAllWindows()