一、几个重要的网址
1、matlab 安装 vl_feat:http://blog.youkuaiyun.com/u013213396/article/details/42629105
摘要:这个包里面含有各种图像处理需要的工具,比如提取 hog,sift 特征,训练线性 svm 参数等。
2、布朗大学公开课中的第三个作业,和场景识别有关:http://cs.brown.edu/courses/csci1430/proj3/
3、详细讲了讲vl_sift:http://www.cnblogs.com/tgyf/archive/2013/06/02/3113648.html
二、SIFT
1、vl_sift
一般教程:参考官方文档http://www.vlfeat.org/overview/sift.html
中文翻译教程:http://blog.youkuaiyun.com/linj_m/article/details/9833473
问题所在:vl_sift始终要求输入必须是灰度、single图像。官方示例图片给出的single()纯属扯淡。
具体解决方案:
img=imread('img.jpg');
img1=rgb2gray(img);
img2=im2single(img1);%这才是标配的转化single图像写法
f=vl_sift(img2);
%% vl_sift
% 准备工作,包括single和灰度化
figure;
I = imread('notebook1.jpg');
I = im2single(I) ;
%图像特征点的提取,f,d分别代表特征点坐标及对象描述子
%The matrix f has a column for each frame. A frame is a disk of center
%f(1:2), scale f(3) and orientation f(4) .
[f,d] = vl_sift(I) ;
h1 = vl_plotframe(f(:,:)) ;
h2 = vl_plotframe(f(:,:)) ;
set(h1,'color','k','linewidth',3) ;
set(h2,'color','y','linewidth',2) ;
%% vl_sift匹配
Ia = imread('notebook1.jpg');
Ia = im2single(Ia);
Ib = imread('notebook2.jpg');
Ib = im2single(Ib);
[fa, da] = vl_sift(Ia);
[fb, db] = vl_sift(Ib) ;
% matches存储的最相近两点,scores存储的代价距离
% 小技巧:size(matches,2)可以得知匹配点数量
[matches, scores] = vl_ubcmatch(da, db);
%% matlab自带的sift特征提取及显示
[image, descrips, locs] = sift('notebook1.jpg');
showkeys(image, locs);
%% 普通匹配
match('notebook1.jpg','notebook2.jpg');