如何删除已绘制轮廓外的背景 实现仅对纸箱进行尺寸测量
轮廓外背景剔除、仅保留硬纸箱测量区域的实现方法
你可以直接按以下步骤实现需求,不需要改动原有aruco测量和YOLO检测的核心逻辑:
- 第一步:获取目标轮廓
从YOLO的输出结果中拿到硬纸箱对应的闭合轮廓:如果用的是YOLO分割模型,直接取推理输出的分割轮廓点即可;如果用的是YOLO检测模型,拿检测框的四个顶点组成矩形轮廓,也可以在检测框划定的ROI区域内复用你原有aruco代码里的边缘检测、轮廓查找逻辑,拿到更贴合纸箱边缘的精确轮廓。 - 第二步:生成区域掩码
新建一张和原始采集图像尺寸完全一致的单通道图,初始所有像素值设为0(全黑),调用OpenCV的轮廓绘制接口,将纸箱轮廓的内部区域全部填充为像素值255(白色),核心填充参数设置为thickness=cv2.FILLED。 - 第三步:抠取目标区域
调用OpenCV的按位与接口,将原始图像和自身做与运算,传入上一步生成的掩码作为运算范围,输出结果就是轮廓外区域全部被剔除、仅保留轮廓内纸箱内容的处理后图像。 - 第四步:对接原有测量逻辑
把处理完的无背景图像传入你原有的aruco尺寸测量流程即可,此时画面内不存在其他杂物,测量代码不会对无关物体做误检测。
如果你需要同时测量场景内的多个硬纸箱,只需要把YOLO输出的所有纸箱轮廓都在同一张掩码上填充为白色,再统一做一次按位与操作即可,不需要额外调整其他逻辑。
核心实现代码参考(基于OpenCV):
import cv2 import numpy as np # origin_img 为相机采集到的原始待测量图像 # carton_contours 为YOLO输出的所有硬纸箱对应的轮廓集合 # 1. 初始化全黑掩码 mask = np.zeros(origin_img.shape[:2], dtype=np.uint8) # 2. 将所有纸箱轮廓区域填充为白色 cv2.drawContours(mask, carton_contours, -1, 255, thickness=cv2.FILLED) # 3. 按掩码抠图,剔除轮廓外背景 target_only_img = cv2.bitwise_and(origin_img, origin_img, mask=mask) # 后续将 target_only_img 传入aruco尺寸测量函数即可
补充说明:
- 如果不需要保留黑色背景,只需要在抠图完成后,把掩码值为0的位置的像素统一改成你需要的颜色(比如白色)即可,不会影响aruco标记识别和尺寸计算的精度。
- 如果出现轮廓边缘误裁剪的情况,给掩码做1-2个像素的膨胀操作再抠图,就能保证纸箱和aruco标记的边缘完整保留。
内容的提问来源于stack exchange,提问作者LogicLover90
相关产品推荐
相关产品推荐

