首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 平面设计 > 图形图像 >

ASIFT+OpenCV图像特点匹配实战

2012-09-29 
ASIFT+OpenCV图像特征匹配实战 OpenCV包含头文件:#include cv.h#include highgui.h#include cxcore.h

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图像特点匹配实战

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

热点排行