OpenCV 鼠标事件
鼠标作为画笔
OpenCV提供了使用鼠标作为画笔或绘图工具的功能。无论何时鼠标事件发生在窗口屏幕上,它都可以绘制任何东西。鼠标事件可以是左键按下、左键松开、双击等。它为每个鼠标事件提供坐标(x,y)。通过使用这些坐标,我们可以画出任何想要的东西。要获取所有可用事件的列表,请在终端中运行以下代码:
import cv2
mouse_events = [j for j in dir(cv2) if 'EVENT' in j]
print(mouse_events)
上述代码将返回OpenCV支持的所有鼠标事件列表。
输出:
['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']
绘制圆形
要在窗口屏幕上绘制一个圆形,我们首先需要使用 cv2.setMouseCallback() 函数创建一个鼠标回调函数。它具有在任何地方都保持相同格式的特定格式。我们的鼠标回调函数通过使用双击来绘制一个圆形。请考虑以下程序:
import cv2
import numpy as np
# Creating mouse callback function
def draw_circle(event,x,y,flags,param):
if(event == cv2.EVENT_LBUTTONDBLCLK):
cv2.circle(img,(x,y),100,(255,255, 0),-1)
# Creating a black image, a window and bind the function to window
img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
cv2.imshow('image',img)
if cv2.waitKey(20) & 0xFF == 27:
break
cv2.destroyAllWindows()
在上述代码中,我们首先创建了一个黑色窗口屏幕,当鼠标事件发生时。当我们双击黑色窗口时,它会按照我们在回调函数draw_circle()中定义的方式绘制一个圆。
绘制矩形和曲线
可以在窗口屏幕上绘制任何形状。我们通过像在绘图应用程序中那样拖动鼠标来绘制矩形或圆(取决于我们选择的模式)。我们考虑一个例子,其中我们创建了一个回调函数,它有两个部分。第一部分是绘制矩形,另一部分是绘制圆。让我们看一下给定的例子,以更具体的方式来理解它:
import cv2
import numpy as np
draw = False # true if the mouse is pressed. Press m to shift into curve mode.
mode = True # if True, draw rectangle.
a,b = -1,-1
# mouse callback function
def draw_circle(event,x,y,flags,param):
global a,b,draw,mode
if(event == cv2.EVENT_LBUTTONDOWN):
draw = True
a,b = x,y
elif (event == cv2.EVENT_MOUSEMOVE):
if draw == True:
if mode == True:
cv2.rectangle(img,(a,b),(x,y),(0,255,0),-1)
else:
cv2.circle(img,(x,y),5,(0,0,255),-1)
elif(event == cv2.EVENT_LBUTTONUP):
draw = False
if mode == True:
cv2.rectangle(img,(a,b),(x,y),(0,255,0),-1)
else:
cv2.circle(img,(x,y),5,(0,0,255),-1)
# We bind the keyboard key m to toggle between rectangle and circle.
img = np.zeros((512,512,3), np.uint8)
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 == 27):
break
cv2.destroyAllWindows()
输出结果
在上述程序中,我们创建了两个鼠标回调函数,它们与OpenCV窗口绑定。在while循环中,我们设置了键盘绑定,按下键盘上的’m’键可以在矩形和曲线之间进行切换。