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

