计算机视觉 OpenCV Android | 特征检测与匹配 之 Feature2D中的检测器与描述子

本文详细介绍OpenCV中特征检测器与描述子的种类及应用,包括ORB、BRISK、AKAZE等算法的特点与实现代码,适合计算机视觉与图像处理领域的开发者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言及特征点监测器

前面提到的SURF与SIFT特征检测器与描述子
其实都是OpenCV扩展模块xfeature2d中的内容,
而在OpenCV本身包含的feature2d模块中包含了几个非常有用的特征检测器与描述子
所支持的特征点检测器(FeatureDetector)如下:

  • FAST=1
  • STAR=2
  • ORB=5
  • MSER=6
  • GFTT=7
  • HARRIS=8
  • SIMPLEBLOB=9
  • DENSE=10
  • BRISK=11
  • AKAZE=12

其中,3、4本来是SIFTSURF的,但在OpenCV3.x中,它们已经被移到扩展模块中了。
如果使用OpenCV官方编译好的OpenCV4Android 3.x版本的SDK
则当声明与使用这两个类型的时候,它会告诉你不支持


描述子类型

feature2d支持的特征点检测器还支持以下的描述子类型

  • DescriptorExtractor.ORB=3
  • DescriptorExtractor.BRIEF=4
  • DescriptorExtractor.BRISK=5
  • DescriptorExtractor.FREAK=6
  • DescriptorExtractor.AKAZE=7

这里其实还有1与2分别是SIFT与SURF
但其已经被移到扩展模块了,所以如果声明使用会抛出不支持的错误提示。


简单介绍几种特征提取方法

feature2d模块同时具有特征点检测与描述子功能的方法ORB、BRISK、AKAZE

下面我们简单介绍一下这三种特征提取方法

1.ORB检测器与描述子
  • ORB(Oriented FAST and Rotated BRIEF)是OpenCV实验室于2011年开发出来的一种新的特征提取算法
    相比较于SIFT与SURF
    ORB的一大好处是没有专利限制
    可以免费自由使用
    同时具有旋转不变性与尺度不变性

OpenCV4Android中创建ORB检测器与描述子的代码:

FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
DescriptorExtractor descriptorExtractor = DescriptorExtractor.create(DescriptorExtractor.ORB);
2.BRISK检测器与描述子
  • BRISK(Binary Robust Invariant Scalable Keypoint)特征检测与描述子是在2011年由几位作者联合提出的一种新的特征提取算法

OpenCV4Android中创建ORB检测器与描述子的代码如下:

FeatureDetector detector = FeatureDetector.create(FeatureDetector.BRISK);
DescriptorExtractor descriptorExtractor = DescriptorExtractor.create(DescriptorExtractor.BRISK);
3.AKAZE检测器与描述子
  • AKAZE算法是SIFT算法之后,
    具有尺度不变性旋转不变性算法领域再一次突破
    它是KAZE特征提取算法加速版本

  • 算法原理有别于前面提到的几种方法
    其是通过正则化PM方程与AOS(加性算子分裂)方法求解非线性扩散
    从而得到 尺度空间 的 每一层

  • 采样的方法与SIFT类似,
    对每一层实现候选点的定位与过滤以实现关键点的提取

  • 然后再使用与SURF求解方向角度类似的方法实现旋转不变性特征,
    最终生成AKAZE描述子

AKAZE算法的原理本身比较复杂,笔者所读的书中亦无详细解说,
感兴趣的小伙伴阅读相关论文去深入了解。

在OpenCV4Android中创建AKAZE特征检测器与描述子的代码如下:

FeatureDetector detector = FeatureDetector.create(FeatureDetector.AKAZE);
DescriptorExtractor descriptorExtractor = DescriptorExtractor.create(DescriptorExtractor.AKAZE);
4. OpenCV4Android中feature2d检测器与描述子的使用

基于feature2d中的检测器对象实现对象关键点检测的演示代码:

FeatureDetector detector = null;
if(type == 1) {
  detector = FeatureDetector.create(FeatureDetector.ORB);
} else if(type == 2) {
  detector = FeatureDetector.create(FeatureDetector.BRISK);
} else if(type == 3) {
  detector = FeatureDetector.create(FeatureDetector.FAST);
} else if(type == 4){
  detector = FeatureDetector.create(FeatureDetector.AKAZE);
} else {detector = FeatureDetector.create(FeatureDetector.HARRIS);
}
MatOfKeyPoint keyPoints = new MatOfKeyPoint();
detector.detect(src, keyPoints);
Features2d.drawKeypoints(src, keyPoints, dst);

以AKAZE为例,在feature2d中实现图像特征检测、描述子计算、特征匹配的演示代码如下:

private void descriptorDemo(Mat src, Mat dst) {
  String boxFile = fileUri.getPath().replaceAll("box_in_scene", "box");
  Mat boxImage = Imgcodecs.imread(boxFile);
  FeatureDetector detector = FeatureDetector.create(FeatureDetector.AKAZE);
  DescriptorExtractor descriptorExtractor = DescriptorExtractor.create
(DescriptorExtractor.AKAZE);

  // 关键点检测
  MatOfKeyPoint keyPoints_box = new MatOfKeyPoint();
  MatOfKeyPoint keyPoints_scene = new MatOfKeyPoint();
  detector.detect(boxImage, keyPoints_box);
  detector.detect(src, keyPoints_scene);

  // 描述子生成
  Mat descriptor_box = new Mat();
  Mat descriptor_scene = new Mat();
  descriptorExtractor.compute(boxImage, keyPoints_box, descriptor_box);
  descriptorExtractor.compute(src, keyPoints_scene, descriptor_scene);

  // 特征匹配
  MatOfDMatch matches = new MatOfDMatch();
  DescriptorMatcher descriptorMatcher = DescriptorMatcher.create
(DescriptorMatcher.BRUTEFORCE_HAMMING);
  descriptorMatcher.match(descriptor_box, descriptor_scene, matches);
  Features2d.drawMatches(boxImage, keyPoints_box, src, keyPoints_scene, matches, dst);

  // 释放内存
  keyPoints_box.release();
  keyPoints_scene.release();
  descriptor_box.release();
  descriptor_scene.release();
  matches.release();
}

如果是作者本人的GitHub项目的话,
运行时,首先需要把drawable中的box.png与box_in_scene图像放到SD卡上的指定目录下,
在演示程序运行之后选择box_in_scene图像即可。
当然我们也可以更改一下代码,使用别的图片进行测试或者把图片放在项目中进行测试。



参考材料
### 计算机视觉实验6.1:特征检测匹配计算机视觉领域,OpenCV 提供了许多强大的工具来执行特征检测匹配的任务。以下是基于 OpenCV特征检测匹配的一个完整示例。 #### 使用SIFT算法进行特征检测匹配 SIFT(Scale-Invariant Feature Transform)是一种经典的特征提取方法,它能够在不同尺度下保持不变性并提供鲁棒的特征描述子[^1]。下面是一个完整的 Python 示例代码: ```python import cv2 import numpy as np from matplotlib import pyplot as plt # 加载两张图片 img1 = cv2.imread('image1.jpg', cv2.IMREAD_GRAYSCALE) # 查询图像 img2 = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE) # 训练图像 # 初始化 SIFT 检测器 sift = cv2.SIFT_create() # 找到关键点和描述符 kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) # 创建 BFMatcher 对象 bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True) # 匹配描述符 matches = bf.match(des1, des2) # 根据距离排序 matches = sorted(matches, key=lambda x: x.distance) # 绘制前10个匹配项 img_matches = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS) plt.imshow(img_matches), plt.show() ``` 此代码展示了如何加载两幅灰度图像,并利用 SIFT 算法找到它们的关键点和描述符。随后通过暴力匹配器 `BFMatcher` 进行特征匹配,并绘制出最佳匹配结果。 --- #### SURF算法简介及其优化 SURF(Speeded-Up Robust Features)是对 SIFT 的一种改进版本,在速度上有所提升。为了进一步加速计算过程,SURF 利用了积分图技术以及 Hessian 矩阵的近似值[^3]。下面是使用 SURF 替代 SIFT 的简单修改版代码片段: ```python surf = cv2.xfeatures2d_SURF.create() # 初始化 SURF 检测器 (需安装 opencv-contrib-python) kp1, des1 = surf.detectAndCompute(img1, None) kp2, des2 = surf.detectAndCompute(img2, None) ``` 需要注意的是,SURF 和 SIFT 均属于专利保护范围内的算法,因此在某些情况下可能无法免费商用。如果需要开源替代方案,可以考虑 ORB 或 BRISK 等无专利限制的方法。 --- #### 自动驾驶中的应用实例 除了传统的图像检索外,这些特征检测匹配技术还广泛应用于自动驾驶场景下的环境感知环节。例如,特斯拉公司借助先进的计算机视觉模型解析摄像头捕捉的数据流,从而完成车道线跟踪、障碍物规避等功能[^4]。 --- #### 性能评估指标 对于任何实际项目而言,仅实现基本的功能还不够;还需要关注运行效率及准确性等问题。通常采用以下几种方式衡量效果: - **重复率**:同一物体在同一视角变换条件下被正确识别的比例; - **误检率**:错误标记背景像素为前景目标的概率; - **响应时间**:单帧处理所需耗时长短等。 以上各项参数均会影响最终用户体验质量,故应综合考量选取最适配当前需求的技术路线[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌川江雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值