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