2月25日 局域不变特征的目标跟踪,SURF算子,KLT算子

1.0目标:复杂环境下目标跟踪

在这里插入图片描述
在这里插入图片描述

1.1常用目标识别跟踪的算法概述

之所以称其为难点,是对目标的识别和跟踪过程中,存在视觉传感器与目标物体的相对运动,因而,目标在图像中存在着尺度变化、旋转变化、视角变化、照度变化以及局部遮挡,这给目标识别和跟踪带来了挑战。

我们常用的目标识别与跟踪算法有:

  • 基于帧间差分的目标识别与跟踪法、
  • 基于光流的目标识别与跟踪法、
  • 基于模板匹配的目标识别与跟踪法、
  • 基于颜色的目标识别与跟踪法、
  • 基于特征点的目标识别与跟踪法。

2.0基于特征点的目标识别与跟踪法(SURF特征提取与KLT跟踪算法结合)

考虑到每种方法的特点以及待跟踪目标具有清晰的纹理,我们可以采用基于特征点的目标识别与跟踪法,更进一步地说,我们应采用尺度不变特征点作为识别与跟踪的特征,因为尺度不变特征点对尺度变化、旋转变换、视角变化、照度变化和局部遮挡具有鲁棒性。同时,我们希望目标识别和跟踪算法具有良好的实时性,因而,可以考虑PCA-SIFT和SURF特征点作为目标特征。此外,由于视频序列相邻图像之间存在相关性,目标在相邻帧之间不会有剧烈的变换,因而,可采用隔帧搜索法对目标进行检测并用Kalman滤波或粒子滤波对目标的轨迹进行预测。难点分解的过程如图2所示。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
基于局部不变特征的目标跟踪方法是将SURF特征提取与KLT跟踪算法进行有机结合。

2.2 导入:SIFT

在这里插入图片描述
在这里插入图片描述

2.2.1 SIFI 算子里程碑的意义

在这里插入图片描述
在这里插入图片描述
存在的问题:运算复杂度高,无法达到实时性的要求。

联想,要想达到实时性,可能只有深度学习了。??

2.2.2 导入:SURF

在这里插入图片描述

在这里插入图片描述

SIFT与SURF的区别:
在这里插入图片描述
SIFT与SURF对比图片举例
在这里插入图片描述
在这里插入图片描述

2.2.4 CVST编程实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

matlab代码:

clear all;
boxImage = imread('2.jpg');
sceneImage = imread('2_2.jpg');
sceneImage = rgb2gray(sceneImage);
boxImage = rgb2gray(boxImage);
%%%Part1
boxPoints = detectSURFFeatures(boxImage);
scenePoints = detectSURFFeatures(sceneImage);
%%%Part2
[boxFeatures,boxPoints] = extractFeatures(boxImage,boxPoints);
[sceneFeatures,scenePoints] = extractFeatures(sceneImage,scenePoints);
%%Part3
boxPairs = matchFeatures(boxFeatures,sceneFeatures);
% display putatively matched features
matchedBoxPoints = boxPoints(boxPairs(:,1),:);
matchedScenePoints = scenePoints(boxPairs(:,2),:);
figure;
showMatchedFeatures(boxImage,sceneImage,matchedBoxPoints,matchedScenePoints,'montage');title('Matched Points(Including Outliers)');
%%Part4:estimateGeometricTransform
[tform,inlierBoxPoints,inlierScenePoints] = estimateGeometricTransform(matchedBoxPoints,matchedScenePoints,'affine');
% display the matching points pairs with the outliers removed
figure;
showMatchedFeatures(boxImage,sceneImage,inlierBoxPoints,inlierScenePoints,'montage');title('Matched Points(inliers Only)');
%%Part5
% Get the bounding polygon of the reference image
boxPolygon = [1,1;...
              size(boxImage,2),1;...
              size(boxImage,2),size(boxImage,1);...
              1,size(boxImage,1);...
              1,1];
newBoxPolygon = transformPointsForward(tform,boxPolygon);
figure;line(newBoxPolygon(:,1),newBoxPolygon(:,2),'Color','y');title('Detected Box');

在这里插入图片描述

3.0采用SURF特征与模板自适应相结合应用于KLT跟踪算法

3.1KLT跟踪原理???课程没有讲~

在这里插入图片描述
近来在研究跟踪,跟踪的方法其实有很多,如粒子滤波(pf)、meanshift跟踪,以及KLT跟踪或叫Lucas光流法,这些方法各自有各自的有点,对于粒子滤波而言,它能够比较好的在全局搜索到最优解,但其求解速度相对较慢,由于其是基于颜色直方图的计算,所以对相同颜色东西不太能够区别,meanshift方法很容易陷入局部最优,但速度还是挺快,所以现在很有一些人是将meanshift跟pf结合做跟踪,恰好在很多方面能够互补。
参考:https://www.cnblogs.com/moondark/archive/2012/05/12/2497391.html

Kanade-Lucas-Tomasi方法,在跟踪方面表现的也不错,尤其在实时计算速度上,用它来得到的,是很多点的轨迹“trajectory”,并且还有一些发生了漂移的点,所以,得到跟踪点之后要进行一些后期的处理,说到Kanade-Lucas-Tomasi方法,首先要追溯到Kanade-Lucas两人在上世纪80年代发表的paper:An Iterative Image Registration Technique with an Application to Stereo Vision,这里讲的是一种图像点定位的方法,即图像的局部匹配,将图像匹配问题,从传统的滑动窗口搜索方法变为一个求解偏移量d的过程,后来Jianbo Shi和Carlo Tomasi两人发表了一篇CVPR(94’)的文章Good Features To Track,这篇文章,主要就是讲,在求解d的过程中,哪些情况下可以保证一定能够得到d的解,这些情况的点有什么特点(后来会发现,很多时候都是寻找的角点)。

