计算机视觉OpenCv学习系列:第四部分、键盘+鼠标响应操作

这篇具有很好参考价值的文章主要介绍了计算机视觉OpenCv学习系列:第四部分、键盘+鼠标响应操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第一节、键盘响应操作

键盘响应中有一个函数叫做waitKey,所有的获取键盘键值都是通过waitKey函数实现的。

1.键盘响应事件


  • cv.waitKey( [, delay] ) --> retval
  • delay如果没有声明或者delay=0,表示一直阻塞
  • delay大于0,表示阻塞指定毫秒数
  • retval返回的对应键盘键值,注意:在不同的操作系统中可能会有差异!
  • 典型的retval = 27是ESC按键(windows环境下)

用户通过敲击键盘,操作系统会返回键值给各个应用程序,当返回键值给OpenCV的时候,如果我们有自己定义的接收返回值的方法,就会按照我们定义的方法对返回值进行处理。

键盘属于外部设备,由操作系统负责监听响应,当键盘发出响应被操作系统接收后,操作系统根据发出注册的应用程序返回接收到的键盘值。

2.键盘响应


  • 检查返回键值,根据不同键值完成不同操作
  • 推荐使用if-elif-else, switch-case方式python3.10支持
# 例如借助if-elif-else来处理我们需要的键值
if <expr>:
    <statement(s)>
elif <expr>:
    <statement(s)>
elif <expr>:
    <statement(s)>
    ...
else:
    <statement(s)>

3.代码练习与测试


例如我们可以按照如下设定:

  • 按ESC退出程序
  • 按1显示HSV图像
  • 按2显示YCrCb图像
  • 按3显示RGB图像
  • 按0恢复原图BGR显示
def keyboard_demo():
    image = cv.imread(r"F:\python\opencv-4.x\samples\data\butterfly.jpg")
    cv.namedWindow("keyboard_demo", cv.WINDOW_AUTOSIZE)
    cv.imshow("keyboard_demo", image)
    while True:
        c = cv.waitKey(10)  # 停顿10ms
        # ESC
        if c == 27:
            break
        # key = 0
        elif c == 48:
            cv.imshow("keyboard_demo", image)
        # key = 1
        elif c == 49:
            hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
            cv.imshow("keyboard_demo", hsv)
        # key = 2
        elif c == 50:
            ycrcb = cv.cvtColor(image, cv.COLOR_BGR2YCrCb)
            cv.imshow("keyboard_demo", ycrcb)
        # key = 3
        elif c == 51:
            rgb = cv.cvtColor(image, cv.COLOR_BGR2RGB)
            cv.imshow("keyboard_demo", rgb)
        else:
            if c != -1:
                print("Key: ", c, "is not define.")
    cv.waitKey(0)
    cv.destroyAllWindows()

结果示例:

从左往右依次是BGR/HSV/YCrCb/RGB:

计算机视觉OpenCv学习系列:第四部分、键盘+鼠标响应操作

如果键入了没有定义的键值就会按照else中写的返回一个结果如下图所示:

计算机视觉OpenCv学习系列:第四部分、键盘+鼠标响应操作

第二节、鼠标操作与响应

1.鼠标事件与回调


和键盘一样,鼠标属于外部设备,由操作系统负责监听响应,当鼠标发出响应被操作系统接收后,操作系统根据发出注册的应用程序返回接收到的鼠标值。

注册与回调过程非常类似滚动条的操作。

计算机视觉OpenCv学习系列:第四部分、键盘+鼠标响应操作

鼠标支持的事件:

  • 左键操作:

计算机视觉OpenCv学习系列:第四部分、键盘+鼠标响应操作

  • 右键操作:

计算机视觉OpenCv学习系列:第四部分、键盘+鼠标响应操作

  • 中键+滚轮操作:

计算机视觉OpenCv学习系列:第四部分、键盘+鼠标响应操作

