初次尝试
opencv鼠标事件的响应:
- CV_EVENT_MOUSEMOVE =0,//移动
- CV_EVENT_LBUTTONDOWN =1,//左键按下
- CV_EVENT_RBUTTONDOWN =2,//右键按下
- CV_EVENT_MBUTTONDOWN =3,//中键按下
- CV_EVENT_LBUTTONUP =4,//左键弹起
- CV_EVENT_RBUTTONUP =5,//右键弹起
- CV_EVENT_MBUTTONUP =6,//中键弹起
- CV_EVENT_LBUTTONDBLCLK =7,//左键点击
- CV_EVENT_RBUTTONDBLCLK =8,//右键点击
- CV_EVENT_MBUTTONDBLCLK =9,//中键点击
代码:鼠标点击绘图
"""mouse as a paint-brush"""
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)
# name a window
cv2.namedWindow('image')
# 鼠标点击,调用鼠标回调函数
cv2.setMouseCallback('image',draw_circle)
while(1):
cv2.imshow('image',img)
# esc退出
if cv2.waitKey(20) & 0xFF == 27:
break
# 销毁窗口
cv2.destroyAllWindows()
值得注意的是,你需要在圆心位置重复点击鼠标两次,才能准确无误的绘出圆心。
更深层次的应用
完美的应用鼠标事件的一些方法
""" More Advanced Demo"""
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 variablity
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')
# mouse callback function
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()
试试效果如何:
看起来就是有点诡异,是鼠标的拖动有点问题。。