图片里的角点在哪里?用华为云码道开发 OpenCV Harris 角点检测工具

前面已经做过 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。

相关推荐
宅小年4 分钟前
为什么你的 Grok Bot 总走偏?教你写一个真正好用的 Bot 模板
人工智能
明月_清风5 分钟前
Meta 开源了一个 AI Native 组件库:Astryx,150+ React 组件,专为 AI Agent 而设计
前端·人工智能·ai编程
神鹰手哥_起飞版8 分钟前
一句「你确定吗」能让 AI 把白的说成黑的?我用直接用豆包来做实验
人工智能
afumu16 分钟前
把五个网页版 AI 拉进同一个群聊:不用 API key 的多 Agent 编排
人工智能·chrome·typescript
寂寞的船35 分钟前
【Unity知识速递】第4期 MCP for Unity:用 AI 自然语言控制编辑器
人工智能·unity·编辑器
彭祥.1 小时前
Jetson边缘计算实现 红外测温+可见光AI识别系统
人工智能·边缘计算
明王明王1 小时前
从零搭建一个 AI Infra 实验室㉑:llm-d——从单个 vLLM 走向分布式推理
人工智能·ai infra
武子康1 小时前
图片删了,为什么旧链接还能打开、后台还能生成回来?
人工智能·agent
yuanyuan3342 小时前
2026枣庄带检测报告伸缩门品牌测评|本地服务
大数据·数据库·人工智能·伸缩门
无所畏俱的老尹2 小时前
Agent 落地为什么需要影子对照:同输入只读双跑、写动作变提案、差异报警,比直接切全量更安全
人工智能·机器学习·云计算·aigc·devops