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