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

如何使用Python OpenCV擦除同一张图像中已绘制的轮廓并每次仅显示单个矩形

解决cv2.drawContours绘制的轮廓擦除/单次仅显示单个轮廓的方案

cv2.drawContours执行时会直接修改传入图像的像素值,没有内置的擦除已绘制内容的API,你可以通过以下两种方案实现每次仅在图像上显示单个矩形的需求:

方案一:备份原始图像(最推荐,实现简单不易出错)

  • 实现逻辑:提前留存一份没有任何绘制内容的原始干净图像,每次需要显示新矩形时,先从原始图像拷贝一份全新副本,再在副本上绘制当前需要展示的单个矩形即可,不需要额外做擦除操作。
  • 参考代码:
import cv2
import numpy as np

# 读取图像后首先备份原始无绘制内容的图像
original_img = cv2.imread("你的图像路径.png")
# 提前把所有要显示的矩形box存入列表,生成逻辑和你原有代码一致
all_boxes = []
for items in 你的点列表集合:
    rect = cv2.minAreaRect(np.array(items))
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    all_boxes.append(box)

# 逐个显示单个矩形
for box in all_boxes:
    # 每次从原始图像拷贝新副本,之前的绘制内容自然不会保留
    show_img = original_img.copy()
    # 仅绘制当前这一个矩形
    cv2.drawContours(show_img, [box], 0, [0,0,255], 1)
    # 展示图像,按任意键切换下一个矩形
    cv2.imshow("单矩形展示", show_img)
    cv2.waitKey(0)

cv2.destroyAllWindows()

方案二:备份绘制区域原始像素(适合大图像、全图复制开销高的场景)

  • 实现逻辑:每次绘制矩形前,先把当前轮廓覆盖范围内的原始像素备份下来,需要擦除该轮廓时,再把备份的像素覆盖回图像对应位置即可。
  • 参考代码:
import cv2
import numpy as np

img = cv2.imread("你的图像路径.png")
# 生成所有待显示的box列表逻辑同上
all_boxes = []
for items in 你的点列表集合:
    rect = cv2.minAreaRect(np.array(items))
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    all_boxes.append(box)

for box in all_boxes:
    # 计算当前box的最小外接矩形范围,备份对应区域的原始像素
    x,y,w,h = cv2.boundingRect(box)
    roi_backup = img[y:y+h, x:x+w].copy()
    # 绘制当前矩形
    cv2.drawContours(img, [box], 0, [0,0,255], 1)
    # 展示图像
    cv2.imshow("单矩形展示", img)
    cv2.waitKey(0)
    # 用备份的原始像素覆盖绘制区域,擦除刚画的矩形
    img[y:y+h, x:x+w] = roi_backup

cv2.destroyAllWindows()

补充说明:如果是做实时交互类的展示,常规分辨率图像选择方案一即可,全图拷贝的开销极低,不会出现卡顿问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:15:00