You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python OpenCV将鼠标指针改为两条长正交线?

OpenCV实现鼠标移动时显示贯穿图像的正交长线

核心思路是通过鼠标移动回调函数追踪鼠标位置,每次移动时基于原始图像重新绘制贯穿整个图像的水平线和垂直线,避免残留绘制痕迹。

实现步骤与完整代码

import cv2
import numpy as np

# 全局变量存储鼠标坐标与原始图像
mouse_x, mouse_y = -1, -1
original_img = None

def mouse_callback(event, x, y, flags, param):
    global mouse_x, mouse_y, original_img
    if event == cv2.EVENT_MOUSEMOVE:
        mouse_x, mouse_y = x, y
        # 复制原始图像,避免在原图上重复绘制
        display_img = original_img.copy()
        # 绘制贯穿图像的垂直线 (x=mouse_x, 从顶部到底部)
        cv2.line(display_img, (mouse_x, 0), (mouse_x, display_img.shape[0]), (0, 0, 255), 2)
        # 绘制贯穿图像的水平线 (y=mouse_y, 从左到右)
        cv2.line(display_img, (0, mouse_y), (display_img.shape[1], mouse_y), (0, 255, 0), 2)
        # 更新显示窗口
        cv2.imshow('Image with Crosshair', display_img)

if __name__ == '__main__':
    # 读取图像
    original_img = cv2.imread('your_image_path.jpg')
    if original_img is None:
        print("Error: 无法读取图像,请检查路径是否正确")
        exit()
    
    # 创建显示窗口并绑定鼠标回调
    cv2.namedWindow('Image with Crosshair')
    cv2.setMouseCallback('Image with Crosshair', mouse_callback)
    
    # 初始显示原始图像
    cv2.imshow('Image with Crosshair', original_img)
    
    # 等待按键退出,按ESC键关闭窗口
    while True:
        if cv2.waitKey(1) & 0xFF == 27:
            break
    
    # 释放资源
    cv2.destroyAllWindows()

关键细节说明

  • 避免绘制残留:每次鼠标移动时都从原始图像复制新的画布,而不是在已有绘制的图像上叠加,确保十字线始终清晰无残留。
  • 线条参数自定义:代码中(0,0,255)是红色垂直线,(0,255,0)是绿色水平线,2是线条厚度,可根据需求修改颜色和厚度值。
  • 图像路径替换:将your_image_path.jpg替换为你的实际图像路径,支持常见格式如jpg、png等。

内容的提问来源于stack exchange,提问作者A.Abousetta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 08:25:18