OpenCV(Python)如何实现无残留的鼠标跟随圆点,仅显示当前位置?
OpenCV鼠标跟随圆点残留问题解决方案
出现残留的根本原因是你每次绘制圆点时都是直接在同一张图像对象上修改,上一次绘制的像素已经被永久修改,没有被重置。
解决逻辑
每次绘制最新位置的圆点前,先重置画布为没有任何绘制内容的原始底图,再在新画布上绘制当前位置的圆点,避免历史绘制内容叠加。
具体实现步骤
- 提前备份一份未做任何绘制的原始底图,命名为
base_image,不要修改该变量的内容 - 鼠标回调函数仅负责更新当前鼠标的坐标,不要直接在回调中执行绘制操作
- 在主渲染循环中每次都先拷贝原始底图得到全新的待显示画布,再在新画布上绘制当前坐标的圆点,最后刷新窗口显示
可运行代码示例
import cv2 # 全局变量存储当前鼠标坐标 current_x, current_y = 0, 0 # 提前加载原始底图,全程不要修改该变量 base_image = cv2.imread("你的图片路径.jpg") # 如果是摄像头实时画面,不需要提前备份底图,每次循环读取最新帧即可 def mouse_callback(event, x, y, flags, param): global current_x, current_y # 按住左键移动时更新鼠标坐标 if event == cv2.EVENT_MOUSEMOVE and (flags & cv2.EVENT_FLAG_LBUTTON): current_x, current_y = x, y # 绑定窗口和鼠标回调 cv2.namedWindow("preview") cv2.setMouseCallback("preview", mouse_callback) while True: # 每次渲染都先拷贝原始底图,清空上一次的绘制内容 show_img = base_image.copy() # 只绘制当前最新位置的圆点 cv2.circle(show_img, (current_x, current_y), 5, (255, 0, 0), -1) # 刷新窗口 cv2.imshow("preview", show_img) # 按Q键退出 if cv2.waitKey(1) & 0xFF == ord('q'): break cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者DDOZZI
相关产品推荐
相关产品推荐

