关键点和描述子
关键点和跟踪基础
一个角点是一小块含有丰富局部信息的图像
关键点是对来自图像的小的局部像斑的信息进行编码,是的关键点具有高度可识别性
角点检测
在实际操作中,选择的特征点应该是唯一的,并且应该是可参数化的,以至于它可以与其他图像中的其他点进行比较
如果在两个方向附近观察到强微分,那么我们认为这一点就更有可能是独一无二的。直观上看,角点是从一帧到下一帧之间包含足够信息的点
用opencv在图像中找到被跟踪好的候选点,然后用哈尔的方法确定他们
使用cv::goodFeaturesToTrack() 寻找角点
亚像素角点
如果处理图像来提取几何测量值,而不是提取要是别的特征,那么需要更高的分辨率
尝试将曲线拟合到图像像素值,然后使用一些数学运算来确定像素之间出现峰值的位置
用于亚像素细化的最常见技巧之一是基于向量和其正交向量之间的点积为0的数学发现,这种情况发生在角点处
cv::cornerSubPix() 寻找亚像素角点
(亚像素:比像素还小的像素概念)
光流简介
光流问题涉及尝试找出一幅图像中许多点在第二幅图像中移动的位置,通常这是以视频序列完成的,因此可以假设第一幅图像中大部分点框架都可以在第二幅中找到
光流可以用于场景中的物体的运动估计,甚至用于相机相对整个场景的自运动估计
光流的理想输出是两帧图像中每个像素的速度的估计关联,或者等效的,一幅图像中的每个像素的位移矢量,指示该像素在另一幅图像中的相对位置
图像中每个像素都使用方法,则称为稠密光流
替代类算法称为稀疏光流,仅仅跟踪图像中某些点的子集(计算成本低,快速可靠
Lucas-Kanade稀疏光流法
仅依赖于围绕每个兴趣点的一些小窗口导出的局部信息,缺点是运动幅度过大,像素点会运动到局部窗口之外,不能被算法找到。
这个问题导致金字塔LK算法的发展,从图像金字塔(最低的细节)最高级别开始跟踪,并逐渐跟踪至更低级别(更精细的细节),允许大幅度运动被局部窗口捕获
Lucas-Kanade算法的工作原理基于以下三个假设
亮度恒定: 场景中目标的 图像像素看起来在帧到帧移动时不发生改变,对于灰度图像,这意味着我们假设像素的灰度不会随着帧的跟踪改变
时间持续性或”微小移动“: 图像上相斑的运动随时间变化缓慢。实际上这意味着时间相对于图像运动的尺度来说足够快,从而目标图像两帧之间的运动幅度不会太大
空间一致性: 场景中属于相同表面的相邻点,具有相似的运动,并且其投影到图像平面上的点距离也比较近
方程的解和秩有关,低秩方程缺少约束,导致孔径问题(小窗口)
稀疏矩阵满秩–具有两个适当打的特征向量,意味着包含至少两个方向运动,当跟踪窗口在图像中的一个角点区域居中时,稀疏矩阵具有最佳属性
使用图像金字塔首先跟踪较大的空间尺度,然后通过沿着图像金字塔的水平工作来完善初始运动速度假设,直到我们跟踪到原始图像像素
金字塔Lucas-Kanada光流 函数实现cv::calcOpticalFlowPyrLK()
广义关键点和描述符
关键点和描述符的差异
在最高抽象层次上,关键点是图像的一小部分,独特以至于可以在另一个相关图像中定位它们;描述符是一些数学结构,通常是浮点型向量,以某种方式描述单个关键点,并且可以用于确定在某些场景中两个关键点是否相同
历史上第一个重要的关键点是哈尔角点:在两个不同的坐标轴上,强度变化剧烈的图像中任何一点像素都是另一个相关图像上对应点的匹配
光流,跟踪和识别
关键点(及其描述符)主要用于三个任务:跟踪,目标识别和立体视觉
跟踪是随着场景在顺序图像流中演变而跟踪某个目标的运动的任务:一个是在静态场景中跟踪对象,另一个是跟踪场景本身以估计摄像机的运动
目标识别是观察场景并尝试识别一个或多个已知目标的存在:如果发现了足够多的与特定目标相关联的关键点,就可以合理地推断出该目标存在于场景中