1. 方案目标

本方案用于在本地部署一套视觉识别系统,通过摄像头拍摄仓库货架上的纸箱,实现两个核心能力:

  1. 识别纸箱放在哪个库位。
  2. 识别纸箱上贴的条形码或二维码,并发送服务器确认产品信息;当条码 / 二维码识别失败时,上传标签区域图片到服务器进行 OCR 兜底识别。

推荐总体原则:

  • 库位识别尽量在本地边缘端完成。
  • 条形码 / 二维码优先在本地边缘端识别。
  • 服务器负责产品确认、业务校验、数据落库和 OCR 兜底。
  • 不默认上传整张原始大图,优先上传结构化识别结果和标签裁剪小图。
  • OCR 只作为兜底方案,不作为主识别方案。

2. 总体架构


摄像头 / 工业相机
  -> 本地边缘识别服务
      -> 视频流采集
      -> 货架 / 库位定位
      -> 纸箱检测
      -> 条形码 / 二维码识别
      -> 标签区域裁剪
      -> 多帧投票确认
      -> 本地缓存 / 断网重传
  -> 后端服务器
      -> 产品码确认
      -> 库位合法性校验
      -> OCR 兜底识别
      -> 库存 / 库位记录
      -> 异常复核任务
  -> 前端管理系统
      -> 实时库位看板
      -> 识别记录查询
      -> 异常复核
      -> 摄像头 / 库位配置
      -> 图片和日志追溯

3. 推荐识别流程

3.1 正常识别流程


纸箱放入库位
  -> 摄像头检测画面变化
  -> 本地边缘端识别货架定位标记
  -> 根据标定信息计算纸箱所在库位
  -> 本地识别纸箱二维码 / 条形码
  -> 连续多帧结果一致后生成事件
  -> 发送服务器确认
  -> 服务器返回产品信息和库位校验结果
  -> 写入库存 / 库位记录
  -> 前端看板更新

3.2 识别失败兜底流程


条形码 / 二维码识别失败
  -> 本地端裁剪纸箱标签区域
  -> 上传标签小图到服务器
  -> 服务器调用 OCR 识别文字
  -> 根据 OCR 结果匹配产品或箱码
  -> 匹配成功则写入记录
  -> 匹配失败则进入人工复核

3.3 异常流程


库位为空但识别到箱码 -> 新增占用记录
库位已有箱码但识别到不同箱码 -> 冲突告警
识别到箱码但库位无法确定 -> 人工复核
识别到库位但无法识别箱码 -> OCR 或人工复核
同一箱码出现在多个库位 -> 高优先级异常
服务器确认产品不存在 -> 主数据异常

4. 硬件方案

4.1 摄像头选型

推荐试点摄像头:


HIKROBOT MV-CE120-10GM
1200 万像素
黑白工业相机
GigE 千兆网口
C 口镜头

适用条件:

  • 相机距离货架约 2 米到 3.5 米。
  • 单台相机覆盖 6 到 8 个库位。
  • 纸箱二维码尺寸建议 80mm 到 120mm。
  • 需要稳定补光。

如果单台相机需要覆盖更大范围,或相机距离超过 4 米,可升级为 2000 万像素工业相机,例如:


HIKROBOT MV-CS200-10GM
2000 万像素
黑白工业相机
GigE 千兆网口

4.2 镜头选择

建议试点同时购买 8mm 和 12mm C 口工业镜头,现场调试后确定最终焦距。

相机距离 覆盖宽度目标 推荐镜头
2 米 1.5 到 2 米 12mm
2.5 到 3 米 2 到 3 米 8mm
3 到 4 米 3 米左右 6mm 到 8mm

注意事项:

  • 镜头视野越广,边缘畸变越明显。
  • 条码和二维码在画面边缘时识别率会下降。
  • 试点时应优先保证中间区域和边缘区域都能稳定识码。

4.3 补光方案

