基本函数
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()
效果