1.EVENT_LBUTTONDOWN
2.EVENT_MOUSEMOVE
3.EVENT_LBUTTONUP
# 以上是三个非常重要的鼠标事件,这三个动作要在一套动作中完成
鼠标左键按下、鼠标移动、鼠标左键弹起

2.鼠标操作


# 鼠标回调函数
1. cv2.setMouseCallback(windowName, onMouse, param=None) 
# windowName:窗口名称
# onMouse:鼠标响应函数
# param:响应函数传递的的参数

# 鼠标响应函数
2. onMouse(event, x, y, flags, param)
# event:鼠标事件,可用参数对应值代替
# x:鼠标x坐标
# y:鼠标y坐标
# flags:鼠标状态,可用参数对应值代替
# param:param是用户定义的传递到setMouseCallback函数调用的参数

3.代码练习与测试


绘制矩形:

计算机视觉OpenCv学习系列:第四部分、键盘+鼠标响应操作

  • 鼠标绘制第一步,reset之前的绘制
  • 记录鼠标按下位置(EVENT_LBUTTONDOWN)
  • 记录鼠标移动位置,并绘制矩形(EVENT_MOUSEMOVE)
  • 抬起,记录位置,绘制最终矩形大小(EVENT_LBUTTONUP)

鼠标绘制矩形:

# 鼠标操作绘制矩形
b1 = cv.imread(r"F:\python\opencv-4.x\samples\data\starry_night.jpg")
img = np.copy(b1)
# (x1, y1)表示左上角,(x2, y2)表示右下角点
x1 = -1
x2 = -1
y1 = -1
y2 = -1


