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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:43:22