OpenCV学习之路(三)处理鼠标事件

写在最前:本章的目标是学会如何用OpenCV处理鼠标事件,我们将会学会几个函数。

OnMouse(event,x,y,flags,param)

setMouseCallback(windowsname,OnMouse)

这两个函数搭配使用便可以处理鼠标传来的事件并进行相关操作。

  • event表示鼠标事件:
EVENT_MOUSEMOVE             #滑动
EVENT_LBUTTONDOWN           #左键点击
EVENT_RBUTTONDOWN           #右键点击
EVENT_MBUTTONDOWN           #中键点击
EVENT_LBUTTONUP             #左键放开
EVENT_RBUTTONUP             #右键放开
EVENT_MBUTTONUP             #中键放开
EVENT_LBUTTONDBLCLK         #左键双击
EVENT_RBUTTONDBLCLK         #右键双击
EVENT_MBUTTONDBLCLK         #中键双击
  • x,y表示鼠标在窗口的坐标
  • falgs表示鼠标的拖拽事件或者键鼠联合事件
EVENT_FLAG_LBUTTON        #左鍵拖曳  
EVENT_FLAG_RBUTTON        #右鍵拖曳  
EVENT_FLAG_MBUTTON        #中鍵拖曳  
EVENT_FLAG_CTRLKEY        #(8~15)按Ctrl不放事件  
EVENT_FLAG_SHIFTKEY      #(16~31)按Shift不放事件  
EVENT_FLAG_ALTKEY        #(32~39)按Alt不放事件  

在我的理解,OnMouse这个函数的参数是固定的,这个函数的用处就是告诉setMouseCallBack鼠标发生了什么事件,这个事件对应的操作是什么,具体不必深究。

例1:

鼠标左键单击一次就画一个圆

import numpy as np
import cv2
def OnMouse(event,x,y,flags,param):
  if event == cv2.EVENT_LBUTTONDOWN:
    cv2.circle(img,(x,y),50,(255,0,0),5)
img=np.zeros((520,520,3),np.uint8)#创建一个520*520的黑色底板
cv2.namedWindow('image')
cv2.setMouseCallback('image',OnMouse)
while(True):
  cv2.imshow('image',img)
  if cv2.waitKey(1)&0xFF == ord('e'):
    break
cv2.destroyAllWindows()
例2

实现类似画图工具的简单功能,左键拖动画线,左键拖动画矩形。使用e键切换这两个功能。

import numpy as np
import cv2
#全局变量
drawing=False#鼠标点击即为True
mode=True
ix=-1
iy=-1
def OnMouse(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 and flags==cv2.EVENT_FLAG_LBUTTON:
    if drawing == True:
      if mode == True:
        cv2.rectangle(img,(ix,iy),(x,y),(255,255,0),3)#绘制矩形
      else:
        cv2.circle(img,(x,y),3,(255,0,0),-1)#很多小圆连在一起就是线
  elif event== cv2.EVENT_LBUTTONUP:#按键抬起则推出
    drawing=False

img=np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',OnMouse)
while(True):
  cv2.imshow('image',img)
  k=cv2.waitKey(25)&0xFF
  if k == ord('e'):
    mode=not mode
  elif k == ord('s'):
    break
cv2.destroyAllWindows()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值