# 定义绘制矩形的注册函数
def mouse_drawing_rectangle(event, x, y, flags, parm):
    # 全局参数
    global x1, y1, x2, y2
    # 鼠标放下,赋值左上角点给x1,y1
    if event == cv.EVENT_LBUTTONDOWN:
        x1 = x
        y1 = y
    # 鼠标移动
    if event == cv.EVENT_MOUSEMOVE:
        # x1,y1初始值都是-1,如果移动过程<0说明鼠标没有摁下
        if x1 < 0 or y1 < 0:
            return
        x2 = x
        y2 = y
        dx = x2 - x1
        dy = y2 - y1
        # 移动有一定距离才会绘制
        if dx > 0 and dy > 0:
            # 矩形绘制到b1(读入的图片)上
            # img是原图
            b1[:, :, :] = img[:, :, :]  # 用原图覆盖擦除之前的绘制结果
            cv.putText(b1, "searching...", (x1, y1-5), cv.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 255), 2)
            cv.rectangle(b1, (x1, y1), (x2, y2), (255, 0, 255), 2, 8, 0)  # 移动过程中用紫色线
    if event == cv.EVENT_LBUTTONUP:
        x2 = x
        y2 = y
        dx = x2 - x1
        dy = y2 - y1
        if dx > 0 and dy > 0:
            # 矩形绘制到b1(读入的图片)上
            # img是原图
            b1[:, :, :] = img[:, :, :]  # 用原图覆盖擦除之前的绘制结果
            cv.putText(b1, "Moon", (x1, y1-5), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
            cv.rectangle(b1, (x1, y1), (x2, y2), (0, 0, 255), 2, 8, 0)  # 鼠标抬起之后用红色线
        # 重新赋值为下一次绘制做准备
        x1 = -1
        y1 = -1
        x2 = -1
        y2 = -1
        
def mouse_demo():
    cv.namedWindow("mouse_demo", cv.WINDOW_AUTOSIZE)
    # 实时关注mouse_demo画布上的响应,如果发生mouse_drawing中定义的事件,就返回响应
    cv.setMouseCallback("mouse_demo", mouse_drawing_rectangle)  # 绘制矩形
    while True:
        cv.imshow("mouse_demo", b1)  # 绘制矩形
        # 每过10ms就获取一次键盘键值,默认是-1,ESC键是27
        c = cv.waitKey(10)
        if c == 27:
            break
    cv.destroyAllWindows()

结果示例:

计算机视觉OpenCv学习系列:第四部分、键盘+鼠标响应操作

鼠标绘制圆形:

# 鼠标操作绘制圆形
b2 = cv.imread(r"F:\python\opencv-4.x\samples\data\starry_night.jpg")
img2 = np.copy(b2)
# (c1, c2)表示圆心坐标,r1表示半径
c1 = -1
c2 = -1


# 定义圆形的注册函数
def mouse_drawing_circle(event, x, y, flags, parm):
    # 全局参数
    global c1, c2, r1
    # 鼠标放下,赋值左上角点给x1,y1
    if event == cv.EVENT_LBUTTONDOWN:
        c1 = x
        c2 = y
    # 鼠标移动
    if event == cv.EVENT_MOUSEMOVE:
        # c1,c2初始值都是-1,如果移动过程<0说明鼠标没有摁下
        if c1 < 0 or c2 < 0:
            return
        dr = int(math.sqrt(pow((x-c1), 2) + pow((y-c2), 2)))
        # 移动有一定距离才会绘制
        if dr > 0:
            # 圆形绘制到b1(读入的图片)上
            # img是原图
            b2[:, :, :] = img2[:, :, :]  # 用原图覆盖擦除之前的绘制结果
            cv.circle(b2, (c1, c2), dr, (255, 0, 255), 2, cv.LINE_8)  # 移动过程中用紫色线
    if event == cv.EVENT_LBUTTONUP:
        dr = int(math.sqrt(pow((x - c1), 2) + pow((y - c2), 2)))
        if dr > 0:
            # 圆形绘制到b1(读入的图片)上
            # img是原图
            b2[:, :, :] = img2[:, :, :]  # 用原图覆盖擦除之前的绘制结果
            cv.circle(b2, (c1, c2), dr, (0, 0, 255), 2, cv.LINE_8)  # 移动过程中用红色线
        # 重新赋值为下一次绘制做准备
        c1 = -1
        c2 = -1
        
def mouse_demo():
    cv.namedWindow("mouse_demo", cv.WINDOW_AUTOSIZE)
    # 实时关注mouse_demo画布上的响应,如果发生mouse_drawing中定义的事件,就返回响应
    cv.setMouseCallback("mouse_demo", mouse_drawing_circle)  # 绘制圆形
    while True:
        cv.imshow("mouse_demo", b2)  # 绘制圆形
        # 每过10ms就获取一次键盘键值,默认是-1,ESC键是27
        c = cv.waitKey(10)
        if c == 27:
            break
    cv.destroyAllWindows()

结果示例:

计算机视觉OpenCv学习系列:第四部分、键盘+鼠标响应操作
其他有趣的实现

同时还可以实现一些有意思的功能比如实现实时响应截取以及类似qq截图的功能的,只有截图部分是亮的,其余部分是暗的。

下面代码我是单独写在一个包里面的,如果需要的话可以把他们在上面的类中调用自己试一试也是很有趣的。

import cv2 as cv
import numpy as np


# 图片区域显示
def rectangle_space(img, x1, x2, y1, y2):
    # img = cv.imread(r"F:\python\opencv-4.x\samples\data\starry_night.jpg")
    # cv.imshow("img", img)
    # img2 = img[0:256, 256:512, 1:2]  # 第一个0:256表示高度所在位置,第二个0:256表示宽度所在位置,第三个1:2表示输出通道数
    # cv.imshow("rectangle_space", img2)
    cv.imshow("rectangle_space", img[y1:y2, x1:x2, 0:3])

    cv.waitKey(1)


# 除了截图部分其余均变暗
def rectangle_dark(img, x1, x2, y1, y2):
    # img = cv.imread(r"F:\python\opencv-4.x\samples\data\starry_night.jpg")
    # cv.imshow("img", img)
    # img2 = np.zeros_like(img)
    # img2[:, :, :] = (np.uint8(60), np.uint8(60), np.uint8(60))
    # img2[0:256, 256:512, :] = 0
    # result = cv.subtract(img, img2)
    # cv.imshow("result", result)
    img2 = np.zeros_like(img)
    img2[:, :, :] = (np.uint8(60), np.uint8(60), np.uint8(60))
    img2[y1:y2, x1:x2, :] = 0
    result = cv.subtract(img, img2)
    cv.imshow("mouse_demo", result)

    cv.waitKey(1000)


# 当前程序执行部分
if __name__ == '__main__':
    print("Hello world.")
    rectangle_dark()

结果示例:

左图为实时截取,右图为类似qq截图的实现

计算机视觉OpenCv学习系列:第四部分、键盘+鼠标响应操作

学习参考

本系列所有OpenCv相关的代码示例和内容均来自博主学习的网站:opencv_course文章来源地址https://www.toymoban.com/news/detail-486159.html

到了这里,关于计算机视觉OpenCv学习系列:第四部分、键盘+鼠标响应操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《OpenCV 计算机视觉编程攻略》学习笔记(一:图像编程入门)

    参考引用 OpenCV 计算机视觉编程攻略(第3版) 说明 本书结合 C++ 和 OpenCV 3.2 全面讲解计算机视觉编程 所有代码均在 Ubuntu 系统中用 g++ 编译执行 0. 安装 OpenCV 库 在Ubuntu上安装OpenCV及使用 OpenCV 库分为多个模块 ,常见模块如下 opencv_core 模块包含库的核心功能 opencv_imgproc 模块包

    2024年02月09日
    浏览(35)
  • 计算机竞赛 深度学习 机器视觉 人脸识别系统 - opencv python

    🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习 机器视觉 人脸识别系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:3分 🧿 更多资料, 项目分享: https://gitee.com/dancheng

    2024年02月07日
    浏览(58)
  • 计算机竞赛 深度学习 opencv python 公式识别(图像识别 机器视觉)

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习的数学公式识别算法实现 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:4分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/d

    2024年02月07日
    浏览(40)
  • 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉 计算机竞赛

    🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习多目标跟踪 实时检测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/dancheng-sen

    2024年02月05日
    浏览(45)
  • 基于计算机视觉,深度学习、机器学习,OpenCV,图像分割,目标检测卷积神经网络计算机毕业设计选题题目大全选题指导

    随着深度学习、机器学习和神经网络技术的快速发展,计算机视觉领域的应用变得越来越广泛和有趣。本毕业设计旨在探索这一领域的前沿技术,将深度学习模型、神经网络架构、OpenCV图像处理工具,以及卷积神经网络(CNN)的强大能力结合起来,以解决实际图像处理问题。

    2024年02月08日
    浏览(45)
  • 实战指南:使用OpenCV 4.0+Python进行机器学习与计算机视觉

    💂 个人网站:【办公神器】【游戏大全】【神级源码资源网】 🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】 💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 计算机视觉和机器学习的融合为我们带来了前所未有的机会和挑战。从智能助手到

    2024年02月13日
    浏览(36)
  • 计算机设计大赛 深度学习人脸表情识别算法 - opencv python 机器视觉

    🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习人脸表情识别系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/

    2024年02月21日
    浏览(51)
  • 计算机竞赛 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

    🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:5分 🧿 更多资料, 项目分享: https

    2024年02月08日
    浏览(34)
  • 计算机视觉+深度学习+机器学习+opencv+目标检测跟踪+一站式学习(代码+视频+PPT)

    第1章:视觉项目资料介绍与学习指南 相关知识: 介绍计算机视觉、OpenCV库,以及课程的整体结构。 学习概要: 了解课程的目标和学习路径,为后续章节做好准备。 重要性: 提供学生对整个课程的整体认识,为学习提供框架和背景。 包括了 计算机视觉/opencv视频 视频对应

    2024年02月05日
    浏览(38)
  • 计算机设计大赛 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

    🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:5分 🧿 更多资料, 项目分享: https

    2024年02月21日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包