建议每个摄像头点位配置独立 LED 补光:

  • 白色 LED 条形光或面光。
  • 避免强反光直射纸箱标签。
  • 尽量让标签区域亮度均匀。
  • 关闭频闪明显的普通照明影响。

补光通常比盲目升级摄像头更划算。

4.4 货架定位标记

每个货架 bay 建议贴定位标记:

  • 四角贴 ArUco 或 AprilTag。
  • 每层或每列可增加辅助定位码。
  • 每个库位可额外贴库位二维码,例如 `A01-02-03`。

定位码用途:

  • 帮助系统确认当前画面对应哪个货架。
  • 做透视矫正和坐标映射。
  • 在摄像头轻微偏移后辅助重新校准。
  • 降低纯 AI 判断库位带来的误差。

4.5 纸箱标签规范

强烈建议统一纸箱标签:

  • 每个纸箱贴唯一箱码。
  • 优先使用二维码,其次是一维条形码。
  • 二维码建议尺寸 80mm 到 120mm。
  • 标签固定贴在朝外面,位置尽量统一。
  • 标签内容建议包含箱码,不建议直接把所有产品信息塞入二维码。

推荐二维码内容示例:


BOX202606200001

服务器根据箱码查询:

  • SKU
  • 产品名称
  • 批次
  • 数量
  • 入库单
  • 供应商
  • 有效期

4.6 单点位成本估算

项目 估算成本
1200 万黑白工业相机 1500 到 3500 元
C 口工业镜头 300 到 1000 元
LED 补光 300 到 1000 元
支架、线缆、电源 200 到 500 元
单点位合计 2500 到 6000 元

按一台相机覆盖 6 到 8 个库位估算:

覆盖库位数 单点位成本 4000 元时的折算成本
6 个库位 约 667 元 / 库位
8 个库位 约 500 元 / 库位
12 个库位 约 333 元 / 库位,但识别风险更高

5. 识别距离和画面要求

识别距离不是摄像头单独决定的,而是由分辨率、镜头、覆盖宽度、标签尺寸和光照共同决定。

推荐设计:


相机距离货架:2 到 3.5 米
单台相机覆盖宽度:2 到 3 米
二维码尺寸:80 到 120mm
二维码在图像中宽度:建议 150 到 250 像素
一维条码在图像中宽度:建议 400 到 600 像素

1200 万相机横向约 4000 像素时,估算如下:

实际覆盖宽度 100mm 二维码像素宽度 评价
2 米 约 200 px 稳定
3 米 约 133 px 基本可用
4 米 约 100 px 风险增大
5 米 约 80 px 不建议

6. 软件系统模块

6.1 本地边缘识别服务

建议部署在仓库本地服务器或工控机上。

核心职责:

  • 摄像头取流。
  • 图像预处理。
  • 货架定位码识别。
  • 库位坐标映射。
  • 纸箱检测。
  • 条形码 / 二维码识别。
  • 标签区域裁剪。
  • 多帧投票确认。
  • 本地事件缓存。
  • 断网重传。
  • 摄像头状态监控。

推荐技术:

功能 推荐技术
摄像头接入 GigE Vision SDK、RTSP、OpenCV
图像处理 OpenCV
二维码识别 OpenCV QRCodeDetector、ZBar、商业 SDK
条形码识别 ZBar、ZXing、商业 SDK
定位标记 ArUco、AprilTag
纸箱检测 YOLO、RT-DETR,试点期可先不用
服务接口 FastAPI
本地缓存 SQLite、Redis、本地文件队列
部署 Docker Compose

6.2 后端服务器

核心职责:

  • 接收边缘端识别事件。
  • 校验箱码和产品主数据。
  • 校验库位是否合法。
  • 保存识别记录。
  • 保存标签裁剪图。
  • 执行 OCR 兜底识别。
  • 生成异常复核任务。
  • 对接 WMS、ERP 或库存系统。

推荐技术:

