基于OpenCV识别并计算仓库装箱槽内空闲区域
仓库装箱槽空闲区域识别与计算实现方案
项目背景
我正在开展仓库装箱槽空闲区域识别与计算的项目,该装箱槽以黄色标记,内部部分区域被托盘占用。目前已通过Python结合OpenCV实现黄色颜色分离,提取出黄色线条覆盖的灰度区域,但难以确定黄色标记装箱槽内未被托盘占用的空闲区域,希望实现该区域的可视化与面积计算。
已实现代码
from PIL import Image from IPython.display import display # 替换为你的图像路径 image_path = 'C:/Users/CSR/Desktop/tracking_images/Half Vanning.jpg' # 打开并显示图像 img = Image.open(image_path) display(img) import cv2 import numpy as np from PIL import Image from IPython.display import display # 加载图像 image_path = 'C:/Users/CSR/Desktop/tracking_images/Half Vanning.jpg' image = cv2.imread(image_path) # 转换为灰度图 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 定义HSV色彩空间中黄色的上下阈值 lower_yellow = np.array([20, 100, 100], dtype=np.uint8) upper_yellow = np.array([40, 255, 255], dtype=np.uint8) # 转换图像到HSV色彩空间 hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 创建黄色区域的二进制掩码 yellow_mask = cv2.inRange(hsv, lower_yellow, upper_yellow) # 提取黄色线条覆盖的灰度区域 gray_area = cv2.bitwise_and(gray, gray, mask=yellow_mask) # 保存结果 output_path = 'C:/Users/CSR/Desktop/04-08-2023/bz.jpg' # 替换为你想要的输出路径 cv2.imwrite(output_path, gray_area) print("结果图像已保存至:", output_path) # 打开并显示结果图像 img = Image.open(output_path) display(img)
输入与当前输出
- 输入图像:

- 当前输出图像:

预期效果
需识别出黄色装箱槽内未被托盘占用的空闲区域,实现可视化并计算面积:
- 示例图像:

- 预期输出:标注空闲区域的可视化图像、空闲区域面积数值
实现步骤指导
1. 优化黄色掩码,提取完整装箱槽区域
当前黄色掩码仅捕捉了黄色线条,需将线条内部区域填充为完整掩码,代表整个装箱槽范围:
- 用形态学闭运算填补线条缝隙:
# 创建适配线条粗细的结构元素 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5)) # 闭运算(先膨胀后腐蚀)填补线条间的空隙 closed_yellow_mask = cv2.morphologyEx(yellow_mask, cv2.MORPH_CLOSE, kernel)
- 提取最大轮廓并填充,得到完整装箱槽掩码:
# 查找掩码中的外部轮廓 contours, _ = cv2.findContours(closed_yellow_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 筛选面积最大的轮廓(对应装箱槽外框) max_contour = max(contours, key=cv2.contourArea) # 创建空白掩码并填充该轮廓 full_slot_mask = np.zeros_like(yellow_mask) cv2.drawContours(full_slot_mask, [max_contour], -1, 255, thickness=cv2.FILLED)
2. 识别装箱槽内的托盘占用区域
托盘区域颜色偏深,与空闲区域差异明显,可通过阈值分割提取:
- 自适应阈值分割提取深色托盘区域:
# 自适应阈值分割,反转后得到深色区域(托盘) tray_mask = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) # 仅保留装箱槽范围内的托盘区域 tray_mask_in_slot = cv2.bitwise_and(tray_mask, tray_mask, mask=full_slot_mask)
- 形态学开运算去除噪声点:
# 开运算(先腐蚀后膨胀)清理掩码中的小噪声 tray_mask_clean = cv2.morphologyEx(tray_mask_in_slot, cv2.MORPH_OPEN, kernel)
3. 空闲区域可视化与面积计算
- 生成空闲区域掩码:
# 空闲区域 = 装箱槽区域 - 托盘占用区域 free_area_mask = cv2.bitwise_xor(full_slot_mask, tray_mask_clean)
- 可视化空闲区域(标记为绿色):
# 复制原始图像用于标记 output_image = image.copy() # 将空闲区域像素设为绿色(BGR格式) output_image[free_area_mask == 255] = [0, 255, 0] # 保存可视化结果 cv2.imwrite('free_area_visual.jpg', output_image)
- 计算面积:
# 统计空闲区域的像素数量 pixel_area = cv2.countNonZero(free_area_mask) # 若已知像素与实际尺寸的对应比例,可转换为实际面积(示例比例为0.01平方米/像素,需自行校准) actual_area = pixel_area * 0.01 print(f"空闲区域像素面积: {pixel_area}") print(f"空闲区域实际面积: {actual_area} 平方米")
内容的提问来源于stack exchange,提问作者Santhosh Kumar
相关产品推荐
相关产品推荐

