未完待续。。。。。。。。。。。
限于本人理论水平有限只能边看代码边看理论
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; } }