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

how to calculate a transformation matrix based on data obtained from vl_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,:));

现在我想计算这两张图片之间的变换矩阵M

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

然后使用函数 affine_warp 应用变换以获得变换后的图像

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

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

如果有人能帮我找出代码中的错误

您需要确定将点从第一组映射到另一组的单应矩阵或变换矩阵。这可以通过 Direct Linear Transform algorithm which is explained in the book Multiple View Geometry. Matlab also has a tutorial.

来完成

RANSAC 通常用于去除 ouliers 集,其演示可以在 vlfeat site and the site of Peter Kovesi 上找到。