|||
指定一本书的封面作为模板,如何在一个图像里找到它的位置和姿态?
模板: ,图像:
基本上有两种方法:1. 基于特征的方法,需要计算模板的特征,比如角点局部梯度等,然后在图像中定位,流行的方法有SIFT和HOG(Histogram of oriented gradients)等。2. 基于区域的方法,更像是一种模板匹配的方法,利用梯度下降的方法,比如Lucas Kanade算法。实际上第一种方法更适合进行物体检测,而第二种方法在初始搜索位置(比如视频前一帧中物体位置)和物体实际位置(物体在当前帧中位置)非常接近的时候,可以很快收敛到最优点,这个特性可以用来进行跟踪。
利用国庆长假做了个多尺度L-K算法的小程序,可以实现6个参数仿射(affine)变换和8个参数投影变换的模板匹配。作用是定位一本书(一个矩形平面),得到模板与物体实际位置的8个变换参数,模板就是上面那个书的封面。各个尺度上匹配结果,蓝色线框为初始位置,红色为收敛结果。效果如下:
图像和模板的金字塔每层尺寸分别是:
图像 | 模板
40×30 | 18×13
80×60 | 37×27
160×120 | 75×54
320×240 | 151×109
迭代次数分别是38,6,8,7,可以看出在分辨率最小的图上,匹配结果已经基本达到预期,在其他几层上很快就收敛了。
根据LK算法的描述,关键在于计算匹配函数对于8个参数偏导数,求出最快下降方向pinv
%先计算模板梯度
[gx,gy]=gradient(temp);
xx=x.*x;
xy=x.*y;
yy=y.*y;
%再算Jacobian与梯度内积,x,y是模板上每个点坐标,gx,gy是梯度
JJ=[x.*gx, x.*gy, y.*gx, y.*gy, gx, gy, -xx.*gx-xy.*gy, -xy.*gx-yy.*gy];
pinv = inv(JJ'*JJ)*JJ';
以上计算是在模板上离线进行的,可以称为训练(training)步骤。
如果计算仿射变换,Jacobian矩阵为6列:
JJ=[x.*gx, x.*gy, y.*gx, y.*gy, gx, gy];
如果计算光流,Jacobian矩阵为2列:
JJ=[gx, gy];
匹配(fitting)是个迭代过程:
%imw是从图像采样结果,warping image
imr = temp - imw;
%乘以最快下降方向,得到参数变化
dp = pinv*imr(:);
%compositional method
Ht = Ht* [1+dp(1),dp(3),dp(5);dp(2),1+dp(4),dp(6);dp(7),dp(8),1];
Ht = Ht/Ht(3,3);
Ht是其次坐标表达的变换矩阵。金字塔每层迭代结束后,Ht要传给下一层,作为初始参数,对应大一号模板和大一号图像的匹配。每层开始,计算矩形四个角点tpcor的初始位置(图上蓝线框):
%tpcor是以模板中心为原点的4个角点坐标
pd = (Ht*[tpcor;ones(1,4)])';
pd(:,1)=pd(:,1)./pd(:,3);
pd(:,2)=pd(:,2)./pd(:,3);
plot(pd(:,1),pd(:,2),'-b',pd([1,4],1),pd([1,4],2),'-b');
程序没有对物体的4个角点进行任何约束,实际上它们的位置应该满足一定的统计特性。
这个方法很简单,虽然只有8个参数,只能能跟踪平面,但它可以作为跟踪复杂物体的基础。因为任何物体都可以用有限个数的空间平面来近似拟合。各个平面的跟踪不是单独进行的,它们总体要满足一定的约束,可以用很少的参数来表达。比如人脸,可以用几十个三角型平面来表达,但它的形状姿态变化却可以用子空间(就是PCA)法用10多个参数来表达,它发展出来的方法就是著名的Active Appearence Model。
L-K方法请参考 http://www.sciencenet.cn/m/user_content.aspx?id=367906
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-27 05:23
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社