⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 match.cpp

📁 利用VC 编写的SIFT 特征匹配程序,可以在影像 旋转,缩放时仍能成功匹配
💻 CPP
字号:
/*Detects SIFT features in two images and finds matches between them.Copyright (C) 2006  Rob Hess <hess@eecs.oregonstate.edu>@version 1.1.1-20070330
*/

//---OpenCV的库文件-----------#pragma comment (lib,"cv")
#pragma comment (lib,"highgui")
#pragma comment (lib, "cxcore")

//---gsl的库文件-----------
#pragma comment (lib, "libgsl.a")


#include "sift.h"#include "imgfeatures.h"#include "kdtree.h"#include "utils.h"#include "xform.h"#include <cv.h>#include <cxcore.h>#include <highgui.h>#include <stdio.h>
#include <iostream.h>/* the maximum number of keypoint NN candidates to check during BBF search */#define KDTREE_BBF_MAX_NN_CHKS 200/* threshold on squared ratio of distances between NN and 2nd NN */#define NN_SQ_DIST_RATIO_THR 0.49/******************************** Globals ************************************///char img1_file[] = ".\\beaver.png";		//怎么VC下一个点就够了的 .net下需要两个点//char img2_file[] = ".\\beaver_xform.png";
char img1_file[] = ".\\b1.JPEG";		//怎么VC下一个点就够了的 .net下需要两个点
char img2_file[] = ".\\b2.JPEG";
double imgzoom_scale=0.7;			//显示匹配结果图的缩放比例

IplImage* img1, * img2, * stacked;


/**************************other functions **************************************/


//----鼠标响应函数(用于根据鼠键响应缩放匹配结果的窗口大小)
void on_mouse( int event, int x, int y, int flags, void* param ) ;


/********************************** Main *************************************/int main( int argc, char** argv ){	struct feature* feat1, * feat2, * feat;	struct feature** nbrs;	struct kd_node* kd_root;	CvPoint pt1, pt2;	double d0, d1;	int n1, n2, k, i, m = 0;	img1 = cvLoadImage( img1_file, 1 );	if( ! img1 )		fatal_error( "unable to load image from %s", img1_file );	img2 = cvLoadImage( img2_file, 1 );	if( ! img2 )		fatal_error( "unable to load image from %s", img2_file );	stacked = stack_imgs( img1, img2 );	fprintf( stderr, "Finding features in %s...\n", img1_file );	n1 = sift_features( img1, &feat1 );	fprintf( stderr, "Finding features in %s...\n", img2_file );	n2 = sift_features( img2, &feat2 );	kd_root = kdtree_build( feat2, n2 );	for( i = 0; i < n1; i++ )	{		feat = feat1 + i;		k = kdtree_bbf_knn( kd_root, feat, 2, &nbrs, KDTREE_BBF_MAX_NN_CHKS );		if( k == 2 )		{			d0 = descr_dist_sq( feat, nbrs[0] );			d1 = descr_dist_sq( feat, nbrs[1] );			if( d0 < d1 * NN_SQ_DIST_RATIO_THR )			{				pt1 = cvPoint( cvRound( feat->x ), cvRound( feat->y ) );				pt2 = cvPoint( cvRound( nbrs[0]->x ), cvRound( nbrs[0]->y ) );				pt2.y += img1->height;				cvLine( stacked, pt1, pt2, CV_RGB(255,0,255), 1, 8, 0 );				m++;				feat1[i].fwd_match = nbrs[0];			}		}		free( nbrs );	}	fprintf( stderr, "Found %d total matches\n", m );
	cvNamedWindow( "Matches", 1 );

	
	//---------鼠键响应函数--------------
	
	cvSetMouseCallback("Matches", on_mouse, 0 );
	

	cvShowImage( "Matches", stacked );
	cvWaitKey( 0 );	/* 	UNCOMMENT BELOW TO SEE HOW RANSAC FUNCTION WORKS	Note that this line above:	feat1[i].fwd_match = nbrs[0];	is important for the RANSAC function to work.	*/	/*	{		CvMat* H;		H = ransac_xform( feat1, n1, FEATURE_FWD_MATCH, lsq_homog, 4, 0.01,			homog_xfer_err, 3.0, NULL, NULL );		if( H )		{			IplImage* xformed;			xformed = cvCreateImage( cvGetSize( img2 ), IPL_DEPTH_8U, 3 );			cvWarpPerspective( img1, xformed, H, 				CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS,				cvScalarAll( 0 ) );			cvNamedWindow( "Xformed", 1 );			cvShowImage( "Xformed", xformed );			cvWaitKey( 0 );			cvReleaseImage( &xformed );			cvReleaseMat( &H );		}	}	*/	cvReleaseImage( &stacked );	cvReleaseImage( &img1 );	cvReleaseImage( &img2 );	kdtree_release( kd_root );	free( feat1 );	free( feat2 );	return 0;}






