2.4鼠标事件
2016-02-05 16:04
417 查看
打印事件
每一个鼠标事件都有其标志,比如左键按下、左键不按下、左键双击、中键按下、滚轮滑动等。每个事件对应其标志和事件发生在屏幕上的坐标。
因此知道了事件就知道了鼠标的行为及其发生的位置。
在python命令行中输入如下三句
这里打印出的事件有ALT、CTRL、SHIFT等键和各种鼠标动作,直接看英文就可以了。
事件函数与回调函数
我们可以自己定义一个函数,每当特定事件发生即调用它。这好比单片机的外部中断。
说别的没用,上代码
类型是指什么事件,左键按下、左键双击等,这个可以在上面的命令行操作中print出来。这里cv2.EVENT_LBUTTONDBLCLK是左键双击
坐标是双击时鼠标的位置
这个函数的意思是,每次鼠标双击时就在双击的地方画一个圆,半径为100,蓝色,内部填充
下面的img和namedwindow是建立初始图片
cv2.setMouseCallback是对'image'这个窗口作用draw_circle函数,每次鼠标事件发生时,这个函数将被调用一次,再在这个函数中调用draw_circle函数
后面的主循环中并没有看到调用函数的痕迹,因为cv2.setMouseCallback相当于外部中断了
准备好了吗?上一点有难度的
这里用了两个变量,一个是drawing一个是mode
可以看见drawing默认为false,只在鼠标左键为down的时候变成true,左键up就又变成false。这个变量控制着画图与否,当MOUSEMOVE即鼠标移动的时候会检查这个变量的状态,只有为true才画图
mode是在while中改变的变量,每次按下m键即改变一次mode的状态。这个变量控制着画出图形的种类,在MOUSEMOVE时它为true画矩形,为false画圆
当鼠标不移动时也可以画图,就是在鼠标弹起为up的一瞬间,将drawing置为false并画出矩形或圆
因此这段程序实现的功能是:鼠标按下时移动鼠标会画出图形,图形的种类根据m键确定;鼠标弹起的一瞬间也会画图形
每一个鼠标事件都有其标志,比如左键按下、左键不按下、左键双击、中键按下、滚轮滑动等。每个事件对应其标志和事件发生在屏幕上的坐标。
因此知道了事件就知道了鼠标的行为及其发生的位置。
在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键确定;鼠标弹起的一瞬间也会画图形
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- Extjs4.0 最新最全视频教程
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- OpenERP 的XML-RPC的实例+many2many,one2many,many2one...
- CSS3属性教程与案例分享
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- jquery教程靠边站,一分钱不花让你免费学会jquery
- Python在CAM软件Genesis2000中的应用