opencv一般如何处理关键点和描述符
- 根据一些关键点的定义搜索图像并查找该图像中的所有关键点
- 为发现的每个关键字创建一个描述符
- 通过将所找到的关键点的描述符与一些现有的描述符集进行比较,看看是否可以找到匹配项
cv::KeyPoint对象
表示关键点位置以及次要特征
找到关键点的类或为它们计算计算描述符:cv::Feature2D
cv::DMatch对象
匹配是如何表达的:匹配器将是一个尝试将一个图像中的关键点与其他单个图像或字典(图像集合)进行匹配的对象
(抽象)关键点匹配类:cv::DescriptorMatcher
检测描述匹配过程的第三阶段也通过一系列对象来实现,这些对象都是从它们共享接口的公共抽象基类cv::DescriptorMatcher派生的
比较抽象,不太明白
核心关键点检测方法
关键点概念最重要特征之一:即使图像的分辨率变得非常高,它也允许将图像“消化”为有限数量的基本元素
Harris-Shi-Tomasi特征检测器和cv::GoodFeaturesToTrackDetector
最常用的角点定义是哈里斯提出,被称为哈尔角点,可以被认为是原始的关键点
定义依赖于一个小区域像素之间的自相关概念,这意味着“如果图像被移动了Δx,Δy位置,它与原来的自己有多相似”
角点是图像中的自相关矩阵具有两个大的特征值的位置,实质上这意味着在任何方向移动一小段距离都会造成图像改变
之后Shi和Tomasi发现只要两个特征值中较小的一个特征值大于最小阙值,就会产生良好角点
简单的blob检测器和cv::SimpleBlobDetector
斑点本质上没有那么明确的局部化,而是表示可能随时间有一定稳定性的感兴趣区域
简单斑点检测器通过首先将输入图像转换为灰度图,然后从该灰度图计算一系列阙值图像
FAST特征检测器和cv::FastFeayureDetector
最初的FAST(加速段测试的特征)特征检测算法是基于将点P与其包围圈的点集直接比较的思想。
如果附近的几个点与P类似,那么P将成为一个很好的关键点
定义每个角点的得分,并且可以删除与较高分数的关键点相邻的所有关键点
SIFT特征检测器和cv::xfeatures2d::SIFT
和许多其他特征类型相比,SIFT特征计算开销很大,但是具有高度表达能力,因此非常适合跟踪和识别任务
初始阶段会计算输入图像和一组高斯核之间的卷积,这赋予SIFT特征尺度不变的特性
首先用各种大小的高斯内核卷积原始图像,然后再相邻尺寸的卷积之间计算差分图像来定位尺度空间极值;再差分图像中,再相同层和相邻层中将每个像素与其所有邻居进行比较,如果高斯信号的差比三层图像上所有相邻像素都强,则认为该像素是空间尺度极值
发现一组特征后对每个特征进行测试,确定其作为特征的质量并改进对其位置的估计,通过将抛物面拟合到极值周围的3x3x3体来实现
基于比较在关键点周围点的方向导数,并选择对应于导数最大的方向,由此SIFT特征不仅具有尺度不变性,而且具有方向不变性
SURF特征检测器和cv::xfeaturesd::SURF
SURF(加速鲁棒特征)在很多方面是SIFT特征的演变
为了引入尺度的概念,SIFT检测器使用具有稍微不同宽度的高斯卷积的差来计算局部Hessian,然而,SURF检测器通过与近似两个高斯内核的差的盒式滤波器进行卷积来计算局部Hessian,这些盒式滤波器的主要优点是可以使用积分图像技术
盒式滤波器的计算成本并不随着滤波器的尺寸而变化,不必像SIFT生成图像的尺度金字塔
SURF包括一个特征的方向概念,再次使用积分图像来估计特征周围区域的局部体积梯度,使用一对简单的Haar小波来近似局部梯度
Star/CenSurE特征检测器和cv::xfeaturesd::StarDetector
Star特征最初是用于视觉测距,只是从图像数据测量摄像机自身的运动
Star特征也称中心环绕极值功能,试图解决提供哈尔角点或FAST特征的局部化水平问题,同时还提供尺度不变性
BRIEF描述符提取器和cv::BriefDescriptorExtractor
BRIEF即二进制鲁棒独立基本特征,不找关键点,相反它用于生成可通过任何其他可用的特征检测器算法定位的关键点的描述符
BRIEF描述符背后的基本概念是将特征描述成一系列测试,每个测试简单地将特征区域中单个像素与一些其他单个像素进行比较,基于哪个部分更亮产生简单的二进制结果
避免描述符对噪声过度敏感,首先通过与高斯内核卷积来平滑图像,描述符是二进制字符串,可以快速计算并高效存储,还可以有效进行比较
BRISK算法
ORB特征检测器和cv::ORB
FREAK描述符提取器和cv::xfeastures2d::FREAK
稠密特征网络和cv::DenseFeatureDetector类
以上都不太懂。。。。
关键点过滤
发现自己有一些关键点列表,需要以某种方式修剪,opencv使用关键点滤波器处理
cv::KeyPointsFilter类
匹配方法
用cv::BFMatcher进行暴力匹配
快速近似最近邻和cv::FlannBasedMatcher
结果显示
使用cv::drawKeypoints来显示关键点