void on_mouse( int event, int x, int y, int flags, void* param ) 
{
		
	
	int i=0;
	//以前那个函数用到的 先注释掉,可能还有用哦
/*	

  
    if( (event==CV_EVENT_LBUTTONUP) &&  (flags==CV_EVENT_FLAG_SHIFTKEY) ) 
		//shift和鼠标左键开始按下的时候显示检测到角点的数据并保存坐标到xml文件
	{
		
				
	
		
		  cout<<"左图检测出的角点的坐标如下:  "<<endl;	
		
	//------------保存检测到的角点到xml文件----------------------------
		
		CvFileStorage* fs = cvOpenFileStorage( "g_pcorners_l.xml", 0, CV_STORAGE_WRITE );
		
		cvWriteComment(fs, "存储角点的坐标", 0);
		
		cvWriteRawData( fs, g_pcorners_l, 2*num_actual_corners_l, "f" );
		
		cout<<endl<<endl<<"已经存储角点坐标到文件g_pcorners_l.xml"<<endl<<endl;		
		
		cvReleaseFileStorage (&fs);
		
		
		cout<<"右图图检测出的角点的坐标如下:  "<<endl;	
		
		for (i=0; i<num_actual_corners_r; i++)
		{					
			
			cout<<g_pcorners_r[i].x<<"  "<<g_pcorners_r[i].y<<endl;		
			
		}
		
		CvFileStorage* fs_r = cvOpenFileStorage( "g_pcorners_r.xml", 0, CV_STORAGE_WRITE );
		
		cvWriteComment(fs_r, "存储角点的坐标", 0);
		
		cvWriteRawData( fs_r, g_pcorners_r, 2*num_actual_corners_r, "f" );
		
		cout<<endl<<endl<<"已经存储角点坐标到文件g_pcorners_r.xml"<<endl<<endl;		
		
		cvReleaseFileStorage (&fs_r);
		
		
	}
	
*/
	
	if( (event==CV_EVENT_LBUTTONUP) &&  (flags==CV_EVENT_FLAG_CTRLKEY) ) 
		//ctrl和鼠标左键开始按下的时候开始匹配
	{
		
		
		//---------特征点匹配函数--------------	
		
		//corners_matching();
		//corners_matching_02();
	}
	
	
	
	if( (event==CV_EVENT_LBUTTONUP) &&  (flags==CV_EVENT_FLAG_ALTKEY) ) 
		//ALT和鼠标左键开始按下的时候放大匹配结果图
	{
		
		
		//---------特征点匹配函数--------------	
		if(imgzoom_scale<1.0)
		{
			imgzoom_scale=1.1*imgzoom_scale;
		}
		
		else imgzoom_scale=1.0;
		
		//corners_matching();
		//corners_matching_02();
	}
	
	if( (event==CV_EVENT_RBUTTONUP) &&  (flags==CV_EVENT_FLAG_ALTKEY) ) 
		
		//ALT和鼠标右键开始按下的时候缩小匹配图结果
	{
		
		
		//---------特征点匹配函数--------------	
		if(imgzoom_scale>0.0)
		{
			imgzoom_scale=0.9*imgzoom_scale;
		}
		
		else imgzoom_scale=0.5;


		cout<<imgzoom_scale<<endl;
		
		//corners_matching();
		//corners_matching_02();
	}
	

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -