共计 9218 个字符,预计需要花费 24 分钟才能阅读完成。
1. 方案目标
本方案用于在本地部署一套视觉识别系统,通过摄像头拍摄仓库货架上的纸箱,实现两个核心能力:
- 识别纸箱放在哪个库位。
- 识别纸箱上贴的条形码或二维码,并发送服务器确认产品信息;当条码 / 二维码识别失败时,上传标签区域图片到服务器进行 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/