关键点和跟踪基础——learning opencv3第16章翻译 一

个人觉得关键点和描述符是OpenCV的基础,并且在learning opencv3中增加了很多心的内容,所以特别翻译出来作为学习


本章是关于图像中的信息特征点。 我们将从头开始描述所谓的角点,并在子像素中探索他们的定义域。然后,我们将学习如何用光流跟踪这些角。从历史上看,角色的跟踪演变成关键点的理论,我们将会投入其中本章的其余部分,包括关键点功能的广泛讨论,检测器和描述符在OpenCV库中实现,供您使用。

角点的概念以及关键点的概念是基于这样的直觉,在许多应用中,能够以不变形式表示在相同场景或对象的其他类似图像中将相同或至少非常相似的图像或对象将是有用的。角点和关键点表示是强大的方法。一个角点是一小块图像,具有丰富的本地信息,因此可能在另一个图像中被识别。关键点是这种概念的扩展,其编码来自图像的小局部补丁的信息,使得关键点是高度可识别的,并且至少在原理上基本上是唯一的。关于关键点的描述性信息以其描述符的形式被概括,其描述符通常比形成关键点的像素补丁维数低的多。描述符表示该补丁,以便在另一个不同的映像中出现时,更容易识别该补丁。

从直观的角度来看,你可以想像一个关键点,就像拼图中的一块难题。当你开始拼图,一些片段很容易被认可:门的手柄,脸,教堂的尖顶。当你去组装拼图,你可以立即将这些关键点与拼图盒上的图像相关联,并立即知道放置在哪里。另外,如果你和一个朋友有两个未组装的谜题,你想知道它们是否是美丽的新天鹅堡的两个不同的图像,你可以组装两个谜题并比较,但是你也可以选择最多每个拼图的突出部分,并比较它们。在后一种情况下,您只需要几场比赛才能相信他们是同一个拼图,或者是由同一个城堡的两个不同图像制成的两个拼图。

在本章中,我们将从建立关键点理论的基础开始讨论现代关键点的最早的祖先:Harris。从在那里我们将讨论这种角落的光学流动的概念,其中捕获了在视频序列中将这些特征从一帧跟踪到另一帧的基本思想。之后,我们将继续使用更现代的关键点及其描述符,并讨论OpenCV如何帮助我们找到它们,以及库如何帮助我们匹配他们之间的框架。最后,我们将看一个方便的方法,让我们来可视化重叠在被检测到的图像之上的关键点。

寻找角点

    有多种局部特征可以用来跟踪。花一点时间去思考究竟角点用什么样的特征来描述是值得的。很明显,如果从一面很大的空墙上选择一个点,那么将很难从视频的下一帧中再找处这一点。如果墙上的所有点都是一样的或者是相似的,我们就不会有太好的运气能在随后的视频帧中跟踪到这个点了。相反,如果选择一个独一无二的点,那么再找到这点的几率就非常大。实际上,被选择的点或特征点应该是独一无二的,或者至少接近独一无二,并且在与另一张图像的其它点可以进行参数化的比较。如图16-1


图16-1 圆圈圈处的特征点是易于跟踪的点,而矩形圈出的特征——甚至是明显的边缘——却不然

回到那面大而空的墙,我们想要找本身具有明显变化的点——例如导数值比较明显的地方。虽然仅此是不够的,但这是一个开始。一个导数值比较明显的点可能在某种类型的边缘上,但却和此边缘上的其他点看起来一样(参考“Lucas-Kanade方法”一节中讨论的孔径问题)。

如果一个点在两个正交的方向上都有明显的导数,则我们认为此点更倾向是独一无二的,所以,许多可跟踪的特征点都称为角点。从直观上讲,角点(而非边缘)时一类含有足够信息且能从当前帧和下一帧中都能提取出来的点。

最普遍使用的角点是由Harris[Harris88]提出的。定义的基础是图像灰度强度的二阶导数矩阵。考虑到图像所有的像素点,我们可以想象图像的二阶导数形成一幅新的“二阶导数图像”,或融合在一起形成一幅新的Hessian图像。这个术语源自于一个点的如下定义的二维Hessian矩阵:

对于Harris角点,我们使用每点周围小窗口的二阶导数图像的自相关矩阵。这个自相关矩阵的定义如下:

这里是可以归一化的权重比例,但是通常被用作产生圆形窗口或高斯权重。Harris定义的角点位于图像二阶导数的自相关矩阵有两个最大特征值的地方,这在本质上表示以此点为中心周围存在至少两个不同方向的纹理(或者边缘),正如实际的角点是由至少两个边缘相交于一点而产生。之所以采用二阶导数是由于它对均匀梯度不产生响应。角点的这个定义还有另一个优点。被跟踪的物体在移动过程中也可能会旋转,找到同时对移动和旋转不变的量是很重要的。只考虑自相关矩阵的特征值可达到这个目的。这两个最大特征值不仅可以判定一个点是否一个号的可跟踪的特征点,同时也提供了对这个点进行标示的一个标识。

Harris最原始的定义是将矩阵H(P)的行列式值与H(p)的迹(带权重系数)相减,再将差值同预先给定的阈值进行比较。后来Shi和Tomasi[Shi94]发现,若两个特征值中较小的一个大于最小阈值,则会得到强角点。Shi和Tomasi的方法比较充分,并且在很多情况下可以得到比使用Harris方法更好的结果。函数cv::goodFeaturesToTrack()常规执行Harris的方法并且做了轻微的提升。该功能便于计算必要的导数运算符,对其进行分析,并返回符合我们定义以适合跟踪的点的列表:

void cv::goodFeaturesToTrack(

cv::InputArray image,               //输入, CV_8UC1 or CV_32FC1

cv::OutputArray corners,          //输出,角点矢量

int maxCorners,                        //Keep this many corners

double qualityLevel,                  //(fraction) rel to best

double minDistance,                 //Discard corner this close

cv::InputArray mask = noArray(),    //Ignore corners where mask=0

int blockSize = 3,                             //Neighborhood used

bool useHarrisDetector = false,      //false='Shi Tomasi metric'

double k = 0.04                               //Used for Harris metric

);

输入图像可以是任何8比特或者32比特(例如 8U或者32F)的单通道图像。输出角点将是一个包括找到的所有角点的向量或者数组(依赖你所提供),如果是一个矢量,输出将是一个矢量的cv::Point2f对象。如果是一个cv::Mat,输出将是每个角点一行和保存x和y点位置的两列。您可以限制使用maxCorners找到的角数,质量等级(通常在0.10和0.01之间,绝对不超过1.0)的返回点的质量以及具有minDistance的相邻角之间的最小间距。

如果提供参数掩码,则它必须与图像的尺寸相同,并且角色将不会在任何地方生成,掩码为0。blockSize参数表示计算角点时考虑的面积有多大,一个典型值是3。但是,对于高分辨率图像,您可能希望将其略大。使用useHarrisDetector参数,如果设置为true,将导致cv:: goodFeaturesToTrack()使用额外的Harris原始算法的精确角强度公式。如果设置为false,则将使用Shi的Tomasi的方法。 参数k仅由Harris算法使用,最好保持默认值。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值