Sift描述子的实现

%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的情况:
这里写图片描述

我们可以看到主方向大体上沿着其明显纹理的边缘方向。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值