asfit算法学习

来源:互联网 发布:python java c 比较 编辑:程序博客网 时间:2024/06/06 14:21

未完待续。。。。。。。。。。。

限于本人理论水平有限只能边看代码边看理论

asift官网:http://www.cmap.polytechnique.fr/~yu/research/ASIFT/FAQ.html  

asift代码下载地址:http://www.cmap.polytechnique.fr/~yu/research/ASIFT/demo.html 里面还提供一个online demo 可以更直观的认识asift。里面的资料很全。

一:编译并运行代码。

1.下载代码.

2.下载cmake,并运行cmake,如果vs正在运行,要先关闭vs。运行完毕后会出现vs的工程文件。

3.打开vs按下f5然后就ok了,在debug文件夹下就会出现


4.常见问题:在安装了两个版本的vs(例如同时安装vs2010和vs2012)的电脑上在运行cmake的时候会出现:“VS2010 C++编译报错LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 ”而导致camke失败。解决方法参看:http://blog.csdn.net/jia_zhengshen/article/details/12782997  中的第15个方法。

二:算法流程。

1、仿射变换的公式:

根据论文中原文论述:t一般取值 1,a,a2,a3....an ,并且a>1,建议a的取值为 √2.n的取值5或者大于5.   ;精度theta的取值一般为0,b/t.....kb/t   .b的取值为72°。kb/t应当小于180°。fai的取值原文中没有论述。

使用opencv实现上述公式

参考网址:

仿射变换参考文章:

http://blog.csdn.net/xiaowei_cqu/article/details/7616044   (理论)

http://blog.csdn.net/watkinsong/article/details/10212715  (应用);

http://blog.csdn.net/tyf122/article/details/8107266     cv2DRotationMatrix 函数的翻译。

http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.html opencv's  affine doc

2。依照上面的采样值,采样才能使采到的特征具有仿射不变性。

3.依照上面的参数进行采样,进行sift特征提取。

4.进行逆仿射变换。(在asift作者提供的源代码中compensate_affine_coor1()函数可以完成这项功能。)

把在仿射变换后的图像提取到的特征点的坐标逆仿射变换,映射到原始的图像的坐标。

5.经过上面4步,asift特征就提取完毕了。在match阶段由于本质还是sift特征,所以在match阶段与sift的match过程完全相同。


我首先把fai的值设置为0则公式(1)就得第一个矩阵就变成了单位矩阵。

以下的代码为中的get函数为公式(1)的实现。main函数为一个测试函数。代码如下:(update;。。。本人发现函数不能正确的出现效果。2014.1.14)

#include<opencv/cv.h>#include<opencv/highgui.h>//十分抱歉,这段代码发现了个很大的bug,不能使用,仅用做我本人的记录使用。using namespace cv;/*angle 的单位为度。t为asift公式中的t,scale为尺度,center为源图像的中心位置。*/cv::Mat getAffineParam(float _angle ,float t,float scale,cv::Point center){float angle = _angle *CV_PI/180;float alpha = cos(angle)*scale;  float beta = sin(angle)*scale;  Mat M(2, 3, CV_32F);  float* m = (float*)M.data;  m[0] = alpha;  m[1] = beta;  m[2] = (1-alpha)*center.x - beta*center.y;  m[3] = -beta*t;  m[4] = alpha*t;  m[5] = t*beta*center.x + (1-t*alpha)*center.y;return M;}void main(){Mat img = imread("hello.jpg");cv::Point center;  center.x = img.cols / 2;  center.y = img.rows / 2;  float scale = 0.1;float t = 1;float angle = 72;//*CV_PI/180;for(int i=0;i<10;i++){cv::Mat param = getAffineParam(angle,t,scale,center);Mat dst;warpAffine(img, dst, param, cvSize(img.cols, img.rows), CV_INTER_LINEAR,0,Scalar::all(255));  cv::circle(dst,center,20,Scalar(0,255,0),-1);imshow("hello",dst);waitKey();t *=1.41;}}



0 0
原创粉丝点击