2016-06-08 50 views
0

我用安德烈Vedaldi的SIFT執行,計算出兩幅圖像的SIFT描述符以便對準他們,如何根據從vl_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獲得tranformed圖像

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

但在現實中,我得到這個結果image results

如果有人可以幫我找出其中的錯誤在我的代碼

回答

1

您需要確定單應或變換矩陣將第一組的點映射到另一個點。這可以通過在Multiple View Geometry書中解釋的Direct Linear Transform算法完成。 Matlab也有一個tutorial

RANSAC通常用於清除一組可以在vlfeat sitePeter Kovesi網站上找到的演示文稿。

+0

非常感謝您的回覆,通常這是我想用'M = Pos1'/ Pos2'做的事; Ia_warped = affine_warp(Ia,M,'bicubic');'你有什麼想法我應該做什麼? 不幸的是我不能使用RANSAC,因爲我必須用我自己的算法刪除異常值。 –

+1

'M = Pos1'/ Pos2'是錯誤的。請參閱DLT。 – Maurits

+0

將您的提案應用於DLT M = DLT(Pos1',Pos2');',我得到相同的結果(白色而不是黑色!) –