gpt4 book ai didi

matlab - 卡在 Matlab 的子图机制上以匹配 vlfeat 的图像点

转载 作者:太空宇宙 更新时间:2023-11-03 19:38:53 24 4
gpt4 key购买 nike

我在 Matlab 中做 vlfeat,我正在关注这个问题 here .

下面是我简单的测试图片:

左图:

L

右图:

R

我在这里用 2 个简单的图像做了一个简单的测试(右图只是左图的旋转版本),我得到了相应的结果:

test

可以,但是我还有一个要求,就是匹配两张图片的SIFT点,然后显示出来,像这样:

likethis

我知道 vl_ubcmatch 返回 2 个匹配索引数组,并且将它们映射到两个图像上的哪个点到哪个点不是问题。但是,我目前停留在 matlab 的程序中。我找到了 this .但这只有在子图保持这种状态时才有效。当您将图像添加到子图中时,尺寸发生变化并且归一化失败。

这是我的代码:(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

上面的代码产生了这个:

an

我认为子图不是处理此类事情的好方法。在 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

这是测试用例:

tc

通过修改问题中其中一张图像的 Canvas 宽度和高度,我们看到上面的算法会处理这个问题并相应地显示图像。未使用的区域将是黑色的。此外,我们看到该算法可以分别匹配两幅图像的特征。

编辑:

或者,根据 Maurits 的建议,为了更清晰和更好的实现,请查看 Lowe SIFT matlab wrappers .

关于matlab - 卡在 Matlab 的子图机制上以匹配 vlfeat 的图像点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13305416/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com