功能 推荐技术
后端服务 FastAPI、Spring Boot、NestJS 均可
数据库 PostgreSQL
缓存 / 队列 Redis
图片存储 本地 NAS、MinIO、对象存储
OCR PaddleOCR
消息队列 Redis Stream、RabbitMQ、MQTT
部署 Docker Compose 或 Kubernetes

6.3 前端管理系统

核心页面:

  • 实时库位看板。
  • 识别事件列表。
  • 异常复核页面。
  • 摄像头管理。
  • 货架和库位配置。
  • 产品和箱码查询。
  • 图片追溯页面。
  • 系统状态监控。

推荐技术:

功能 推荐技术
前端框架 React、Vue
UI 组件 Ant Design、Element Plus
实时更新 WebSocket、Server-Sent Events
图像标注 Canvas、Konva、Fabric.js
权限 RBAC

7. 库位识别设计

7.1 货架建模

系统中为每个货架建立模型:


仓库
  -> 区域
      -> 货架
          -> bay
              -> 层
                  -> 库位

库位编码示例:


A01-R03-B02-L02-P05

含义:

  • `A01`:区域。
  • `R03`:第 3 排货架。
  • `B02`:第 2 个 bay。
  • `L02`:第 2 层。
  • `P05`:第 5 个位置。

7.2 标定方式

每个摄像头需要绑定一个或多个货架 bay。

配置内容:


{
  "camera_id": "CAM-A01-01",
  "shelf_id": "A01-R03",
  "bay_id": "B02",
  "marker_ids": ["M1001", "M1002", "M1003", "M1004"],
  "locations": [
    {
      "location_id": "A01-R03-B02-L01-P01",
      "polygon": [[100, 120], [640, 120], [640, 360], [100, 360]]
    }
  ]
}

7.3 判断逻辑


识别货架定位标记
  -> 计算图像透视变换
  -> 检测纸箱或标签区域
  -> 取纸箱中心点或标签中心点
  -> 判断中心点落在哪个库位多边形
  -> 输出 location_id

试点阶段如果不做纸箱检测,也可以先用标签中心点判断库位:


识别到二维码 / 条形码
  -> 获取码在图像中的四角坐标
  -> 计算码中心点
  -> 码中心点落入哪个库位区域
  -> 该箱码属于哪个库位

这种方法简单、稳定,适合第一期验证。

8. 条形码和二维码识别设计

8.1 本地识别优先级


二维码识别
  -> 一维条形码识别
      -> 标签区域 OCR
          -> 人工复核

8.2 多帧投票

避免单帧误判,建议连续 5 到 10 帧做投票。

确认条件示例:


同一摄像头
同一库位
同一箱码
最近 10 帧中至少 3 帧识别一致
识别置信度超过阈值
画面稳定时间超过 1 到 2 秒

8.3 防重复上报

边缘端应做去重:


同一 camera_id + location_id + box_code
在 30 秒内不重复上报 confirmed 事件

如果库位状态变化,例如原箱码消失、新箱码出现,则生成新事件。

9. OCR 兜底设计

OCR 不建议直接处理整张货架大图,而应处理裁剪后的标签区域。

上传图片建议:

  • 只上传标签区域裁剪图。
  • 保留一张低分辨率上下文图用于人工复核。
  • 图片命名包含 camera_id、时间、location_id。
  • 图片保存时记录识别事件 ID。

OCR 输出字段可包括:

  • 产品型号。
  • SKU。
  • 批次号。
  • 生产日期。
  • 箱规。
  • 供应商编码。

OCR 匹配逻辑:


OCR 文本
  -> 清洗空格、符号、大小写
  -> 按箱码 /SKU/ 产品型号规则匹配
  -> 多候选时按置信度排序
  -> 低置信度进入人工复核

10. 后端接口设计

10.1 边缘端上报识别事件


POST /api/vision/events

请求示例:


