在处理图像时,可能需要与当前正在处理的图像进行交互。OpenCV
提供了鼠标事件,使用户可以通过鼠标与图像交互。鼠标事件能够识别常用的鼠标操作,例如:针对不同按键的单击、双击,鼠标的滑动、拖曳等。
例如,用户单击鼠标,我们就画一个圆。通常的做法是,创建一个 OnMouseAction()响应函数,将要实现的操作写在该响应函数
内。响应函数是按照固定的格式创建的,其格式为:
def OnMouseAction(event,x,y,flags,param):
式中:
定义响应函数以后,要将该函数与一个特定的窗口建立联系(绑定),让该窗口内的鼠标触发事件时,能够找到该响应函数并执行。要将函数与窗 口绑定,可以通过 函 数cv2.setMouseCallback()
实现,其基本语法格式是:
cv2.setMouseCallback(winname,onMouse)
式中:
import cv2
import numpy as np
def Demo(event,x,y,flags,param):
if event == cv2.EVENT_LBUTTONDOWN:
print("单击了鼠标左键")
elif event==cv2.EVENT_RBUTTONDOWN :
print("单击了鼠标右键")
elif flags==cv2.EVENT_FLAG_LBUTTON:
print("按住左键拖动了鼠标")
elif event==cv2.EVENT_MBUTTONDOWN :
print("单击了中间键")
# 创建名称为 Demo 的响应(回调)函数 OnMouseAction
# 将响应函数 Demo 与窗口“Demo19.9”建立连接(实现绑定)
img = np.ones((300,300,3),np.uint8)*255
cv2.namedWindow('jiaohu01')
cv2.setMouseCallback('jiaohu01',Demo)
cv2.imshow('jiaohu01',img)
cv2.waitKey()
cv2.destroyAllWindows()
说明:可以通过下面的方法查看 OpenCV 所支持的鼠标事件:
import cv2
events=[i for i in dir(cv2) if 'EVENT'in i]
print(events)
滚动条(Trackbar)在 OpenCV 中是非常方便的交互工具,它依附于特定的窗口而存在。
通过调节滚动条能够设置、获取指定范围内的特定值。
在 OpenCV 中,函数 cv2.createTrackbar()用来定义滚动条,其语法格式为:
cv2.createTrackbar(trackbarname, winname, value, count, onChange)
式中:
函数 cv2.createTrackbar()用于生成一个滚动条
。拖动滚动条,就可以设置滚动条的值,并让滚动条返回对应的值。滚动条的值可以通过函数 cv2.getTrackbarPos()
获取,其语法格式为:
retval=getTrackbarPos( trackbarname,winname )
式中:
在 RGB 颜色空间中,任何颜色都是由红(R)、绿(G)、蓝(B)三种颜色构成的,每一种颜色分量的区间是[0, 255]。
本节用函数 cv2.createTrackbar()和函数 cv2.getTrackbarPos()设计
一个模拟调色板:在窗体中,有三个滚动条分别用来设置 R、G、B 的值,调色板会根据当前的 R、G、B 值实时显示其所对应的颜色。
import cv2
import numpy as np
def changeColor(x):
r=cv2.getTrackbarPos('R','image')
g=cv2.getTrackbarPos('G','image')
b=cv2.getTrackbarPos('B','image')
img[:]=[b,g,r]
img=np.zeros((100,700,3),np.uint8)
cv2.namedWindow('image')
cv2.createTrackbar('R','image',0,255,changeColor)
cv2.createTrackbar('G','image',0,255,changeColor)
cv2.createTrackbar('B','image',0,255,changeColor)
while(1):
cv2.imshow('image',img)
k=cv2.waitKey(1)&0xFF
if k==27:
break
cv2.destroyAllWindows()
import cv2
Type=0 # 阈值处理方式
Value=0 # 使用的阈值
def onType(a):
Type= cv2.getTrackbarPos(tType, windowName)
Value= cv2.getTrackbarPos(tValue, windowName)
ret, dst = cv2.threshold(o, Value,255, Type)
cv2.imshow(windowName,dst)
def onValue(a):
Type= cv2.getTrackbarPos(tType, windowName)
Value= cv2.getTrackbarPos(tValue, windowName)
ret, dst = cv2.threshold(o, Value, 255, Type)
cv2.imshow(windowName,dst)
o = cv2.imread("lena.png",0)
windowName = "demo.13" #窗体名
cv2.namedWindow(windowName)
cv2.imshow(windowName,o)
# 创建两个滚动条
tType = "Type" # 用来选取阈值处理方式的滚动条
tValue = "Value" # 用来选取阈值的滚动条
cv2.createTrackbar(tType, windowName, 0, 4, onType)
cv2.createTrackbar(tValue, windowName,0, 255, onValue)
if cv2.waitKey(0) == 27:
cv2.destroyAllWindows()
运行程序,在窗体对象内,同时显示控制阈值和阈值处理方式的两个滚动条。调整滚动条可以分别控制阈值处理时所使用的阈值和阈值处理方式,运行结果如图