返回专辑
·Johan·4 分钟阅读

角点:Harris 到 FAST

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

角点:Harris 到 FAST

1. 角点很多,VO 仍断轨

光流前端 goodFeaturesToTrack 每帧 800 点,但全堆在货架纹理区,画面边缘和弱纹理过道几乎空点——转弯时 track 批量断,RANSAC 内点率掉。角点不是越多越好;空间分布repeatability 决定后面几何 ceiling。FAST 阈值太低还会把边缘噪声当角点,内点率反而更差。看 overlay 时若角点呈「一团簇 + 大面积空白」,应先上 grid quota,而不是继续加 maxCorners

2. Harris:结构张量直觉

python
harris = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)

Harris 对旋转不变、对尺度敏感——通常配合金字塔。blockSize 是邻域窗口;ksize 是 Sobel 核。帮助理解「什么是角点」,但实时 VO 很少直接跑 Harris。教学或离线分析时用 Harris 响应热图,可以快速判断「这片区域根本无角点可提」还是「阈值不对」。

3. FAST 与 Shi-Tomasi

python
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_thresholdmax_cornersgrid_cell_capquality_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