3.1.1KLT算法的原理,其实其跟踪效果并非太准,后来有很多提出的校正的方法

其中我目前看到比较实用的就是TLD算法的作者Zdenek Kalal在他2010年ICPR上的文章Forward-Backward Error: Automatic Detection of Tracking Failures提出的方法看起来非常不错,我正动手实现之。

3.1.2项目假设

先说KLT算法的几个前提假设:
  1)亮度恒定
  2)时间连续或者是运动是“小运动”
3)空间一致,临近点有相似运动,保持相邻

3.2原理

如果判断一个视频的相邻两帧I、J在某局部窗口w上是一样的,则在窗口w内有:I(x, y, t) = J(x’, y’, t+τ);
亮度恒定的假设(假设1)即为了保证其等号成立不受亮度的影响;

假设2是为了保证KLT能够找到点;

假设3则为以下原因假设(即对于同一个窗口中,所有点的偏移量都相等):在窗口w上,所有(x, y)都往一个方向移动了(dx, dy),从而得到(x’, y’),即t时刻的(x, y)点在t+τ时刻为(x+dx, y+dy),所以寻求匹配的问题可化为对以下的式子寻求最小值,或叫做最小化以下式子:

在这里插入图片描述

在这里插入图片描述
用积分来表示上述式子,以上式子可等效为:
在这里插入图片描述

这个式子的含义,即找到两副图像中,在W窗口中,I、J的差异,其中I以x-d/2为中心,J以x+d/2为中心,w/2为半径的一个矩形窗口间的差异,好吧,结合我们微积分的知识,函数ε(d)要取得最小值,这个极值点的导数一定为0,即
在这里插入图片描述
的值为0。

由泰勒展开的性质:

在这里插入图片描述

可以得到:

在这里插入图片描述
在这里插入图片描述
于是,问题转化为:

在这里插入图片描述
其中:
在这里插入图片描述
从而,问题即为:
在这里插入图片描述
又,
在这里插入图片描述
即其等式可看作为:
在这里插入图片描述
其中,Z为一个22的矩阵,
在这里插入图片描述
e为一个2
1的向量,是计算的残差
在这里插入图片描述

3.3求解分析

求解方程在这里插入图片描述为了要使d能够得到解,则Z需要满足条件,即Z*Z’矩阵可逆,其中Z’为Z矩阵的转置(ZT),在一般情况下,角点具有这样的特点。但不一定能得到精确解,可以利用牛顿迭代法求解,当残差e小于一定阈值时,就认为得到了近似解。

另外,KLT对于图像中的目标,并不是目标框和跟踪框内的所有的点都求取偏移量,而是选择一些特征不变的角点(corners),可以不同的特征不变的角点作为跟踪点,比如SIFT、SURF、FAST、SUSAN、HARRIS等。

在这里shi-tomasi提出了一种Good Features的角点。他们认为,(5)式中的对称矩阵Z包含了噪声和良好条件,当矩阵Z的两个特征值较小时,意味着以该点为中心W为窗口内是平坦的;一大一小的两个特征值,对应无方向的纹理特征;两个较大的特征值代表了当前点是角点或者椒盐纹理。所以,当两个特征值大于一定阈值时,选择这个点作为角点。

原文链接:https://blog.csdn.net/irobot_davinci/article/details/29635199

综上所述,当我们采用角点进行跟踪时,如果通过方程Zd=e解得的残差e足够小(设定的阈值),认为是跟踪到的一个角点,并求出了角点的偏移d。

在OpenCV里面,找角点的函数可用

void cvGoodFeaturesToTrack(
   const CvArr* image
   CvArr* eigImage, CvArr* tempImage
   CvPoint2D32f* corners
   int* cornerCount
   double qualityLevel
   double minDistance
   const CvArr* mask=NULL
   int blockSize=3
   int useHarris=0 //一般采用Harris角点
   double k=0.04 );

然后可以通过函数cvCalcOpticalFlowPyrLK进行跟踪(好像OpenCV里面调用LK的函数不止这一个,这个是金字塔计算):

void cvCalcOpticalFlowPyrLK(
    const CvArr* prev,
    const CvArr* curr,
    CvArr* prevPyr,
    CvArr* currPyr,
    const CvPoint2D32f* prevFeatures,
    CvPoint2D32f* currFeatures,
    int count,
    CvSize winSize,
    int level,
    char* status,
    float* track error,
    CvTermCriteria criteria,
    int flags );

3.2模板自适应更新策略:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.3 思路

在这里插入图片描述
参考:https://blog.csdn.net/qq_43409984/article/details/89606194

N.0傅里叶变换的补充

图像的空间变换,但是空间变换无法反映图像的频率分布信息,随着傅里叶变换的诞生,这一问题得到了解决,傅里叶变换也被研究者誉为是“图像处理的第二种语言”。正在人们为之欢心鼓舞之时,研究者有发现傅里叶变换也存在着不足,它在空域上无任何分辨,不能作局部分析。针对于此,D.Gabor 于1946年提出了加窗傅里叶变换,也就是著名的Gabor变换,它通过引入一个时间局部化“窗函数”改进了傅里叶变换的不足,但其窗口大小和形状都是固定的,没有从根本上弥补傅里叶变换的缺陷。小波变换的提出从根本上解决了这一难题,它有一个灵活可变的时间—频率窗,能有效地从信号中提取信息,通过伸缩和平移等运算功能对函数或信号进行多尺度细化分析,“数学显微镜”的美誉也因此得来。
在这里插入图片描述
在这里插入图片描述

发布了66 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/djfjkj52/article/details/104433936