ASIFT+OpenCV图像特征匹配实战VC工程源码
OpenCV包含头文件:
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
核心代码如下:
if (!m_pImage1||!m_pImage2)
{
AfxMessageBox("please,select 2 images!");
return;
}
UpdateData(TRUE);
CvSize sz1 = cvSize(m_pImage1->width,m_pImage1->height);
CvSize sz2 = cvSize(m_pImage2->width,m_pImage2->height);
CvScalar s;
IplImage *gimg1 = cvCreateImage(sz1,IPL_DEPTH_8U,1);
cvCvtColor(m_pImage1,gimg1,CV_BGR2GRAY);
IplImage *gimg2 = cvCreateImage(sz2,IPL_DEPTH_8U,1);
cvCvtColor(m_pImage2,gimg2,CV_BGR2GRAY);
size_t w1, h1;
w1 = gimg1->width;
h1 = gimg1->height;
float * iarr1 = new float[w1*h1];
for(int i=0;i<h1;i++)
{
for(int j=0;j<w1;j++)
{
s=cvGet2D(gimg1,i,j);
iarr1[i*w1+j] = s.val[0];
}
}
vector ipixels1(iarr1, iarr1 + w1 * h1);
delete [] iarr1;
size_t w2, h2;
w2 = gimg2->width;
h2 = gimg2->height;
float * iarr2 = new float[w2*h2];
for(int i=0;i<h2;i++)
{
for(int j=0;j<w2;j++)
{
s=cvGet2D(gimg2,i,j);
iarr2[i*w2+j] = s.val[0];
}
}
vector ipixels2(iarr2, iarr2 + w2 * h2);
delete [] iarr2;
float wS = IM_X;
float hS = IM_Y;
float zoom1=0, zoom2=0;
int wS1=0, hS1=0, wS2=0, hS2=0;
vector ipixels1_zoom, ipixels2_zoom;
if (!m_bOrininal)
{
if (m_lWidth==0 || m_lHeight == 0)
return;
wS = m_lWidth;
hS = m_lHeight;
float InitSigma_aa = 1.6;
float fproj_p, fproj_bg;
char fproj_i;
float *fproj_x4, *fproj_y4;
int fproj_o;
fproj_o = 3;
fproj_p = 0;
fproj_i = 0;
fproj_bg = 0;
fproj_x4 = 0;
fproj_y4 = 0;
float areaS = wS * hS;
// Resize image 1
float area1 = w1 * h1;
zoom1 = sqrt(area1/areaS);
wS1 = (int) (w1 / zoom1);
hS1 = (int) (h1 / zoom1);
int fproj_sx = wS1;
int fproj_sy = hS1;
float fproj_x1 = 0;
float fproj_y1 = 0;
float fproj_x2 = wS1;
float fproj_y2 = 0;
float fproj_x3 = 0;
float fproj_y3 = hS1;
/* Anti-aliasing filtering along vertical direction */
if ( zoom1 > 1 )
{
float sigma_aa = InitSigma_aa * zoom1 / 2;
GaussianBlur1D(ipixels1,w1,h1,sigma_aa,1);
GaussianBlur1D(ipixels1,w1,h1,sigma_aa,0);
}
// simulate a tilt: subsample the image along the vertical axis by a factor of t.
ipixels1_zoom.resize(wS1*hS1);
fproj (ipixels1, ipixels1_zoom, w1, h1, &fproj;_sx, &fproj;_sy, &fproj;_bg, &fproj;_o, &fproj;_p,
&fproj;_i , fproj_x1 , fproj_y1 , fproj_x2 , fproj_y2 , fproj_x3 , fproj_y3, fproj_x4, fproj_y4);
// Resize image 2
float area2 = w2 * h2;
zoom2 = sqrt(area2/areaS);
wS2 = (int) (w2 / zoom2);
hS2 = (int) (h2 / zoom2);
fproj_sx = wS2;
fproj_sy = hS2;
fproj_x2 = wS2;
fproj_y3 = hS2;
/* Anti-aliasing filtering along vertical direction */
if ( zoom1 > 1 )
{
float sigma_aa = InitSigma_aa * zoom2 / 2;
GaussianBlur1D(ipixels2,w2,h2,sigma_aa,1);
GaussianBlur1D(ipixels2,w2,h2,sigma_aa,0);
}
// simulate a tilt: subsample the image along the vertical axis by a factor of t.
ipixels2_zoom.resize(wS2*hS2);
fproj (ipixels2, ipixels2_zoom, w2, h2, &fproj;_sx, &fproj;_sy, &fproj;_bg, &fproj;_o, &fproj;_p,
&fproj;_i , fproj_x1 , fproj_y1 , fproj_x2 , fproj_y2 , fproj_x3 , fproj_y3, fproj_x4, fproj_y4);
}
else
{
ipixels1_zoom.resize(w1*h1);
ipixels1_zoom = ipixels1;
wS1 = w1;
hS1 = h1;
zoom1 = 1;
ipixels2_zoom.resize(w2*h2);
ipixels2_zoom = ipixels2;
wS2 = w2;
hS2 = h2;
zoom2 = 1;
}
int num_of_tilts1 = m_lTilts1;
int num_of_tilts2 = m_lTilts2;
int verb = 0;
// Define the SIFT parameters
siftPar siftparameters;
default_sift_parameters(siftparameters);
vector< vector > keys1;
vector< vector > keys2;
int num_keys1=0, num_keys2=0;
SetWindowText("Computing keypoints on the two images...");
CString str1,str2;
time_t tstart, tend1,tend2;
tstart = time(0);
DWORD dstart = GetTickCount();
num_keys1 = compute_asift_keypoints(ipixels1_zoom, wS1, hS1, num_of_tilts1, verb, keys1, siftparameters);
tend1 = time(0);
m_lKeyNum1 = num_keys1;
UpdateData(FALSE);
str1.Format("Img1 Keypoints computation accomplished in %f s",difftime(tend1, tstart));
SetWindowText(str1);
num_keys2 = compute_asift_keypoints(ipixels2_zoom, wS2, hS2, num_of_tilts2, verb, keys2, siftparameters);
tend2 = time(0);
m_lKeyNum2 = num_keys2;
UpdateData(FALSE);
str2.Format("Img2 Keypoints computation accomplished in %f s ,Matching the keypoints...",difftime(tend2, tstart));
SetWindowText(str2);
//// Match ASIFT keypoints
int num_matchings;
matchingslist matchings;
tstart = time(0);
num_matchings = compute_asift_matches(num_of_tilts1, num_of_tilts2, wS1, hS1, wS2,
hS2, verb, keys1, keys2, matchings, siftparameters);
tend1 = time(0);
DWORD dSpan = GetTickCount() - dstart;
cout << "Keypoints matching accomplished in " << difftime(tend1, tstart) << " seconds." << endl;
str2.Format("Keypoints matching accomplished in %f s",difftime(tend1, tstart));
SetWindowText(str2);
m_lMatches = num_matchings;
UpdateData(FALSE);
str1.Format("Total time used:%d ms",dSpan);
AfxMessageBox(str1);
cvRelease((void**)&gimg1;);
cvRelease((void**)&gimg2;);
参考网址:http://www.ipol.im/pub/art/2011/my-asift/