前面已经做过 Harris 角点和 FAST 特征点检测,这次继续往下一步走:
不仅找到关键点,还要描述这些关键点。
这次我用华为云码道辅助开发了一个:
OpenCV ORB 特征提取工具。
它可以检测图片中的关键点,并为每个关键点生成二进制描述子,为后续图像匹配做准备。
1. 这次工具做什么?
主要功能包括:
- 上传 JPG / PNG 图片
- 使用 ORB 检测关键点
- 设置 Max Features
- 显示 ORB Feature Result
- 统计 Keypoint Count
- 显示 Descriptor Shape
- 绘制关键点位置
- 支持下载检测结果
整体流程:
图片
→ 灰度化
→ ORB Detect
→ Keypoints
→ Binary Descriptors
→ 可视化结果

2. ORB 是什么?
ORB 全称:
Oriented FAST and Rotated BRIEF
它把两部分结合起来:
- FAST:负责快速寻找关键点
- BRIEF:负责生成二进制描述子
同时 ORB 又加入了方向信息,使特征对图像旋转具有更好的适应能力。
所以 ORB 不只是回答:
"关键点在哪里?"
还会继续回答:
"这个关键点附近长什么样?"
3. 核心代码怎么实现?
首先创建 ORB:
orb = cv2.ORB_create( nfeatures=1000)
然后直接检测并生成描述子:
keypoints, descriptors = orb.detectAndCompute( gray, None)
关键点数量:
keypoint_count = len(keypoints)
描述子尺寸则可以直接查看:
descriptor_shape = descriptors.shape
4. Keypoint 和 Descriptor 有什么区别?
这两个概念很容易混。
Keypoint
表示:
特征出现在哪里。
通常包括:
- 坐标
- 尺度
- 方向
- 响应强度
Descriptor
表示:
这个关键点附近的局部特征是什么样。
后面做图像匹配时,真正拿来比较的主要就是这些 Descriptor。
可以简单理解成:
Keypoint
→ 地址
Descriptor
→ 身份特征
5. 真实测试结果
这次继续使用狗狗公园图片。
图片尺寸:
1650 × 953
设置:
Max Features = 1000
最终得到:
- Keypoint Count:1000
- Descriptor Shape:1000 × 32
- Max Features:1000
页面中也可以看到大量绿色 ORB 特征点。
6. 1000 × 32 怎么理解?
这是这次最关键的结果。
Descriptor Shape:
1000 × 32
表示:
有 1000 个关键点
每个关键点对应:
32 bytes 描述子
也就是:
1000 个关键点
×
每个关键点 32 bytes
由于:
1 byte = 8 bit
所以每个 ORB 描述子长度为:
256 bit
这也是 ORB 二进制描述子的典型形式。
7. 为什么刚好检测到 1000 个点?
这次设置:
Max Features = 1000
最终:
Keypoint Count = 1000
说明 ORB 最终已经达到了当前允许保留的特征点上限。
这并不代表图片中只有:
1000 个候选特征点。
更准确地说:
ORB 最终筛选并保留了最多允许的 1000 个关键点。
如果把 Max Features 调高,可能还会得到更多特征。
8. 关键点主要集中在哪里?
从结果图可以看到,ORB 特征主要集中在:
狗狗眼睛
鼻子
嘴部
毛发
草地
树叶
远处建筑
这些区域都有较明显的:
纹理
角点
局部灰度变化
而天空、湖面这种比较平滑的区域,特征点明显更少。
说明 ORB 会优先选择更具有局部辨识度的位置。
9. ORB 和 FAST 有什么区别?
上一篇 FAST 主要负责:
快速找关键点。
而 ORB 更进一步:
找关键点 + 生成描述子。
上一篇 FAST 得到:
8,506 个关键点
这次 ORB 设置:
Max Features = 1000
最终保留:
1000 个关键点
并且为每个关键点生成了:
32 字节描述子
所以 ORB 更适合继续做:
图像匹配
目标识别
拼接
定位
这类需要"比较特征"的任务。
10. 总结
这次用华为云码道辅助开发了一个:
OpenCV ORB 特征提取工具。
核心流程:
Grayscale
→ ORB
→ Keypoints
→ Binary Descriptors
真实测试结果:
- Max Features:1000
- Keypoint Count:1000
- Descriptor Shape:1000 × 32
- 每个描述子:32 bytes / 256 bits
这次相比前面的 Harris 和 FAST 又进一步:
Harris 找角点
FAST 找关键点
ORB 不仅找关键点,还会给关键点生成描述子
而这些 Descriptor,正是后面做图像匹配的基础。
下一篇可以继续: