OpenCV-Python快速入门系列08鼠标键盘响应操作

OpenCV-Python快速入门系列08鼠标键盘响应操作

原代码

def on_mouse(event, x, y, flags, param):
    print("event=",event,"x=",x,",y=",y)

def key_mouse_demo():
    image = cv.imread('images/test.png')
    if image is None:
        print("Error: Image not found or failed to load.")
        return
    cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
    cv.imshow("input", image)
    cv.setMouseCallback("input",on_mouse,None)
    while True:
        c = cv.waitKey(1)
        if c == 48:
            cv.imshow('input', image)
        if c == 49:
            gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
            cv.imshow('input', gray)
        if c == 50:
            hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
            cv.imshow('input', hsv)
        if c == 27:
            break
    cv.destroyAllWindows()

预期效果

图片[1]-OpenCV-Python快速入门系列08鼠标键盘响应操作-天煜博客
  • 鼠标操作
    • 鼠标左键:打印点击坐标。
    • 鼠标右键:打印点击坐标。
    • 鼠标移动:实时打印鼠标位置。
  • 键盘操作
    • 0:显示原始图像。
    • 1:显示灰度图像。
    • 2:显示 HSV 图像。
    • ESC:退出程序。

程序运行流程

  • 打开窗口并显示图像。
  • 根据用户操作实时响应鼠标事件或键盘按键。
  • ESC 键退出程序。

代码优化

import cv2 as cv

# 定义鼠标事件回调函数
def on_mouse(event, x, y, flags, param):
    """
    鼠标事件回调函数
    """
    if event == cv.EVENT_LBUTTONDOWN:
        print(f"Left button clicked at ({x}, {y})")
    elif event == cv.EVENT_RBUTTONDOWN:
        print(f"Right button clicked at ({x}, {y})")
    elif event == cv.EVENT_MOUSEMOVE:
        print(f"Mouse moved to ({x}, {y})")

# 定义键盘与鼠标交互函数
def key_mouse_demo():
    """
    键盘与鼠标交互演示
    """
    # 读取图像
    image = cv.imread('images/test.png')
    if image is None:
        print("Error: Image not found or failed to load.")
        return

    # 创建窗口并显示图像
    cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
    cv.imshow("input", image)

    # 设置鼠标回调函数
    cv.setMouseCallback("input", on_mouse)

    print("Press keys to interact: 0=original, 1=grayscale, 2=HSV, ESC=exit")

    while True:
        c = cv.waitKey(1)

        # 按键 0:显示原始图像
        if c == ord('0'):
            cv.imshow("input", image)
            print("Displaying original image")

        # 按键 1:显示灰度图像
        elif c == ord('1'):
            gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
            cv.imshow("input", gray)
            print("Displaying grayscale image")

        # 按键 2:显示 HSV 图像
        elif c == ord('2'):
            hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
            cv.imshow("input", hsv)
            print("Displaying HSV image")

        # 按 ESC 键退出
        elif c == 27:  # ESC 键的 ASCII 值
            print("Exiting...")
            break

    # 释放所有窗口
    cv.destroyAllWindows()

# 调用函数
key_mouse_demo()

代码详解

1. 鼠标事件回调函数

def on_mouse(event, x, y, flags, param):
    """
    event: 鼠标事件类型(如左键按下、右键按下、移动等)。
    x, y: 鼠标事件发生时的坐标(图像坐标系)。
    flags: 事件触发时的附加标志(如 Ctrl、Shift 键是否按下)。
    param: 传递的额外参数。
    """
    if event == cv.EVENT_LBUTTONDOWN:
        print(f"Left button clicked at ({x}, {y})")  # 左键点击
    elif event == cv.EVENT_RBUTTONDOWN:
        print(f"Right button clicked at ({x}, {y})")  # 右键点击
    elif event == cv.EVENT_MOUSEMOVE:
        print(f"Mouse moved to ({x}, {y})")  # 鼠标移动

功能:

  • 通过 cv.setMouseCallback 注册此函数,可以实时捕获鼠标事件并打印其类型和位置。
  • 示例中实现了左键点击、右键点击和鼠标移动的响应。

2. 键盘交互逻辑

while True:
    c = cv.waitKey(1)

    if c == ord('0'):
        cv.imshow("input", image)
        print("Displaying original image")

    elif c == ord('1'):
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        cv.imshow("input", gray)
        print("Displaying grayscale image")

    elif c == ord('2'):
        hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
        cv.imshow("input", hsv)
        print("Displaying HSV image")

    elif c == 27:  # ESC 键
        print("Exiting...")
        break

ESC:退出程序。

按键检测

cv.waitKey(1):每 1 毫秒检测一次键盘事件,返回 ASCII 值。

例如,ord('0') 对应按键 0ord('1') 对应按键 1

功能映射

0:显示原始图像。

1:将图像转换为灰度并显示。

2:将图像转换为 HSV 并显示。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容