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

OpenCV Python鼠标绘制无填充矩形的问题求助

解决OpenCV实时预览无填充矩形绘制的问题

我懂你遇到的痛点了——拖拽鼠标时没法像画图工具那样实时看到矩形的动态预览,而是直接蹦出最终的矩形,对吧?这是因为我们需要在鼠标拖拽过程中不断刷新图像,避免留下之前的绘制痕迹,同时要确保矩形是无填充的边框样式。

核心思路

要实现这个效果,关键在于两点:

  • 保留原始图像的副本,每次预览时都从副本重新绘制,这样就不会残留之前拖拽的痕迹
  • 在鼠标移动事件中实时绘制临时矩形,鼠标松开后再把最终矩形固定在原图上

修改后的完整代码

import cv2
import numpy as np

# 初始化全局变量
drawing = False  # 标记是否正在绘制
ix, iy = -1, -1  # 矩形起始点坐标
original_img = None  # 保存原始图像的副本,用于实时预览时恢复

def draw_rect(event, x, y, flags, param):
    global ix, iy, drawing, original_img
    current_img = param  # 获取传入的图像对象
    
    # 鼠标左键按下:开始绘制,记录起始点并保存原图
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        ix, iy = x, y
        original_img = current_img.copy()
        
    # 鼠标移动:如果正在绘制,实时更新矩形预览
    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing:
            # 每次移动都从原图副本复制,避免残留之前的预览矩形
            temp_img = original_img.copy()
            # 绘制无填充矩形:最后一个参数thickness设为正数(比如2),设为-1会填充
            cv2.rectangle(temp_img, (ix, iy), (x, y), (0, 255, 0), 2)
            cv2.imshow('image', temp_img)
            
    # 鼠标左键松开:结束绘制,在原图上固定最终矩形
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        cv2.rectangle(current_img, (ix, iy), (x, y), (0, 255, 0), 2)
        cv2.imshow('image', current_img)

# 创建空白图像(也可以替换成你自己的图像,比如cv2.imread("your_img.jpg"))
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('image')
# 绑定鼠标回调函数,把图像作为参数传入
cv2.setMouseCallback('image', draw_rect, param=img)

# 主循环:显示图像,按q退出
while True:
    cv2.imshow('image', img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cv2.destroyAllWindows()

关键细节说明

  • 无填充矩形:cv2.rectangle的最后一个参数thickness设置为正数(比如2)就会绘制边框,设为-1则是填充矩形,这正是你要的干净无填充效果。
  • 实时预览的核心:每次鼠标移动时,我们都从original_img(原始图像副本)复制出临时图像,再在上面绘制当前的矩形,这样就不会留下之前拖拽的痕迹,实现平滑的预览。
  • 适配自定义图像:如果要在自己的图片上绘制,只需要把np.zeros((512,512,3), np.uint8)换成cv2.imread("你的图片路径")即可。

内容的提问来源于stack exchange,提问作者Shriniwas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:14:27