📄 match.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 + -