我在 Matlab 中做 vlfeat,我在这里关注这个问题。
以下是我的简单测试图像:
左图:
右图:
我在这里用两张简单的图像做了一个简单的测试(右图只是左图的旋转版本),我得到了相应的结果:
它有效,但我还有一个要求,即匹配两个图像的 SIFT 点并显示它们,如下所示:
我知道 vl_ubcmatch 返回 2 个匹配索引数组,并且将它们映射到两个图像上的哪个点到哪个点不是问题。但是,我目前被困在 matlab 的程序中。我找到了这个。但这只有在子情节保持这种状态时才有效。当您将图像添加到子图中时,大小会发生变化并且标准化失败。
这是我的代码:(im 和 im2 是图像。f、d 和 f2、d2 分别是来自 2 个图像的 vl_sift 函数的帧和描述符)
[matches score] = vl_ubcmatch(d,d2,threshold);%threshold originally is 1.5
if (mode >= 2)%verbose 2
subplot(211);
imshow(uint8(im));
hold on;
plot(f(1,matches(1,:)),f(2,matches(1,:)),'b*');
subplot(212);
imshow(uint8(im2));
hold on;
plot(f2(1,matches(2,:)),f2(2,matches(2,:)),'g*');
end
if (mode >= 3)%verbose 3
[xa1 ya1] = ds2nfu( f(1,matches(1,:)), f(2,matches(1,:)));
[xa2 ya2] = ds2nfu( f2(1,matches(2,:)), f2(2,matches(2,:)));
for k=1:numel(matches(1,:))
xxa1 = xa1(1, k);
yya1 = ya1(1, k);
xxa2 = xa2(1, k);
yya2 = ya2(1, k);
annotation('line',[xxa1 xxa2],[yya1 yya2],'color','r');
end
end
上面的代码产生了这个:
我认为 subplot 不是解决此类问题的好方法。Matlab中是否有更好的方法?如果可能的话,我想要一个空面板之类的东西,我可以绘制我的图像、自由绘制线条和自由缩放,就像以 OpenGL 风格绘制 2D 游戏一样。