openCV入门 Gui特性 4 鼠标操作

基本函数

def on_Mouse(event,x,y,flags,param):
   #定义鼠标回调函数
   #event:鼠标事件
   #x,y:鼠标目前所在点
   #flags:记录了一些专门的操作
   #param:从setMouseCallback()里传递过来的参数,可选
   if event==cv2.EVENT_LBUTTONDBLCLK:
   		 cv2.circle(img,(x,y),100,(255,0,0),-1)
   		 
cv2.namedWindow('image')   		 
cv2.setMouseCallback('image',on_Mouse)
   #定义完成后需要注册该回调函数

创建窗口并调整大小

img=np.zeros((512,512,3),np.uint8) 
cv2.namedWindow('image')

event(鼠标事件)及flags

cv2.EVENT_MOUSEMOVE	    0	鼠标移动
cv2.EVENT_LBUTTONDOWN	1	左键单击
cv2.EVENT_RBUTTONDOWN	2	右键单击
cv2.EVENT_MBUTTONDOWN	3	中键单击
cv2.EVENT_LBUTTONUP	    4	左键释放
cv2.EVENT_RBUTTONUP		5	右键释放
cv2.EVENT_MBUTTONUP		6	中键释放
cv2.EVENT_LBUTTONDBLCLK	7	左键双击
cv2.EVENT_RBUTTONDBLCLK	8	右键双击
cv2.EVENT_MBUTTONDBLCLK	9	中键双击

cv2.EVENT_FLAG_LBUTTON	1	鼠标左键按下状态(拖拽)
cv2.EVENT_FLAG_RBUTTON	2	鼠标右键按下状态
cv2.EVENT_FlAG_MBUTTON	4	鼠标中键按下状态
cv2.EVENT_FLAG_CTRLKEY	8	指示CTRL键按下状态
cv2.EVENT_FLAG_SHIFTKEY	16	指示SHIFT键按下状态
cv2.EVENT_FLAG_ALTKEY	32	指示ALT键按下状态

鼠标左键画圆,右键画矩形

import cv2
import numpy as np
import math

n = 0
ix, iy = -1, -1
xl, yl, l = 0, 0, 0

#创建回调函数
def onMouse(event, x, y, flags, param):
    color=(0,255,0)
    global ix, iy, n   #global:在函数内的值更改,函数外也同样更改
#左键拖拽时记录起始坐标
    if event == cv2.EVENT_FLAG_LBUTTON:
        ix, iy = x, y

#当鼠标松开左键时停止绘画
#通过圆心和半径拖拽法画圆
    if event == cv2.EVENT_LBUTTONUP:

        #计算半径的长度
        xlm = (x - ix)
        ylm = (y - iy)
        le = math.sqrt(xlm * xlm + ylm * ylm)
        #转换数据类型
        le = int(le)
        #画圆
        cv2.circle(img, (ix, iy), le, color, 8)

#两点法画矩形
      #右键单击,画第一个点
    if event == cv2.EVENT_RBUTTONDOWN:
        if n == 0:
            n += 1
            ix, iy = x, y
            #画第一个端点
            cv2.circle(img, (x, y), 2, color, -1)
        else:
            n = 0
            #根据第一个端点和第二个点画矩形
            cv2.rectangle(img, (ix, iy), (x, y), color, 5)

#可调整image大小
img = np.zeros((512, 1000, 3), np.uint8)
cv2.namedWindow('image', 0)
cv2.setMouseCallback('image', onMouse)
while 1:
    cv2.imshow('image', img)
    k = cv2.waitKey(1) & 0XFF
    if k == 27:
        break
cv2.destroyAllWindows()

效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@bwang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值