ASIFT+OpenCV图像特征匹配实战

 

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<float> 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<float> 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<float> 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< keypointslist > > keys1;  
 vector< vector< keypointslist > > 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);

 运行界面:

ASIFT+OpenCV图像特征匹配实战_第1张图片

参考网址:http://www.ipol.im/pub/art/2011/my-asift/ 

工程下载地址:http://download.csdn.net/download/wwy851/4652709

你可能感兴趣的:(vector,image,delete,Parameters,float,IM)