我在Matlab做vlfeat和我下面这个问题在这里 。
下面这些是我简单的测试图片:
左图:
右图:
我没有在这里2个简单图像的简单测试(右侧图像是左的只是旋转版本),因此我得到的结果:
它的工作原理,但我有更多的一个要求,这是相匹配的两幅图像的SIFT点,并告诉他们,就像这样:
我也明白,vl_ubcmatch返回2个阵列匹配的指数,它是不是把它们映射一个问题,这点去上两个图像这点。 不过,我目前停留在MATLAB的过程。 我发现了这个 。 但是,只有当插曲保持这样的工作。 当您添加一个图像到次要情节,大小的变化和规范化失败。
这是我的代码:(IM和Im2是图像f,d和f 2,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
上面的代码产生这样的:
我觉得插曲是不是要走的是这样的一个好办法。 是否有这个在Matlab一个更好的方法? 如果可能的话,我想是一个空的面板,我可以借鉴我的形象,自由画线和缩放自如,就像在OpenGL绘图风格2D游戏。
从zplesivcak的建议,是的,这是可能的,毕竟不是问题。 下面是代码:
% After we have applied vl_sift with 2 images, we will get frames f,f2,
% and descriptor d,d2 of the images. After that, we can apply it into
% vl_ubcmatch to perform feature matching:
[matches score] = vl_ubcmatch(d,d2,threshold); %threshold originally is 1.5
% check for sizes and take longest width and longest height into
% account
if (size(im,1) > size(im2,1))
longestWidth = size(im,1);
else
longestWidth = size(im2,1);
end
if (size(im,2) > size(im2,2))
longestHeight = size(im,2);
else
longestHeight = size(im2,2);
end
% create new matrices with longest width and longest height
newim = uint8(zeros(longestWidth, longestHeight, 3)); %3 cuz image is RGB
newim2 = uint8(zeros(longestWidth, longestHeight, 3));
% transfer both images to the new matrices respectively.
newim(1:size(im,1), 1:size(im,2), 1:3) = im;
newim2(1:size(im2,1), 1:size(im2,2), 1:3) = im2;
% with the same proportion and dimension, we can now show both
% images. Parts that are not used in the matrices will be black.
imshow([newim newim2]);
hold on;
X = zeros(2,1);
Y = zeros(2,1);
% draw line from the matched point in one image to the respective matched point in another image.
for k=1:numel(matches(1,:))
X(1) = f(1, matches(1, k));
Y(1) = f(2, matches(1, k));
X(2) = f2(1, matches(2, k)) + longestHeight; % for placing matched point of 2nd image correctly.
Y(2) = f2(2, matches(2, k));
line(X,Y);
end
下面是测试情况:
通过修改画布宽度,并且从问题的图像中的一个的高度,我们可以看到,上述算法将采取照顾,并相应地显示图像。 未使用的区域将是黑色。 此外,我们看到,该算法可以分别匹配两个图像的特征。
编辑:
另外,通过Maurits的建议,对更清洁,更好地执行,看看洛SIFT MATLAB包装 。
如果您安装了Matlab的计算机视觉库光盘上已经,您可以简单地使用
M1 = [f(1, match(1, :)); f(2, match(1, :)); ones(1, length(match))];
M2 = [f2(1, match(2, :)); f2(2, match(2, :)); ones(1, length(match))];
showMatchedFeatures(im,im2,[M1(1:2, :)]',[M2(1:2, :)]','montage','PlotOptions',{'ro','g+','b-'} );
文章来源: Getting stuck on Matlab's subplot mechanism for matching images' points for vlfeat