Sift描述子的實現
阿新 • • 發佈:2019-01-01
%E:\matlabworkplace\headpose_with_block\feature\sift
clearvars;close all;
% prepare data
imgPath='E:\data\lfw\imgs\Aaron_Eckhart\Aaron_Eckhart_0001.jpg';
img=imread(imgPath);
img=rgb2gray(img);
bbox=[63 72 126+63 126+72];%box.x box.y box.x2 box.y2
landmark=[34 35; 53 38; 41 86; 75 90; 58 93; 59 87 ;72 40 ;94 43; 48 70; 72 72];%相對於box.x box.y
nlandmark=size(landmark,1);
isShow=false;
for i=1:nlandmark
landmark(i,1)=landmark(i,1)+bbox(1);
landmark(i,2)=landmark(i,2)+bbox(2);
end
figure(1);
imshow(img);
hold on;
%% sigma調節的引數
sigma=1.0;
sigma2=ones(1,10).*sigma;
ori=zeros(1,10);
f2=[];
for i=1:nlandmark
plot(landmark(i ,1),landmark(i,2),'.r','markersize',15);
f2_t=[landmark(i,1);landmark(i,2);sigma2(i);ori(i)];
f2=[f2 f2_t];
end
%% sift_descriptor
tic;
[d1,ori]=sift_descriptor(img,landmark,sigma,0);
time1=toc;
d1=d1';
f1=[];
for i=1:nlandmark
f1_t=[landmark(i,1);landmark(i,2);sigma;ori(i)];
f1=[f1 f1_t ] ;
end
hold on;
h1=vl_plotframe(f1(:,1:end));
h2=vl_plotframe(f1(:,1:end));
set(h1,'color','k','linewidth',3);
set(h2,'color','y','linewidth',2);
h3 = vl_plotsiftdescriptor(d1(:,1:end),f1(:,1:end)) ;
set(h3,'color','g') ;
disp(['sift_descriptor計算描述子的時間為 :' num2str(time1)]);
%% vl_sift
tic;
img=single(img);
[f2,d2]=vl_sift(img,'frames',f2,'orientations','FloatDescriptors');
time2=toc;
disp(['vl_sift計算描述子的時間為 :' num2str(time2)]);
saveas(gcf,'sift_descriptor.png');
sift_descriptor計算描述子的時間為 :0.0017716
vl_sift計算描述子的時間為 :0.083869
尺度為1.0的情況:
尺度為1.6的情況:
尺度為2.4的情況:
我們可以看到主方向大體上沿著其明顯紋理的邊緣方向。