04-opencv-python-处理鼠标事件

创建鼠标时间回调函数,当鼠标事件发生的时候就会被执行。

所有的鼠标事件回调函数都有一个统一的格式,不同的地方是被调用后的功能。

根据opencv的官方文档,鼠标的事件有:

鼠标事件

注意注意!!!如下所示:

MouseEvent FlagsEVENT_FLAG_ALTKEY摁住Alt

这里指的是

要是按住这些键,在图像中拖动鼠标就会留出痕迹

连续的

EVENT_FLAG_CTRLKEY摁住Ctrl
EVENT_FLAG_LBUTTON摁住左键
EVENT_FLAG_MBUTTON摁住中键
EVENT_FLAG_RBUTTON摁住右键
EVENT_FLAG_SHIFTKEY摁住Shift
----------------------------------------------------------------------------------

MouseEvent    Type

EVENT_LBUTTONDBLCLK左键双击

这里指的是

要是进行这些操作,在图像中当时的鼠标就会留出痕迹

(除了这个鼠标移动,其他都是间断的

EVENT_LBUTTONDOWN左键击下
EVENT_LBUTTONUP左键弹起
EVENT_MBUTTONDBLCLK中键双击
EVENT_MBUTTONDOWN中键击下
EVENT_MBUTTONUP中键弹起
EVENT_MOUSEHWHEEL滚动条向左,flags>0。向右,flags<0
EVENT_MOUSEMOVE鼠标移动
EVENT_MOUSEWHEEL滚动条向上,flags>0。向下,flags<0
EVENT_RBUTTONDBLCLK右键双击
EVENT_RBUTTONDOWN右键击下
EVENT_RBUTTONUP右键弹起

代码示例一:

import cv2
import numpy as np

def Mouse_event(event,x,y,flags,param):
    if event == cv2.EVENT_MOUSEMOVE:
        cv2.circle(img,(x,y),50,(255,255,255),-1)
    if flags == cv2.EVENT_FLAG_LBUTTON:
        cv2.circle(img, (x, y),20, (0, 255, 0), -1)

img = np.zeros((500,500,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',Mouse_event)

while True:
    cv2.imshow('image',img)
    key = cv2.waitKey(1) & 0xFF
    if key == ord('q'):
        break
cv2.destroyAllWindows()

注意注意!!!

Mouse_event(event,x,y,flags,param)这个函数括号里面的参数的位置必须是

event,x,y,flags,param,不能写的不一样,否则无法调用或者调用默认值了

可以看一下官网上的文档,对于event和flags,对照一下代码里面的内容,你姑且可以看成是两种操作方式(两种鼠标的处理方式)

 

代码示例二:

import cv2
import numpy as np

drawing = False
#表示能不能进行画图
mode = True
#切换画图的模式
ix , iy = -1 ,-1

def Mouse_event(event,x,y,flags,param):
    global ix,iy,drawing,mode
    if event == cv2.EVENT_LBUTTONDOWN:
        #只要检测到鼠标按下去了,drawing = True:就表示做好画图的准备了
        drawing = True
        ix,iy = x,y
        #作为画图的起点
        print(ix,iy,drawing,mode)
    elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
        #如果鼠标处于拖动的状态,而且是按下的状态,也就是按着拖动的状态
        if drawing == True:
            #可以画图准备的
            if mode == True:
                #处于画方图的模式中
                print('画方图中',ix, iy, drawing, mode)
                cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),5)
            else:
                #处于画圆图的模式中
                print('画圆图中',ix, iy, drawing, mode)
                cv2.circle(img, (x, y),20, (255, 255, 255), -1)
    elif event == cv2.EVENT_LBUTTONUP:
        #如果鼠标弹起了,表示鼠标不在是处于画图模式了
        drawing = False

img = np.zeros((800,800,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',Mouse_event)

while True:
    cv2.imshow('image',img)
    key = cv2.waitKey(1) & 0xFF
    if key == ord('q'):
        break
    elif key == ord('m'):
        mode = not mode
cv2.destroyAllWindows()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值