如何根据从vl_sift获得的数据计算变换矩阵?

时间:2016-06-08 10:07:13

标签: matlab transformation sift

我使用了Andrea Vedaldi的SIFT实现来计算两个图像的筛选描述符,以便对齐它们,

   Ia = imread('roofs1.jpg')) ;
   Ib = imread('roofs2.jpg')) ;

   %calculate descriptors

   [fa,da] = vl_sift(im2single(rgb2gray(Ia))) ;
   [fb,db] = vl_sift(im2single(rgb2gray(Ib))) ;
    %matching
   [matches, scores] = vl_ubcmatch(da,db) ;
   [drop, perm] = sort(scores) ;
   matches = matches(:, perm(1:50)) ;
   scores  = scores(perm(1:50)) 

在我得到关键点之后

d1=fa(1:2,matches(1,:));
d2=fb(1:2,matches(2,:));

现在我想计算这两个图像之间的变换矩阵

Pos1=d1';
Pos2=d2';
Pos1(:,3)=1; Pos2(:,3)=1;
M=Pos1'/Pos2';

然后应用具有函数affine_warp的转换来获得转换后的图像

Ia_warped=affine_warp(Ia,M,'bicubic');

但实际上我得到了这个结果image results

如果有人可以帮我识别代码中的错误

1 个答案:

答案 0 :(得分:1)

您需要确定单应性或变换矩阵,它将第一组中的点映射到另一组。这可以使用Direct Linear Transform算法来完成,该算法在书Multiple View Geometry中进行了解释。 Matlab也有一个tutorial

RANSAC通常用于摆脱一组oulier,其中的演示可以在vlfeat sitePeter Kovesi网站上找到。