您的位置:首页 > 编程语言 > Python开发

2.4鼠标事件

2016-02-05 16:04 417 查看
打印事件

每一个鼠标事件都有其标志,比如左键按下、左键不按下、左键双击、中键按下、滚轮滑动等。每个事件对应其标志和事件发生在屏幕上的坐标。

因此知道了事件就知道了鼠标的行为及其发生的位置。

在python命令行中输入如下三句

>>> import cv2
>>> events = [i for i in dir(cv2) if 'EVENT' in i]
>>> print events
这是用来打印所有可用的事件,运行结果:



这里打印出的事件有ALT、CTRL、SHIFT等键和各种鼠标动作,直接看英文就可以了。

事件函数与回调函数

我们可以自己定义一个函数,每当特定事件发生即调用它。这好比单片机的外部中断。

说别的没用,上代码

import cv2
import numpy as np

# mouse callback function
def draw_circle(event,x,y,flags,param):
if event == cv2.EVENT_LBUTTONDBLCLK:
cv2.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)
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函数其输入是事件类型和发生坐标

类型是指什么事件,左键按下、左键双击等,这个可以在上面的命令行操作中print出来。这里cv2.EVENT_LBUTTONDBLCLK是左键双击

坐标是双击时鼠标的位置

这个函数的意思是,每次鼠标双击时就在双击的地方画一个圆,半径为100,蓝色,内部填充

下面的img和namedwindow是建立初始图片

cv2.setMouseCallback是对'image'这个窗口作用draw_circle函数,每次鼠标事件发生时,这个函数将被调用一次,再在这个函数中调用draw_circle函数

后面的主循环中并没有看到调用函数的痕迹,因为cv2.setMouseCallback相当于外部中断了

准备好了吗?上一点有难度的

import cv2
import numpy as np
drawing = False # true if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix,iy = -1,-1

# mouse callback function
def draw_circle(event,x,y,flags,param):
global ix,iy,drawing,mode

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),(0,255,0),-1)
else:
cv2.circle(img,(x,y),5,(0,0,255),-1)

elif event == cv2.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
cv2.circle(img,(x,y),5,(0,0,255),-1)

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()

这里用了两个变量,一个是drawing一个是mode

可以看见drawing默认为false,只在鼠标左键为down的时候变成true,左键up就又变成false。这个变量控制着画图与否,当MOUSEMOVE即鼠标移动的时候会检查这个变量的状态,只有为true才画图

mode是在while中改变的变量,每次按下m键即改变一次mode的状态。这个变量控制着画出图形的种类,在MOUSEMOVE时它为true画矩形,为false画圆

当鼠标不移动时也可以画图,就是在鼠标弹起为up的一瞬间,将drawing置为false并画出矩形或圆

因此这段程序实现的功能是:鼠标按下时移动鼠标会画出图形,图形的种类根据m键确定;鼠标弹起的一瞬间也会画图形

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv python 官方 教程