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 1float 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 2float 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图像特征匹配实战

相关文章:

你感兴趣的文章:

标签云: