如何使用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
相关产品推荐
相关产品推荐

