角点:Harris 到 FAST
cornerHarris 可解释但慢,FAST 适合实时;VO 里角点 repeatability 和空间分布比绝对数量更重要。

1. 角点很多,VO 仍断轨
光流前端 goodFeaturesToTrack 每帧 800 点,但全堆在货架纹理区,画面边缘和弱纹理过道几乎空点——转弯时 track 批量断,RANSAC 内点率掉。角点不是越多越好;空间分布 和 repeatability 决定后面几何 ceiling。FAST 阈值太低还会把边缘噪声当角点,内点率反而更差。看 overlay 时若角点呈「一团簇 + 大面积空白」,应先上 grid quota,而不是继续加 maxCorners。
2. Harris:结构张量直觉
harris = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)Harris 对旋转不变、对尺度敏感——通常配合金字塔。blockSize 是邻域窗口;ksize 是 Sobel 核。帮助理解「什么是角点」,但实时 VO 很少直接跑 Harris。教学或离线分析时用 Harris 响应热图,可以快速判断「这片区域根本无角点可提」还是「阈值不对」。
3. FAST 与 Shi-Tomasi
fast = cv2.FastFeatureDetector_create(threshold=20, nonmaxSuppression=True)
kps = fast.detect(gray, None)
pts = cv2.goodFeaturesToTrack(
gray, maxCorners=500, qualityLevel=0.01, minDistance=7,
blockSize=7, useHarrisDetector=False)FAST 用 segment test,极快;threshold 是 segment 亮度差。goodFeaturesToTrack 用 Shi-Tomasi,qualityLevel 是相对最大 eigenvalue 比例,minDistance 是 NMS 半径。高噪工业相机会略升 threshold 并前置 GaussianBlur(3×3)。OpenCV TYPE_9_16 vs TYPE_7_12 是 segment 环大小,速度与 repeatability 略有 trade。
4. 分布比数量:网格配额
图像划 grid,每格 cap 角点数,避免纹理丰富区域独占。边缘畸变大:undistort 后检测,或在原图检测但 match 时 undistort 坐标。按 response 排序 retain top-N。cornerSubPix 到 subpixel;纹理弱处 winSize=(5,5) 会漂,别在 flat 区域 spawn track。网格大小通常与图像分成 8×6 或 16×12 相当,按 FOV 和算力调;过细 grid 会在弱纹理格强行选噪声点。
5. 与 LK 光流的衔接
calcOpticalFlowPyrLK 需要 时间上可跟踪 的点:对比度够、不在运动模糊核心。曝光跳变破坏亮度恒定,角点检测阈值要随 auto exposure 策略调整,或锁曝光。log 每帧有效 track 长度分布;median track life <10 帧先查角点/曝光,再查 ESSENTIAL 几何。LK 窗口与金字塔层数写进 yaml,与角点阈值一起 version。
6. ORB 与描述子路径
需要 match 而不只是 track 时,FAST/ORB 检测 + 描述子是常见组合。离线 SfM 用 SIFT/AKAZE(contrib);embedded 用 ORB。检测器与描述子 分辨率、畸变层 必须一致——raw 检测 + undistort 描述子坐标是经典坑。换镜头后 repeat rate 掉一半,先查 dist 与检测坐标层,再查 FAST threshold。
7. 参数 yaml 与 A/B
fast_threshold、max_corners、grid_cell_cap、quality_level 写进配置;换 720p/4K 时 minDistance 按比例缩放。A/B 看 inlier 率–latency 曲线,不是角点总数。夜视降 threshold 时同步看 RANSAC FP 是否升。上线前用 hold-out 转弯段 clip 对比 grid 开/关的断轨率,差 >5% 则保留 grid。
8. 失败模式
| 情况 | 表现 |
|---|---|
| 白墙/弱纹理 | 角点稀少,track 断 |
| 运动模糊 | FAST 误检、Harris 弱 |
| 曝光跳变 | LK 假设破坏 |
| 阈值过低 | 边缘噪声进 RANSAC |
9. 验收
同一 scene 小位移重跑 repeat rate;track 长度分布;VO 前端 inlier 数/帧。调 FAST threshold 看 inlier–latency 曲线。bag 回放对比 grid quota 开/关的 turn 段断轨率。角点 pipeline 变更应伴随 inlier 率与 track life 两条曲线,而不是只报「角点数恢复」。
10. 案例:grid quota 救转弯
某 AMR 走廊转弯段 weekly 断轨,角点总数不少但全在左侧货架纹理。加 8×6 grid、每格 cap 40 后,弱纹理侧也有稳定 track,转弯 inlier 率升 12 pt,latency 几乎不变。说明 分布 才是瓶颈,不是 FAST threshold alone。上线 yaml 固化 grid 参数,换分辨率时只 scale minDistance 不删 grid。
11. 与描述子 match 的分工
角点检测只解决「在哪提点」;match 质量还取决于描述子、ratio test、几何验证。角点分布均匀但描述子 repeat 差时,inlier 仍低——此时换 ORB 为 AKAZE 或加 CLAHE 前置,比继续加 maxCorners 有效。pipeline 验收应串联 检测 repeat × match inlier × 几何 inlier 三层,单层 metric 会误导优化方向。现场 turnover 高时,把 grid 参数与 FAST threshold 写进 SOP,换班只许在 yaml 内调,避免 oral 传参 drift。角点 pipeline 变更必须 replay 标准 bag,对比 inlier 与 track life,通过才允许合并。
Harris 教机制;工程实时路径几乎总是 FAST/ORB + 网格配额。检测质量 ceiling 决定后面所有几何的上限。
相关
也可以看看
johan's blog