{
  "event_id": "EVT-20260620-000001",
  "camera_id": "CAM-A01-01",
  "shelf_id": "A01-R03",
  "location_id": "A01-R03-B02-L02-P05",
  "code_type": "QR",
  "code_value": "BOX202606200001",
  "confidence": 0.96,
  "image_crop_path": "events/2026/06/20/EVT-20260620-000001-crop.jpg",
  "context_image_path": "events/2026/06/20/EVT-20260620-000001-context.jpg",
  "captured_at": "2026-06-20T10:30:00+08:00"
}

响应示例:


{
  "valid": true,
  "product_id": "SKU-10086",
  "product_name": "示例产品",
  "location_status": "ok",
  "inventory_action": "confirm_occupied",
  "message": "识别确认成功"
}

10.2 上传 OCR 图片


POST /api/vision/ocr-tasks

请求示例:


{
  "event_id": "EVT-20260620-000002",
  "camera_id": "CAM-A01-01",
  "location_id": "A01-R03-B02-L02-P05",
  "image_crop_path": "events/2026/06/20/EVT-20260620-000002-crop.jpg",
  "reason": "barcode_decode_failed",
  "captured_at": "2026-06-20T10:31:00+08:00"
}

10.3 查询库位状态


GET /api/locations/{location_id}/status

响应示例:


{
  "location_id": "A01-R03-B02-L02-P05",
  "status": "occupied",
  "box_code": "BOX202606200001",
  "product_id": "SKU-10086",
  "updated_at": "2026-06-20T10:30:05+08:00"
}

10.4 人工复核提交


POST /api/review-tasks/{task_id}/confirm

请求示例:


{
  "box_code": "BOX202606200001",
  "product_id": "SKU-10086",
  "location_id": "A01-R03-B02-L02-P05",
  "reviewer": "admin",
  "comment": "人工确认标签信息"
}

11. 数据库设计建议

11.1 核心表


cameras
  摄像头信息、状态、取流地址、绑定区域

shelves
  货架信息

locations
  库位信息、库位多边形、所属货架

products
  产品主数据

boxes
  箱码、产品、批次、数量、状态

vision_events
  每次视觉识别事件

inventory_locations
  当前箱码和库位绑定关系

ocr_tasks
  OCR 识别任务

review_tasks
  人工复核任务

11.2 vision_events 字段建议


id
event_id
camera_id
shelf_id
location_id
code_type
code_value
confidence
status
image_crop_path
context_image_path
ocr_text
server_result
captured_at
created_at

11.3 inventory_locations 字段建议


id
location_id
box_code
product_id
status
source_event_id
confirmed_at
updated_at

12. 前端页面设计

12.1 实时库位看板

功能:

  • 按区域、货架、层展示库位。
  • 空库位、已占用、异常、未知状态用不同颜色区分。
  • 点击库位查看当前箱码、产品、识别图片、最近事件。
  • 支持按 SKU、箱码、库位搜索。

状态建议:


empty      空库位
occupied   已占用
moving     搬动中
unknown    识别不清
conflict   冲突
offline    摄像头离线

12.2 异常复核页面

功能:

  • 展示裁剪标签图。
  • 展示上下文图。
  • 展示 OCR 候选结果。
  • 展示服务器匹配候选产品。
  • 支持人工录入箱码、SKU、库位。
  • 支持确认、驳回、标记无法识别。

12.3 摄像头配置页面

功能:

  • 添加摄像头。
  • 配置取流地址。
  • 绑定货架 bay。
  • 查看在线状态。
  • 标定库位多边形。
  • 预览实时画面。

12.4 货架库位配置页面

功能:

  • 建立区域、货架、bay、层、库位。
  • 批量生成库位编码。
  • 上传或绘制库位多边形。
  • 绑定定位 marker。
  • 打印库位二维码。

13. 部署方案

13.1 试点部署


1 台本地服务器或工控机
1 到 2 台工业相机
1 个货架 bay
6 到 16 个库位
Docker Compose 部署
PostgreSQL + Redis + FastAPI + 前端

13.2 推荐 Docker 服务


edge-vision
  本地识别服务

backend-api
  后端业务服务

frontend-web
  管理后台

