Linux教程網
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);
運行界面:
Copyright ©
Linux教程網 All Rights Reserved