近日把SIFT特征提取及匹配算法推导了一遍,就开始我个人的一个认识吧。
关于SIFT的算法介绍见最下面的链接。
如果用SIFT的话,MATLAB的SIFT的code可以学习,个人认为还是C写的SIFT比较好。
VLFeat提供C写的SIFT特征提取算法代码,调用如下:
//读入图像
char *ImagePath="10011.jpg";
IplImage *Image=cvLoadImage(ImagePath,0);
// int min=0;
// min=Image->width>Image->height?Image->height:Image->width;
//sift特征提取参数设置
int noctaves=4,nlevels=2,o_min=0;
// noctaves=(int)(log(min)/log(2));
//加载vlfeat库的sift特征库函数
vl_sift_pix *ImageData=new vl_sift_pix[Image->height*Image->width];
unsigned char *Pixel;
for (int i=0;i<Image->height;i++)
{
for (int j=0;j<Image->width;j++)
{
Pixel=(unsigned char*)(Image->imageData+i*Image->width+j);
ImageData[i*Image->width+j]=*(Pixel);
}
}
VlSiftFilt *SiftFilt=NULL;
SiftFilt=vl_sift_new(Image->width,Image->height,noctaves,nlevels,o_min);
int KeyPoint=0;
int idx=0;
if (vl_sift_process_first_octave(SiftFilt,ImageData)!=VL_ERR_EOF)
{
while (true)
{
//计算每组中的关键点
vl_sift_detect(SiftFilt);
//遍历并绘制每个点
KeyPoint+=SiftFilt->nkeys;
VlSiftKeypoint *pKeyPoint=SiftFilt->keys;
for (int i=0;i<SiftFilt->nkeys;i++)
{
VlSiftKeypoint TemptKeyPoint=*pKeyPoint;
pKeyPoint++;
cvDrawCircle(Image,cvPoint(TemptKeyPoint.x,TemptKeyPoint.y),TemptKeyPoint.sigma/2,CV_RGB(255,0,0));
idx++;
//计算并遍历每个点的方向
double angles[4];
int angleCount=vl_sift_calc_keypoint_orientations(SiftFilt,angles,&TemptKeyPoint);
for (int j=0;j<angleCount;j++)
{
double TemptAngle=angles[j];
printf("%d: %f\n",j,TemptAngle);
//计算每个方向的描述
float *Descriptors=new float[128];
vl_sift_calc_keypoint_descriptor(SiftFilt,Descriptors,&TemptKeyPoint,TemptAngle);
int k=0;
//输出128维的值
while (k<128)
{
printf("%d: %f",k,Descriptors[k]);
printf("; ");
k++;
}
printf("\n");
delete []Descriptors;
Descriptors=NULL;
}
}
//下一阶
if (vl_sift_process_next_octave(SiftFilt)==VL_ERR_EOF)
{
//
break;
}
//free(pKeyPoint);
KeyPoint=NULL;
}
}
vl_sift_delete(SiftFilt);
delete []ImageData;
ImageData=NULL;
cvNamedWindow("Source Image",1);
cvShowImage("Source Image",Image);
如果用OpenCV的话,代码如下:
Mat image=imread("1.jpg");
Mat iamgeGray=imread("1.jpg",0);
Mat descriptors;
vector<KeyPoint> keypoints;
SiftFeatureDetector sift2(0.06f,10.0);
sift2.detect(iamgeGray,keypoints);
drawKeypoints(image,keypoints,image,Scalar(255,0,255));
imshow("test",image);
waitKey();
return 0;
SIFT的改进型:
FAST-SIFT (Dom金字塔取代Dog金字塔)
PCA-SIFT(减少特征子匹配)
上面两种在改进型SIFT特征提取分析见后续博文。。。。
SIFT特征提取分析相关链接:
http://blog.youkuaiyun.com/abcjennifer/article/details/7639681
https://github.com/robwhess/opensift/tree/master/src
http://www.cs.ubc.ca/~lowe/papers/ijcv04.pdf
http://blog.youkuaiyun.com/abcjennifer/article/details/7365882
http://en.wikipedia.org/wiki/Scale-invariant_feature_transform#David_Lowe.27s_method
http://blog.sciencenet.cn/blog-613779-475881.html
http://www.cnblogs.com/linyunzju/archive/2011/06/14/2080950.html
http://www.cnblogs.com/linyunzju/archive/2011/06/14/2080951.html
http://blog.youkuaiyun.com/ijuliet/article/details/4640624
http://www.cnblogs.com/cfantaisie/archive/2011/06/14/2080917.html