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

📄 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 <Windows.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);
}

Ctest2eyesDlg::~Ctest2eyesDlg()
{

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

void Ctest2eyesDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_SLIDER1, m_slider);
	DDX_Control(pDX, IDC_SLIDER2, m_slider_yuzhi);
	DDX_Control(pDX, IDC_SLIDER3, m_slider_min);
}

BEGIN_MESSAGE_MAP(Ctest2eyesDlg, CDialog)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDOK, &Ctest2eyesDlg::OnBnClickedOk)
	ON_BN_CLICKED(IDC_BUTTON1, &Ctest2eyesDlg::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &Ctest2eyesDlg::OnBnClickedButton2)
	ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER1, &Ctest2eyesDlg::OnNMReleasedcaptureSlider1)
	ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER2, &Ctest2eyesDlg::OnNMReleasedcaptureSlider2)
	ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER3, &Ctest2eyesDlg::OnNMReleasedcaptureSlider3)
END_MESSAGE_MAP()


// Ctest2eyesDlg 消息处理程序

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

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

	m_slider.SetRange(1,30,TRUE);
	m_slider.SetPos(3);
	m_slider_yuzhi.SetRange(1,1000,TRUE);
	m_slider_yuzhi.SetPos(50);
	m_slider_min.SetRange(1,800,TRUE);
	m_slider_min.SetPos(50);

	m_pos = 10;
	m_pos_yuzhi = 600;
	m_pos_yuzhi_min = 50;
	stacked = NULL;
	memset(m_ju,0,sizeof(struct des)*1000);
	memset(m_out_ju,0,sizeof(struct des)*1000);
	m_ju_k = 0;
	m_yu_zhi_enable =FALSE;

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

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

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()
{
	puman();
}
void Ctest2eyesDlg::puman()
{

	int l=0;
	if(l<5)
		l=4;

	

	char img1_file[] = "D:\\project\\pic\\001.jpg";
	char img2_file[] = "D:\\project\\pic\\002.jpg" ;



	double imgzoom_scale=1.0;			
	

	struct feature* feat;
	struct feature** nbrs;


	CvPoint pt1 ={0,0}, pt2={0,0};
	double d0, d1;
	int n1, n2, k, i;

	static int m = 0;

	

	img1 = cvLoadImage( img1_file, 1 );

	if( ! img1 )
	{
		//fatal_error( "unable to load image from %s", img1_file );
		CString strerr;
		strerr.Format(_T("unable to load image from img1"));
		AfxMessageBox(strerr);
	}

	img2 = cvLoadImage( img2_file, 1 );
	if( ! img2 )
	{
		CString strerr;
		strerr.Format(_T("unable to load image from img2"));
		AfxMessageBox(strerr);
	}

	stacked = stack_imgs( img1, img2 );


	
	n1 = sift_features( img1, &feat1 );

	n2 = sift_features( img2, &feat2 );


	kd_root = kdtree_build( feat2, n2 );

	m_ju_k = 0;
	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.x += img1->width;
				m_ju[m_ju_k].y = abs(pt1.y - pt2.y);

				m_ju[m_ju_k].lx = pt1.x;
				m_ju[m_ju_k].ly = pt1.y;
				m_ju[m_ju_k].rx = pt2.x;
				m_ju[m_ju_k].ry = pt2.y;
				m_ju[m_ju_k].x = abs(pt2.x - pt1.x - img1->width);
				m_ju[m_ju_k].s = m_ju[m_ju_k].x;
				int z;
				z=170*465;
				if (m_ju[m_ju_k].s!=0)
				{
					m_ju[m_ju_k].L_des = z/m_ju[m_ju_k].s;
				}
				m_ju_k++;				
			}
		}
		free( nbrs );

	};
	m_yu_zhi_enable =TRUE;


	Yu_Zhi();

	
	//------释放内存存储器-----------
	return ;
}
void Ctest2eyesDlg::Yu_Zhi()
{
	if (m_yu_zhi_enable == TRUE)
	{
		stacked = stack_imgs( img1, img2 );
		for (int dota = 0;dota < m_ju_k; dota++)
		{
			if ((m_ju[dota].L_des>m_pos_yuzhi_min) && (m_ju[dota].L_des<m_pos_yuzhi) && (m_ju[dota].y<5))

			{    
				
				TRACE(_T("imag1 cood:%3d,%3d\r\n"),m_ju[dota].lx,m_ju[dota].ly);
				TRACE(_T("imag2 cood:%3d,%3d\r\n"),m_ju[dota].rx,m_ju[dota].ry);	
				TRACE(_T("destence:%5d\r\n"),m_ju[dota].L_des);
				cvRectangle(stacked,cvPoint(m_ju[dota].lx - m_ju[dota].s/m_pos,m_ju[dota].ly - m_ju[dota].s/m_pos),cvPoint(m_ju[dota].lx + m_ju[dota].s/m_pos,m_ju[dota].ly + m_ju[dota].s/m_pos),CV_RGB(255,0,0),1,8,0);    
				cvRectangle(stacked,cvPoint(m_ju[dota].rx - m_ju[dota].s/m_pos,m_ju[dota].ry - m_ju[dota].s/m_pos),cvPoint(m_ju[dota].rx + m_ju[dota].s/m_pos,m_ju[dota].ry + m_ju[dota].s/m_pos),CV_RGB(255,0,0),1,8,0);
				dota++;
			};

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

	}

}



void Ctest2eyesDlg::OnBnClickedButton1()
{
	CString sPath1;
	CFileDialog dlgFileOpen(TRUE,NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("选择右眼图象(*.bmp)|*.bmp||"), NULL );
	if (dlgFileOpen.DoModal() == IDOK)
	{
		sPath1 = dlgFileOpen.GetPathName();
	}


}

void Ctest2eyesDlg::OnBnClickedButton2()
{	
	CString sPath2;
	CFileDialog dlgFileOpen(TRUE,NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("选择右眼图象(*.bmp)|*.bmp||"), NULL );
	if (dlgFileOpen.DoModal() == IDOK)
	{
		sPath2 = dlgFileOpen.GetPathName();
	}
}



void Ctest2eyesDlg::OnNMReleasedcaptureSlider1(NMHDR *pNMHDR, LRESULT *pResult)
{
	m_pos=m_slider.GetPos();
	Yu_Zhi();
	*pResult = 0;
}

void Ctest2eyesDlg::OnNMReleasedcaptureSlider2(NMHDR *pNMHDR, LRESULT *pResult)
{
	m_pos_yuzhi=m_slider_yuzhi.GetPos();
	Yu_Zhi();

	CString strText1;
	strText1.Format(_T("zuixiaojuli= %d , zuidajuli= %d"),m_pos_yuzhi_min,m_pos_yuzhi);
	SetDlgItemText(IDC_STATIC_DES,strText1);
	*pResult = 0;
}

void Ctest2eyesDlg::OnNMReleasedcaptureSlider3(NMHDR *pNMHDR, LRESULT *pResult)
{
	m_pos_yuzhi_min=m_slider_min.GetPos();
	Yu_Zhi();
	CString strText1;
	strText1.Format( _T("OnNMCustomdrawSlider3 get pos [%d]\r\n")  , m_pos_yuzhi_min);
	TRACE( strText1 );
	strText1.Format(_T("zuixiaojuli= %d , zuidajuli= %d"),m_pos_yuzhi_min,m_pos_yuzhi);
	SetDlgItemText(IDC_STATIC_DES,strText1);
	*pResult = 0;
}

⌨️ 快捷键说明

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