Opencv笔记(五)——把鼠标当画笔
学习目标:
- 学习使用 OpenCV 处理鼠标事件
- 学会使用函数cv2.setMouseCallback()
简单演示:
首先我们来创建一个鼠标事件回调函数,但鼠标事件发生是他就会被执行。鼠标事件可以是鼠标上的任何动作,比如左键按下,左键松开,左键双击等。该函数还提供了鼠标点击的位置。
Event | 中文释义 |
---|---|
cv2.EVENT_MOUSEMOVE | 鼠标移动 |
cv2.EVENT_LBUTTONDOWN | 左键点击 |
cv2.EVENT_RBUTTONDOWN | 右键点击 |
cv2.EVENT_MBUTTONDOWN | 中间点击 |
cv2.EVENT_LBUTTONUP | 左键释放 |
cv2.EVENT_RBUTTONUP | 右键释放 |
cv2.EVENT_MBUTTONUP | 中间释放 |
cv2.EVENT_LBUTTONDBLCLK | 左键双击 |
cv2.EVENT_RBUTTONDBLCLK | 右键双击 |
cv2.EVENT_MBUTTONDBLCLK | 中间双击 |
import numpy as np
import cv2
def draw_circle(event,x,y,flags,param):
if event==cv2.EVENT_LBUTTONUP :
cv2.circle(img,(x,y),20,(255,0,0),-1)
img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('opencv')
cv2.setMouseCallback('opencv',draw_circle)
while(1):
cv2.imshow('opencv',img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
- 先创建一个鼠标事件回调函数,event表示鼠标事件,x,y表示鼠标事件的位置,flags代表鼠标拖拽事件。自己在函数中定义事件的类型,上述代码定义的是左键释放画圈。
- cv2.setMouseCallback('Window_name',def),第一个参数是窗口名,第二个参数是用于处理的回调函数。
高级演示:
用鼠标左键点击后拖动画矩形,按下m建变换模式,改画圆。
import numpy as np
import cv2
drawing = False
mode = True
ix,iy = -1,-1
def draw_circle(event,x,y,flags,param):
global drawing,mode,ix,iy
if event==cv2.EVENT_LBUTTONDOWN:
drawing = True
ix,iy = x,y
elif event==cv2.EVENT_MOUSEMOVE :
if drawing == True:
if mode == True:
cv2.rectangle(img,(ix,iy),(x,y),(255,0,0),2)
else:
cv2.circle(img,(x,y),50,(0,255,0),3)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('opencv')
cv2.setMouseCallback('opencv',draw_circle)
while(1):
cv2.imshow('opencv',img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
elif cv2.waitKey(1) &0xFF == ord('m'):
mode = not mode
cv2.imwrite('/home/wl/1.jpg',img)
cv2.destroyAllWindows()