目标:
-
在本小节你将学习用OpenCV控制鼠标事件
-
你将学习以下几个函数:cv.setMouseCallback()
一个简单的示例
这里我们来创建一个简单的程序,他会在图片上你双击过的位置绘制一个圆圈。首先我们来创建一个鼠标事件回调函数,但鼠标事件发生是他就会被执行。鼠标事件可以是鼠标上的任何动作,比如左键按下,左键松开,左键双击等。我们可以通过鼠标事件获得与鼠标对应的图片上的坐标。根据这些信息我们可以做任何我们想做的事。你可以通过执行下列代码查看所有被支持的鼠标事件:
import cv2 as cv events = [i for i in dir(cv) if 'EVENT' in i] print( events )
所有的鼠标事件回调函数都有一个统一的格式,他们所不同的地方仅仅是被调用后的功能。我们只需要鼠标事件回调函数做一件事:在双击过的地方绘制一个圆形。下面是代码,可以通过注释理解代码:
import numpy as np import cv2 as cv # mouse callback functiondef draw_circle(event,x,y,flags,param): if event == cv.EVENT_LBUTTONDBLCLK: cv.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) cv.namedWindow('image') cv.setMouseCallback('image',draw_circle) while(1): cv.imshow('image',img) if cv.waitKey(20) & 0xFF == 27: break cv.destroyAllWindows()
一个更高级的示例
现在我们来创建一个更好的程序。这次我们的程序要完成的任务是根据我们选择的模式在拖动鼠标时绘制矩形或者是圆圈(就像画图程序中一样)。所以我们的回调函数包含两部分,一部分画矩形,一部分画圆圈。这是一个典型的例子他可以帮助我们更好理解与构建人机交互式程序,比如物体跟踪,图像分割等。 参考以下代码:
import cv2 as cv 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 ix,iy,drawing,mode if event == cv.EVENT_LBUTTONDOWN: drawing = True ix,iy = x,y elif event == cv.EVENT_MOUSEMOVE: if drawing == True: if mode == True: cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1) else: cv.circle(img,(x,y),5,(0,0,255),-1) elif event == cv.EVENT_LBUTTONUP: drawing = False if mode == True: cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1) else: cv.circle(img,(x,y),5,(0,0,255),-1) 接下来,我们必须将此鼠标回调函数绑定到OpenCV窗口。在主循环中,我们应该把按键'm'设置为切换绘制矩形还是圆形。 参考以下代码: img = np.zeros((512,512,3), np.uint8) cv.namedWindow('image') cv.setMouseCallback('image',draw_circle) while(1): cv.imshow('image',img) k = cv.waitKey(1) & 0xFF if k == ord('m'): mode = not mode elif k == 27: break cv.destroyAllWindows()
轨迹栏作为调色板
目标:
-
在本小节你将学习把轨道栏绑定到OpenCV窗口中
-
你将学习以下几个函数:cv.getTrackbarPos(), cv.createTrackbar()
代码示例
在这里,我们将创建一个简单的应用程序,完成显示指定的颜色。你有一个显示颜色的窗口和三个轨道栏,分别用于指定B,G,R各颜色。你可以滑动轨迹栏并相应地更改窗口所显示的颜色。默认情况下,初始颜色将设置为黑色。
对于cv.getTrackbarPos()函数,第一个参数是轨道栏名称,第二个参数是它所附加的窗口名称,第三个参数是默认值,第四个参数是最大值,第五个参数是执行的回调函数每次轨迹栏值都会发生变化。回调函数始终具有默认参数,即轨迹栏位置。在我们的例子中,函数什么都不做,所以我们简单地跳过。
轨迹栏的另一个重要应用是将其用作按钮或开关。默认情况下,OpenCV没有按钮功能。因此,你可以使用跟踪栏来获得此类功能。在我们的应用程序中,我们创建了一个开关,其中应用程序仅在开关打开时有效,否则屏幕始终为黑色。 参考一下代码:
import numpy as np import cv2 as cv def nothing(x): pass# Create a black image, a windowimg = np.zeros((300,512,3), np.uint8) cv.namedWindow('image') # create trackbars for color changecv.createTrackbar('R','image',0,255,nothing) cv.createTrackbar('G','image',0,255,nothing) cv.createTrackbar('B','image',0,255,nothing) # create switch for ON/OFF functionalityswitch = '0 : OFF n1 : ON'cv.createTrackbar(switch, 'image',0,1,nothing) while(1): cv.imshow('image',img) k = cv.waitKey(1) & 0xFFif k == 27: break# get current positions of four trackbarsr = cv.getTrackbarPos('R','image') g = cv.getTrackbarPos('G','image') b = cv.getTrackbarPos('B','image') s = cv.getTrackbarPos(switch,'image') if s == 0: img[:] = 0else: img[:] = [b,g,r] if cv.waitKey(1) & 0xFF == ord('q'): break
cv.destroyAllWindows()
窗口将如下图所示: