纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

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

拜阳   2021-10-09 我要评论
想了解python opencv鼠标交互操作的实用指南的相关内容吗,拜阳在本文为您仔细讲解python opencv鼠标交互操作的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:opencv鼠标事件,python调用鼠标,opencv鼠标操作,下面大家一起来学习吧。

前言

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绘制移动均线 Python绘制移动均线方法 含源代码

    想了解Python绘制移动均线方法 含源代码的相关内容吗,恒生LIGHT云社区在本文为您仔细讲解Python绘制移动均线的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Python绘制移动均线,Python,移动均线,下面大家一起来学习吧。..
  • Python OPP Python强化练习之PyTorch opp算法实现月球登陆器

    想了解Python强化练习之PyTorch opp算法实现月球登陆器的相关内容吗,我是小白呀在本文为您仔细讲解Python OPP的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Python,OPP,Python,OPP,月球登陆器,Python,PyTorch,下面大家一起来学习吧。..

网友评论

Copyright 2020 www.ebook4download.net 【E4软件站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式