前面已经做过 Sobel 梯度、边缘方向和纹理分析,这次继续往"特征点"方向走一步。
这次我用华为云码道辅助开发了一个:
OpenCV Harris 角点检测工具。
它可以自动寻找图片中灰度变化明显、两个方向都具有较强变化的位置,并把这些位置作为角点标记出来。
1. 这次工具做什么?
主要功能包括:
- 上传 JPG / PNG 图片
- 自动转换灰度图
- 使用 Harris Corner Detection
- 调节 Block Size
- 调节 Kernel Size
- 调节 Harris K
- 调节 Threshold Ratio
- 在图片上标记角点
- 统计 Corner Count
- 支持下载检测结果
整体流程:
图片
→ 灰度化
→ Harris Response
→ 阈值筛选
→ 聚合相邻候选点
→ 输出角点

2. 什么是 Harris Corner?
Harris Corner Detection 是一个经典角点检测算法。
它主要寻找这种位置:
无论向哪个方向移动,局部灰度都会发生明显变化。
比如:
直线内部通常只在一个方向变化明显。
平坦区域基本没有变化。
而真正的角点,在多个方向上都会出现明显变化。
所以像:
建筑拐角
眼睛边缘
鼻子轮廓
纹理交叉位置
都比较容易产生较强 Harris Response。
3. 核心代码怎么实现?
先转成灰度图:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)gray = np.float32(gray)
然后调用:
response = cv2.cornerHarris( gray, blockSize=2, ksize=3, k=0.04)
这次实际参数:
- Block Size:2
- Kernel Size:3
- Harris K:0.04
得到的 response 就是每个位置对应的 Harris 响应强度。
4. Threshold Ratio 是怎么用的?
并不是所有响应都算角点。
这次使用:
Threshold Ratio = 0.010
先找到最大响应:
Maximum Response = 6.1586 × 10⁷
然后计算阈值:
Threshold
= Maximum Response × Threshold Ratio
= 6.1586e7 × 0.01
= 6.1586e5
所以最终:
Threshold Value = 6.1586 × 10⁵
只有响应强度超过这个值的位置,才进入角点候选区域。
5. 为什么不能直接统计所有红色像素?
如果直接写:
mask = response > thresholdcorner_count = np.count_nonzero(mask)
会有一个问题:
同一个真实角点周围,可能连续很多像素都超过阈值。
这样一个角点就可能被统计成几十个甚至上百个点。
所以这次工具没有直接统计所有响应像素,而是:
把相邻候选区域聚合,再保留一个代表角点。
这样最终得到的 Corner Count 更合理。
6. 真实测试结果
这次继续使用狗狗公园图片。
图片尺寸:
1650 × 953
最终得到:
- Corner Count:605
- Maximum Response:6.1586 × 10⁷
- Threshold Value:6.1586 × 10⁵
- Block Size:2
- Kernel Size:3
- Harris K:0.04
- Threshold Ratio:0.010
最终一共检测到:
605 个角点区域。
7. 角点主要出现在哪里?
从检测结果可以看到,红色角点主要集中在:
狗狗眼睛
鼻子
嘴巴
耳朵和毛发边缘
草地
树叶
建筑结构
这些位置都有一个共同特点:
局部结构变化比较明显。
而:
天空
湖面
大面积平滑区域
基本不会出现大量角点。
这和 Harris 的检测逻辑是一致的。
8. Block Size、Kernel Size、K 分别是什么?
Block Size
决定计算局部结构时参考多大的邻域。
这次:
2
Kernel Size
是 Sobel 梯度计算使用的窗口大小。
这次:
3
Harris K
是 Harris 响应公式中的经验参数。
常见值通常在:
0.04~0.06
这次使用:
0.04
这些参数都会影响最终角点数量和灵敏度。
9. Threshold Ratio 为什么很重要?
Threshold Ratio 越低:
检测会更敏感。
角点数量通常更多,但也更容易产生弱响应点。
Threshold Ratio 越高:
只保留更强的角点。
数量会减少,但结果更加严格。
这次使用:
0.010
最终检测出:
605 个角点
说明当前图片本身纹理和结构比较丰富。
10. 总结
这次用华为云码道辅助开发了一个:
OpenCV Harris 角点检测工具。
核心流程:
Grayscale
→ Harris Response
→ Threshold
→ Connected Region
→ Corner Marker
真实测试结果:
- Corner Count:605
- Maximum Response:6.1586 × 10⁷
- Threshold Value:6.1586 × 10⁵
- Block Size:2
- Kernel Size:3
- Harris K:0.04
- Threshold Ratio:0.010
最终可以看到,角点主要集中在狗狗脸部、毛发、草地、树叶和建筑等结构变化明显的位置。
这一篇相比前面的边缘分析又进一步:
边缘告诉我们"哪里发生了变化",角点则告诉我们"哪里结构更有辨识度"。
下一篇可以继续做:
图片里的关键点怎么找?用华为云码道开发 OpenCV FAST 特征点检测工具
这样可以从 Harris 继续过渡到更实际的 Keypoint Detection。