postgres
  主数据库

redis
  缓存和队列

minio
  图片存储

ocr-service
  OCR 服务

13.3 网络要求

  • 摄像头和边缘服务器建议走独立局域网。
  • 工业相机建议使用千兆网。
  • 多摄像头场景需要评估交换机带宽。
  • 边缘端到服务器断网时,应本地缓存事件和图片。
  • 恢复网络后按时间顺序补传。

14. 开发阶段规划

第一阶段:单货架试点

目标:

  • 一台相机覆盖 6 到 8 个库位。
  • 识别货架库位。
  • 识别纸箱二维码。
  • 上报服务器确认。
  • 前端能看到库位状态。

建议周期:


2 到 4 周

交付内容:

  • 摄像头采集程序。
  • 二维码识别程序。
  • 库位标定工具。
  • 后端事件接口。
  • 简单前端看板。
  • 识别准确率报告。

第二阶段:异常和 OCR 兜底

目标:

  • 条形码 / 二维码失败时上传标签图。
  • 服务器 OCR 识别。
  • 人工复核页面。
  • 异常状态流转。

建议周期:


2 到 3 周

第三阶段:多摄像头扩展

目标:

  • 多货架、多摄像头统一管理。
  • 摄像头在线状态监控。
  • 断网重传。
  • 识别事件去重。
  • 与 WMS/ERP 对接。

建议周期:


4 到 8 周

15. 验收指标

试点阶段建议验收指标:

指标 建议目标
二维码识别成功率 大于 98%
库位判断准确率 大于 97%
单次识别确认延迟 小于 2 秒
异常进入复核率 小于 3%
同一箱码重复上报率 小于 1%
摄像头离线告警延迟 小于 30 秒

生产阶段建议目标:

指标 建议目标
二维码识别成功率 大于 99%
库位判断准确率 大于 99%
断网恢复补传成功率 100%
人工复核闭环率 100%

16. 主要风险和规避措施

风险 影响 规避措施
条码 / 二维码没有朝外 无法识别 规范贴码面和上架方向
标签太小 识别率低 二维码放大到 80 到 120mm
摄像头覆盖范围太大 像素不足 控制单台覆盖 6 到 8 个库位
光照不稳定 误识别和漏识别 增加独立补光
货架遮挡 库位判断错误 调整相机角度或增加摄像头
同一库位前后堆叠 后排箱不可见 限制库位规则或增加侧视相机
只靠 OCR 准确率不稳定 条码 / 二维码作为主识别
服务器断网 数据丢失 边缘端本地缓存和断网重传

17. 推荐最终方案

第一期建议采用以下配置:


硬件:HIKROBOT MV-CE120-10GM 黑白工业相机
  8mm 和 12mm C 口镜头各一个
  白色 LED 补光
  千兆交换机
  本地工控机或服务器

标签:纸箱贴 80 到 120mm 二维码
  货架贴 ArUco/AprilTag 定位码
  每个库位生成唯一库位编码

软件:边缘端 OpenCV + 条码 / 二维码识别
  后端 FastAPI + PostgreSQL + Redis + MinIO
  OCR 使用 PaddleOCR
  前端 React/Vue + 实时库位看板

流程:本地识别库位和箱码
  服务器确认产品和库位合法性
  识别失败时上传标签裁剪图做 OCR
  OCR 失败进入人工复核

这个方案的优势是成本可控、准确率较高、扩展性好,并且能避免一开始就把所有识别压力都放到服务器或 OCR 上。

18. 参考资料

  • HIKROBOT 机器视觉产品:https://www.hikrobotics.com/cn/machinevision/
  • OpenCV ArUco 标记检测:https://docs.opencv.org/
  • OpenCV QRCodeDetector:https://docs.opencv.org/
  • AprilTag:https://april.eecs.umich.edu/software/apriltag
  • PaddleOCR:https://github.com/PaddlePaddle/PaddleOCR
  • ZBar:https://zbar.sourceforge.net/