python教程分享python opencv鼠标交互操作的实用指南

目录
  • cv2.setmousecallback(windowname, onmouse [, param])
  • 鼠标回调函数:onmouse(event, x, y, flags, param)

前言

opencv的鼠标交互操作主要通过两个函数实现:

  • 第一个是cv2.setmousecallback(windowname, onmouse [, param])
  • 第二个是setmousecallback()的第二个参数,称为鼠标回调函数onmouse(event, x, y, flags, param)

下面分别对二者进行说明,并举一个简单的例子说明其用法。

cv2.setmousecallback(windowname, onmouse [, param])

参数说明:

  • windowname:必需。类似于cv.imshow()函数,opencv具体操作哪个窗口以窗口名作为识别标识,这有点类似窗口句柄的概念。
  • onmouse:必需。鼠标回调函数。鼠标回调函数的定义是onmouse(event, x, y, flags, param),我们想要做什么鼠标操作,都是在这个函数内实现。
  • param:可选。请注意到onmouse里面也有一个param参数,它与是setmousecallback里的param是同一个,更直白一点说,这个param是onmouse和setmousecallback之间的参数通信接口。

鼠标回调函数:onmouse(event, x, y, flags, param)

这个参数列表不要改变它,除了param外其他都是由回调函数自动获取值。

参数说明:

  • event:由回调函数根据鼠标对图像的操作自动获得,内容包含左键点击,左键弹起,右键点击…等等等非常多的操作。
  • x,y:由回调函数自动获得,记录了鼠标当前位置的坐标,坐标以图像左上角为原点(0, 0),x方向向右为正,y方向向下为正。
  • flags:记录了一些专门的操作,下面有说明。
  • param:从setmousecallback()里传递过来的参数。该参数在setmousecallback()处是可选参数,所以可以不设置。

event和flags的种类:

可以使用如下代码获得event的种类

  # -*- coding: utf-8 -*-  import cv2  events = [i for i in dir(cv2) if 'event' in i]  print(events)  

结果分为两部分,下面以event_flag_开头的是flags对应的状态,其它的是event对应的状态。
flags和event似乎不能同时起作用,也就是说,我们无法通过同时判断这两个条件来实现组合键操作。

[‘event_flag_altkey’, ‘event_flag_ctrlkey’, ‘event_flag_lbutton’, ‘event_flag_mbutton’, ‘event_flag_rbutton’, ‘event_flag_shiftkey’, ‘event_lbuttondblclk’, ‘event_lbuttondown’, ‘event_lbuttonup’, ‘event_mbuttondblclk’, ‘event_mbuttondown’, ‘event_mbuttonup’, ‘event_mousehwheel’, ‘event_mousemove’, ‘event_mousewheel’, ‘event_rbuttondblclk’, ‘event_rbuttondown’, ‘event_rbuttonup’]

示例

下面是一个简单的示例,运行程序后,我们可以通过鼠标左键单击来画一些十字线。

  # -*- coding: utf-8 -*-    import cv2  import numpy as np    win_name = 'pick_points'      def onmouse_pick_points(event, x, y, flags, param):      if event == cv2.event_lbuttondown:          print('x = %d, y = %d' % (x, y))          cv2.drawmarker(param, (x, y), (0, 255, 0))      if __name__ == '__main__':      image = np.zeros((256, 256, 3), np.uint8)      cv2.namedwindow(win_name, 0)      cv2.setmousecallback(win_name, onmouse_pick_points, image)      while true:          cv2.imshow(win_name, image)          key = cv2.waitkey(30)          if key == 27:  # esc              break      cv2.destroyallwindows()  

上面程序中有几个注意点:

  • setmousecallback()中的param参数我们传递了image进去,也就是说鼠标回调函数onmouse_pick_points()中的param就是image,画十字线的操作在鼠标回调函数中,该参数在onmouse_pick_points中的变化可以保留到函数外,可以理解为c++的引用传递,或c语言的指针传递。
  • 需要一个无限循环来刷新图像。
  • 无限循环的退出条件由键盘获取,cv2.waitkey()用来获取键盘的按键,当我们点esc后就可以退出。

这里点了三次左键,终端输出以下内容:

  x = 60, y = 55  x = 206, y = 113  x = 114, y = 192  

并得到这样一张图像:

python opencv鼠标交互操作的实用指南

总结

到此这篇关于python opencv鼠标交互操作的文章就介绍到这了,更多相关python opencv鼠标交互操作内容请搜索<猴子技术宅>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<猴子技术宅>!

需要了解更多python教程分享python opencv鼠标交互操作的实用指南,都可以关注python教程分享栏目—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/pythons/839589.html

发表评论

邮箱地址不会被公开。 必填项已用*标注