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

📄 test2eyesdlg.cpp

📁 基于SIFT快速匹配算法
💻 CPP
字号:
// test2eyesDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "test2eyes.h"
#include "test2eyesDlg.h"

//---OpenCV的库文件-----------
#pragma comment (lib,"cv200d")
#pragma comment (lib,"highgui200d")
#pragma comment (lib, "cxcore200d")

//---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 <math.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// Ctest2eyesDlg 对话框




Ctest2eyesDlg::Ctest2eyesDlg(CWnd* pParent /*=NULL*/)
	: CDialog(Ctest2eyesDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void Ctest2eyesDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(Ctest2eyesDlg, CDialog)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDOK, &Ctest2eyesDlg::OnBnClickedOk)
END_MESSAGE_MAP()


// Ctest2eyesDlg 消息处理程序

BOOL Ctest2eyesDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void Ctest2eyesDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSOR Ctest2eyesDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}


void Ctest2eyesDlg::OnBnClickedOk()
{
	int l=0;
	if(l<5)
     l=4;
	
	

/******************************** Globals ************************************/

char img1_file[] = "D:\\project\\test2eyes\\test2eyes\\gray-s-l.bmp";
char img2_file[] = "D:\\project\\test2eyes\\test2eyes\\gray-s-r.bmp";

//char img1_file[] = ".\\034.JPG";	在当前文件夹找图片
//char img2_file[] = ".\\035.JPG";



double imgzoom_scale=1.0;			//显示匹配结果图的缩放比例

			

IplImage* stacked;






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


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

//---改变匹配结果图像的大小------------------------

//void resize_img();

/********************************** Main *************************************/




	IplImage* img1, * img2;

	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,n=0,p,p1=1,p2=0,p3,i1=0, i2=0,i3=0,z,x;
	int pr1_x[200],pr1_y[200],pr2_x[200],pr2_y[200],dist[200];
	int prx1[200],pry1[200],prx2[200],pry2[200];
    int dis[200];
	int  image1_x, image1_y, image2_x, image2_y;
    double result,result1,result2,result3,result4,distance;
	

	//------------内存存储器------------
	CvMemStorage* memstorage = cvCreateMemStorage(0);

	//-----------up_seq存储img1匹配出的特征点的坐标-----------

	CvSeq *up_seq = cvCreateSeq(	CV_SEQ_ELTYPE_POINT,
					sizeof(CvSeq),
					sizeof(CvPoint),
					memstorage); 

	//-----------down_seq存储img2匹配出的特征点的坐标-----------

	CvSeq *down_seq = cvCreateSeq(	CV_SEQ_ELTYPE_POINT,
					sizeof(CvSeq),
					sizeof(CvPoint),
					memstorage); 


	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 );


	//----------显示img1的SIFT特征---------
	/*if(1)
	{
	draw_features( img1, feat1, n1 );
	cvNamedWindow( "img1_feature", 1 );
		cvShowImage( "img1_feature", img1 );
		
	}


	//----------显示img2的SIFT特征---------
	if(1)
	{
		draw_features( img2, feat2, n2 );
		cvNamedWindow( "img2_feature", 1 );
		cvShowImage( "img2_feature", img2 );
	}*/



	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 ) );

				//---------存储单个点坐标到点序列中----------
				cvSeqPush(up_seq,&pt1); 
				cvSeqPush(down_seq,&pt2); 
				pt2.y += img1->height;
 
                image1_x=pt1.x;	
                image1_y=pt1.y;
				image2_x=pt2.x;
				image2_y=pt2.y;
				
				result1=image2_x-image1_x;
				result2=result1*result1;
				result3=image2_y-image1_y;
                result4=result3*result3;
                result=result2+result4;
				distance=sqrt(result);
			
               if(0<abs(image1_x-image2_x)<30)
				{
				  prx1[i1]=image1_x;
				  pry1[i1]=image1_y;
				  prx2[i1]=image2_x;
				  pry2[i1]=image2_y;
				  dis[i1]=distance;
				   
				 z=170*465;

				 x=abs(image1_x-image2_x);
				   dist[i3]=z/x;
				  i1++;
				   i3++;
			
				   m++;
				  
				feat1[i].fwd_match = nbrs[0];
			   }
				
			}
		}
		free( nbrs );
	};

  
          
    for(p=0,p3=0;p<m;p++,p3++)
	{
	   if(abs(dis[p]-dis[p+1])>22&dist[p3]<800)

		{    
		  pr1_x[i2]=prx1[p];
		  pr1_y[i2]=pry1[p];
		  pr2_x[i2]=prx2[p];
		  pr2_y[i2]=pry2[p];
		  TRACE(_T("物体:%3d   "),p1);
		  TRACE(_T("imag1坐标:%3d,%3d   "),prx1[p],pry1[p]);
		  TRACE(_T("imag2坐标:%3d,%3d   "),prx2[p],pry2[p]);	
		  TRACE(_T("距离:%5d\n"),dist[p3]);
		  p1++;
		  p2++;
cvRectangle(stacked,cvPoint(pr1_x[i2]-p1,pr1_y[i2]-p1),cvPoint(pr1_x[i2]+p1,pr1_y[i2]+p1),CV_RGB(255,0,0),1,8,0);    
cvRectangle(stacked,cvPoint(pr2_x[i2]-p1,pr2_y[i2]-p1),cvPoint(pr2_x[i2]+p1,pr2_y[i2]+p1),CV_RGB(255,0,0),1,8,0);
									
	   
i2++;
	   };
	};
			
  fprintf( stderr, "找到 %d 个符合要求点 \n", p2 );



	//---------存储匹配点的坐标到文件-----------------

	cvSave("upimg_matched_points.xml", up_seq, NULL, "matched_points_up", cvAttrList(NULL,NULL));
	cvSave("downimg_matched_points.xml", down_seq, NULL, "matched_points_down", cvAttrList(NULL,NULL));

	fprintf( stderr, "%d 个匹配的点的坐标已分别保存到文件:\n upimg_matched_points.xml和downimg_matched_points.xml\n", m );		

	

		cvNamedWindow( "img_feature", 1 );
		cvShowImage( "img_feature", stacked );

	//------释放内存存储器-----------
	cvReleaseMemStorage( &memstorage );
	cvReleaseImage( &stacked );
	cvReleaseImage( &img1 );
	cvReleaseImage( &img2 );
	kdtree_release( kd_root );
	free( feat1 );
	free( feat2 );
	return ;
}

⌨️ 快捷键说明

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