?? aidialog.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,¢er,&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 + -