学习用 OpenCV 处理鼠标事件
你将学习这些函数:**cv.setMouseCallback()**
学习将轨迹栏绑定到 OpenCV 窗口。
你将学习这些函数:**cv.getTrackbarPos(), **cv.createTrackbar() 等等。
步骤
定义一个鼠标回调函数(mouse_callback)——创建窗口——设置回调函数(setMouseCallback)——显示窗口和背景——退出窗口
代码
#!/user/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy
import numpy as np
# events = [i for i in dir(cv2) if 'EVENT' in i]
# print(events)
# 定义鼠标回调函数
def mouse_callback(event,x,y,flags,underdata):
# if event == cv2.EVENT_LBUTTONDBLCLK:
# cv2.circle(img, (x, y), 100, (255, 0, 0), -1)
print(event,x,y,flags,underdata)
# 创建窗口
cv2.namedWindow('mouse',cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse',640,360)
# 设置回调函数
cv2.setMouseCallback('mouse',mouse_callback,'123')
#显示窗口和背景
img = np.zeros((360,640,3),np.uint8)
while True:
cv2.imshow('mouse',img)
key = cv2.waitKey(1)
if key & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
cv.createTrackbar() 函数,第一个参数是轨迹栏名字,第二个参数是被附上的窗口名字,第三个参数是默认值,第四个是最大值,第五个是回调函数——滑条改变所执行的函数。这个回调函数也有一个默认参数,表示轨迹栏位置。
轨迹栏的另一个重要应用是用作按钮或者开关。OpenCV在默认情况下没有按钮功能,因此我们用轨迹栏实现这样的功能。在我们的程序中创建了一个开关,其中程序只会在开关打开时有效,否则屏幕始终是黑色。
#!/user/bin/env python3
# -*- coding: utf-8 -*-
import numpy as np
import cv2 as cv
def nothing(x):
pass
# 创建一个黑色图像,一个窗口
img = np.zeros((300,512,3), np.uint8)
cv.namedWindow('image')
# 创建一个改变颜色的轨迹栏
cv.createTrackbar('R','image',0,255,nothing)
cv.createTrackbar('G','image',0,255,nothing)
cv.createTrackbar('B','image',0,255,nothing)
# 创建一个用来启用和关闭功能的开关
switch = '0 : OFF \n1 : ON'
cv.createTrackbar(switch, 'image',0,1,nothing)
while(1):
cv.imshow('image',img)
k = cv.waitKey(1) & 0xFF
if k == 27: # ESC键
break
# get current positions of four trackbars
r = cv.getTrackbarPos('R','image')
g = cv.getTrackbarPos('G','image')
b = cv.getTrackbarPos('B','image')
s = cv.getTrackbarPos(switch,'image')
if s == 0:
img[:] = 0
else:
img[:] = [b,g,r]
cv.destroyAllWindows()
#!/user/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np
def callback():
pass
# 创建窗口
cv2.namedWindow('trackbar',cv2.WINDOW_NORMAL)
# 创建trackbar
cv2.createTrackbar('R','trackbar',0,255,callback)
cv2.createTrackbar('G','trackbar',0,255,callback)
cv2.createTrackbar('B','trackbar',0,255,callback)
# 创建一个背景图片
img = np.zeros((480,460,3),np.uint8)
while True:
# 获取当前trackbar的值
r = cv2.getTrackbarPos('R','trackbar')
g = cv2.getTrackbarPos('G', 'trackbar')
b = cv2.getTrackbarPos('B', 'trackbar')
#改变背景颜色
img[:] = [b, g, r]
cv2.imshow('trackbar', img)
key = cv2.waitKey(10)
if key & 0xFF == ord('q'):
break
cv2.destroyAllWindows()