首先,你不应该使用vl_sift而不是sift?
其次,可以使用SIFT特征匹配来找到两个图像中的对应关系。以下是一些示例代码:
I = imread('p1.jpg');
J = imread('p2.jpg');
I = single(rgb2gray(I)); % Conversion to single is recommended
J = single(rgb2gray(J)); % in the documentation
[F1 D1] = vl_sift(I);
[F2 D2] = vl_sift(J);
% Where 1.5 = ratio between euclidean distance of NN2/NN1
[matches score] = vl_ubcmatch(D1,D2,1.5);
subplot(1,2,1);
imshow(uint8(I));
hold on;
plot(F1(1,matches(1,:)),F1(2,matches(1,:)),'b*');
subplot(1,2,2);
imshow(uint8(J));
hold on;
plot(F2(1,matches(2,:)),F2(2,matches(2,:)),'r*');
vl_ubcmatch()本质上执行以下操作:
假设你在F1中有一个点P,你想在F2中找到“最好”的匹配。一种方法是将F1中的P的描述符与D2中的所有描述符进行比较。通过比较,我的意思是找到欧几里德距离(或两个描述符的差异的L2范数)。
然后,我在F2中找到两点,说U& V,其分别具有距离P的最低和第二最低距离(比如,Du和Dv)。
这里是Lowe推荐的:如果Dv / Du> = threshold(我在示例代码中使用1.5),那么这个匹配是可以接受的;否则,它不明确地匹配,并且作为对应被拒绝,并且我们不匹配F2到P中的任何点。基本上,如果最佳和次优匹配之间存在很大差异,则可以期望这是一个质量匹配。
这是很重要的,因为图像中的模糊匹配有很多空间:想象湖中的匹配点或具有多个窗口的建筑物,描述符可以看起来非常相似,但是对应显然是错误的。
你可以用任何数量的方式进行匹配。你可以使用MATLAB很容易地做到自己,或者你可以通过使用KD树或近似最近的号码搜索,如FLANN,已在OpenCV实施加快速度。