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

📄 aidialog.cpp

📁 超强手势识别程序
💻 CPP
字号:
// AIDialog.cpp: implementation of the CAIDialog class.
//类别:手势识别
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "AIDialog.h"
#include "AIGesture.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CAIDialog::CAIDialog(CWnd* pParent)
:CDialog(CAIDialog::IDD,pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
}

CAIDialog::~CAIDialog()
{

}
BEGIN_MESSAGE_MAP(CAIDialog,CDialog)
	ON_BN_CLICKED(IDB_GETIMG,OnGetImg)
	ON_BN_CLICKED(IDB_TRAIN,OnTrain)
	ON_BN_CLICKED(IDB_GESTURERECOGNISE,OnGestrueRecognise)
	ON_BN_CLICKED(IDB_COMMANDGESTURE,OnCommandGesture)
	ON_BN_CLICKED(IDB_LOCATION,OnLocation)
END_MESSAGE_MAP()
void CAIDialog::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}
BOOL CAIDialog::OnInitDialog()
{
	CDialog::OnInitDialog();

	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);

	return TRUE;
}
void CAIDialog::OnGetImg()
{
	CvCapture* capture=cvCaptureFromCAM(0);
	if(capture==NULL)
	{
		MessageBox(_T("摄像头初始化失败!"),_T("消息"));
		return;
	}
	IplImage* src=cvQueryFrame(capture);
	IplImage* dst=cvCreateImage(cvGetSize(src),8,1);
	int key=0;
	CAIGesture gesture;
	cvNamedWindow(_T("训练样本采集"));
	for(;;)
	{	
		src=cvQueryFrame(capture);
		gesture.SkinDetect(src,dst);
		cvFlip(dst);
		cvShowImage(_T("训练样本采集"),dst);
		key=cvWaitKey(10);
		if(key==13)
		{
			gesture.SaveImage(src);
		}
		if(key==27)
			break;
	}
	cvDestroyWindow(_T("训练样本采集"));
	cvReleaseCapture(&capture);
}
void CAIDialog::OnTrain()
{
	CWaitCursor wait;
	CAIGesture gesture;
	CTime t1 = CTime::GetCurrentTime();
	gesture.Train();
	wait.Restore( );
	CTime t2 = CTime::GetCurrentTime();
	CTimeSpan ts = t2 - t1;
	CString s = ts.Format( "训练成功,总共用时:  %M 分钟  %S 秒" );
	MessageBox(_T(s),_T("训练结果"));
}
void CAIDialog::OnGestrueRecognise()
{
	m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
	CvCapture* capture=cvCaptureFromCAM(0);
	if(capture==NULL)
	{
		MessageBox(_T("摄像头初始化失败!"),_T("消息"));
		return;
	}
	IplImage* src=cvQueryFrame(capture);
	int key=0;
	CAIGesture gesture;
	CString gesturename;
	//CvRect track_window=cvRect(src->width,src->height,20,20);
	CvRect track_window=cvRect(150,150,20,20);
	CvBox2D track_box;
	CString* result=new CString[8];
	CString out;
	int gesturecount=0;
	cvNamedWindow(_T("手势识别"),1);
	for(;;)
	{
		src=cvQueryFrame(capture);
		gesture.Follow(src,track_window,track_box);
		cvSetImageROI(src,
			cvRect(track_window.x-track_window.width/3,
			track_window.y-track_window.height/3,
			track_window.width+2*track_window.width/3,
			track_window.height+2*track_window.height/3));
		key=cvWaitKey(10);
		if(key==13)
			gesture.SaveImage(src);
		gesture.Recognise(src,gesturename);
		cvResetImageROI(src);
		if(gesturecount<7)
		{			
			if(gesturename.IsEmpty())
				gesturename=="NULL";
			result[gesturecount]=gesturename;
			gesturecount++;
		}
		if(gesturecount==7)
		{
			for(int i=0;i<7;i++)
			{
				result[i]=result[i+1];
			}
			result[7]=gesturename;			
		}
		if(gesturecount==7)
		{
			gesture.RecogniseResult(&result[0],out);
			if(out.IsEmpty())
			//	MessageBox(_T(out),_T("识别结果"));
			if(!out.IsEmpty())
				out.Empty();
			for(int i=0;i<8;i++)
			{
				result[i].Empty();
			}
			gesturecount=0;
			result=&result[0];
		}
		cvShowImage(_T("手势识别"),src);
		key=cvWaitKey(10);
		if(key==27)
			break;
	}
	cvDestroyWindow(_T("手势识别"));
	cvReleaseCapture(&capture);
	delete []result;
/*	IplImage* src=cvLoadImage("1.jpg",1);
	CAIGesture gesture;
	CString result;
	gesture.Recognise(src,result);
	cvNamedWindow("src",1);
	cvShowImage("src",src);
	cvWaitKey(0);*/
}
void CAIDialog::OnCommandGesture()
{
	CvCapture* capture=cvCaptureFromCAM(0);
	if(capture==NULL)
	{
		MessageBox(_T("摄像头初始化失败!"),_T("消息"));
		return;
	}
	IplImage* src=cvQueryFrame(capture);
	IplImage* dst=cvCreateImage(cvGetSize(src),8,1);
	CvRect track_window=cvRect(150,150,20,20);
	CvBox2D track_box;
	CvPoint* pt=new CvPoint[8];
	CvPoint pt_tmp;
	CvPoint2D32f center;//用来储存手势的质心
	float r=0;//手势的半径
	CvMemStorage* storage;
	storage = cvCreateMemStorage(0);
	CvSeq* pt_seq=cvCreateSeq(CV_SEQ_ELTYPE_POINT,sizeof(CvSeq),sizeof(CvPoint),storage);//一个CvSeq的序列,用来储存点,作为求中
	CString result;
	int ptcount=0;

	cvNamedWindow("命令手势",1);
	for(;;)
	{
		CAIGesture gesture;
		src=cvQueryFrame(capture);
		gesture.Follow(src,track_window,track_box);
		pt_tmp.x=(int)track_box.center.x;
		pt_tmp.y=(int)track_box.center.y;

		if(ptcount<7)
		{	
			pt[ptcount]=pt_tmp;
			ptcount++;
		}
		if(ptcount==7)
		{
			pt[7]=pt_tmp;
		}
		if(ptcount==7)
		{
			for(int i=0;i<8;i++)
			{
				cvSeqPush(pt_seq,&pt[i]);
			}
			cvMinEnclosingCircle(pt_seq,&center,&r);
			cvClearSeq(pt_seq);
			if(r>track_window.width||r>track_window.height)
			{
				gesture.RecogniseSeq(&pt[0],(float)track_window.width,(float)track_window.height,result);
				if(result.IsEmpty())
				{
					ptcount=0;
					continue;
				}
				if(!result.IsEmpty())
				{
					MessageBox(_T(result),_T("命令结果"));
					gesture.SaveForTrain(src,pt,result);
					result.Empty();
				}
				ptcount=0;
			}
			for(int i=0;i<7;i++)
			{
				pt[i]=pt[i+1];
			}
		}
		cvShowImage(_T("命令手势"),src);
		if(cvWaitKey(10)>0)
			break;
	}
	cvDestroyWindow(_T("命令手势"));
	cvReleaseCapture(&capture);
	cvReleaseImage(&dst);
	delete []pt;
}
void CAIDialog::OnLocation()
{
/*	CvCapture* capture=cvCaptureFromCAM(0);
	if(capture==NULL)
	{
		MessageBox(_T("摄像头初始化失败!"),_T("冰风2009"));
		return;
	}
	IplImage* src=cvQueryFrame(capture);
	int key=0;
	CAIGesture gesture;
	CRect rect;
	IplImage* src_tmp[8];
	cvNamedWindow(_T("手势识别"),1);
	int gesturecount=0;
	for(;;)
	{
		src=cvQueryFrame(capture);
		if(gesturecount<9)
		{
			cvCopy(src,src_tmp[gesturecount]);
			gesturecount++;
		}
		if(gesturecount==8)
		{
			for(int i=0;i<8;i++)
			{
				src_tmp[i]=src_tmp[i+1];
			}
			cvCopy(src,src_tmp[gesturecount]);
		}
		gesture.Location(&src_tmp[0],rect);
		cvRectangle(src,cvPoint(rect.TopLeft().x,rect.TopLeft().y),cvPoint(rect.BottomRight().x,rect.BottomRight().y),CV_RGB(255,255,0));
		cvShowImage(_T("手势识别"),src);
		key=cvWaitKey(10);
		if(key==27)
			break;
	}
	cvDestroyWindow(_T("手势识别"));
	cvReleaseCapture(&capture);	*/
	IplImage* src[8];
	src[0]=cvLoadImage("1.jpg",1);
	src[1]=cvLoadImage("2.jpg",1);
	src[2]=cvLoadImage("3.jpg",1);
	src[3]=cvLoadImage("4.jpg",1);
	src[4]=cvLoadImage("5.jpg",1);
	src[5]=cvLoadImage("6.jpg",1);
	src[6]=cvLoadImage("7.jpg",1);
	src[7]=cvLoadImage("8.jpg",1);
/*	for(int i=0;i<8;i++)
	{
		src[i]=cvLoadImage("1.jpg",1);
	}*/
	CAIGesture gesture;
	CRect rect;
	gesture.Location(&src[0],rect);
	cvRectangle(src[7],cvPoint(rect.TopLeft().x,rect.TopLeft().y),cvPoint(rect.BottomRight().x,rect.BottomRight().y),CV_RGB(255,255,0));
	cvNamedWindow("1",1);
	cvShowImage("1",src[7]);
	cvWaitKey(0);
}

⌨️ 快捷键说明

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