ROI:算力放在刀刃上
Mat ROI 是 view 不拷贝;全图跑重模型不如 crop,但 ROI miss 就全错——proposal 要 recall-oriented。

1. 裁剪快,但偏二十像素就全漏
检测全图四十毫秒,裁剪感兴趣区域五毫秒——最常用的加速手段。但区域偏二十像素就切掉目标边,检测永久漏。感兴趣区域是对空间先验的赌注;先验错时的回退比区域本身同样重要。只写裁剪尺寸不写回退,等于只赌不输——现场会输。
2. OpenCV 区域与坐标链
区域是视图不拷贝。检测框回写全图要加偏移。坐标链:全图、去畸变、裁剪、检测、映射回去要经过内参、裁剪偏移、缩放——漏一步框全歪。合成框往返单元测试误差应小于零点五像素。裁剪后针孔内参同步改:焦距不变,主点减裁剪原点。忘记改内参时解算在区域内仍收敛,绝对位姿却偏几厘米。
x0, y0, w, h = 100, 80, 320, 240
roi = img[y0:y0+h, x0:x0+w]
K_roi = K.copy()
K_roi[0, 2] -= x0
K_roi[1, 2] -= y03. 区域从哪来
上一帧跟踪框放大一点二倍;粗检测或运动掩膜轮廓;固定工位先验投影;立体有效视差区域类比维护有效深度区,避免黑边上检测。召回导向放大:宁可多算背景,不可切目标。边距百分之十到二十。级联:粗检测加区域内细模型,常比全图重模型划算。
4. 掩膜与有效像素
语义或深度只在掩膜内算;非零像素计数监控,少于百分之五则跳过该帧。腐蚀掩膜做碰撞裕度。按位与后检测只在掩膜内跑,假框率常降——掩膜腐蚀过度会切目标,和裁剪太紧同一类错误。
5. 失败与回退
| 现象 | 原因 |
|---|---|
| 突然全漏 | 区域漂移或跟丢 |
| 边缘伪影 | 裁太紧 |
| 竞争 | 区域线程与全图不同步 |
连续若干帧无检测命中时回全图一帧重新捕获,避免跟丢后永久漏检。多实例区域并行时常设 OpenCV 单线程,避免内部过度并行。回退延迟是服务等级的一部分,要写进规格而不只是注释。
6. 案例:跟丢后永久漏检
某抓取流水线区域来自上一帧跟踪,遮挡一帧后区域漂到空白,后续两百帧全漏——没有全图回退。加三帧无命中则全图一帧后,最坏恢复小于一百毫秒。教训:回退是流水线一级公民,和裁剪尺寸同级评审。
7. 与内参和位姿
区域内做透视 n 点必须用裁剪后内参;全图内参在区域内解算会 silent 错。我会把区域来源、放大系数、回退帧数写进 yaml,启动摘要打印,避免现场只改检测阈值不改区域策略。立体流水线里有效视差区域随去畸变和裁剪变化,检测区域应与之对齐,否则会在无效深度区浪费算力或在黑边产生假目标。
8. 级联与算力预算
粗模型全图轻量、细模型区域内重量是常见级联:粗模型召回导向、细模型精度导向。预算表应分别报全图粗检和区域细检的毫秒数,别只报「裁剪后总时间」——否则粗检仍占大头时裁剪收益被掩盖。多工位并行时对每个实例设 OpenCV 单线程,总线程数等于工位数,避免内外双重并行拖垮 CPU。
9. 验收
- 区域召回:全图与裁剪检测匹配率应大于百分之九十九
- 端到端延迟前后对比
- 故意偏区域二十像素的最坏漏检片段
- 回退触发日志与恢复时间
- 裁剪后内参修正往返加位姿对比
区域省算力,先验和回退省事故。三者写进流水线契约,别只写裁剪尺寸。
相关
也可以看看
johan's blog