+++ /dev/null
-/*M///////////////////////////////////////////////////////////////////////////////////////\r
-//\r
-// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.\r
-//\r
-// By downloading, copying, installing or using the software you agree to this license.\r
-// If you do not agree to this license, do not download, install,\r
-// copy or use the software.\r
-//\r
-//\r
-// Intel License Agreement\r
-// For Open Source Computer Vision Library\r
-//\r
-// Copyright (C) 2000, Intel Corporation, all rights reserved.\r
-// Third party copyrights are property of their respective owners.\r
-//\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistribution's of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-//\r
-// * Redistribution's in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-//\r
-// * The name of Intel Corporation may not be used to endorse or promote products\r
-// derived from this software without specific prior written permission.\r
-//\r
-// This software is provided by the copyright holders and contributors "as is" and\r
-// any express or implied warranties, including, but not limited to, the implied\r
-// warranties of merchantability and fitness for a particular purpose are disclaimed.\r
-// In no event shall the Intel Corporation or contributors be liable for any direct,\r
-// indirect, incidental, special, exemplary, or consequential damages\r
-// (including, but not limited to, procurement of substitute goods or services;\r
-// loss of use, data, or profits; or business interruption) however caused\r
-// and on any theory of liability, whether in contract, strict liability,\r
-// or tort (including negligence or otherwise) arising in any way out of\r
-// the use of this software, even if advised of the possibility of such damage.\r
-//\r
-//M*/// StereoGR.cpp : Defines the class behaviors for the application.\r
-//\r
-\r
-#include "stdafx.h"\r
-#include "StereoGR.h"\r
-\r
-#include "MainFrm.h"\r
-#include "ChildFrm.h"\r
-#include "StereoGRDoc.h"\r
-#include "StereoGRView.h"\r
-#include "PTOffline.h"\r
-#include "PTOptions.h"\r
-#include "HMMParams.h" \r
-#include "float.h"\r
-#include "direct.h"\r
-#include <io.h>\r
-\r
-#include <digiclops.h>\r
-#include <triclops.h>\r
-#include "PGControl.h"\r
-\r
-\r
-#ifdef _DEBUG\r
-#define new DEBUG_NEW\r
-#undef THIS_FILE\r
-static char THIS_FILE[] = __FILE__;\r
-#endif\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-// CStereoGRApp\r
-\r
-BEGIN_MESSAGE_MAP(CStereoGRApp, CWinApp)\r
- //{{AFX_MSG_MAP(CStereoGRApp)\r
- ON_COMMAND(ID_APP_ABOUT, OnAppAbout)\r
- ON_COMMAND(ID_FILE_NEW, OnFileNew)\r
- ON_UPDATE_COMMAND_UI(ID_FILE_NEW, OnUpdateFileNew)\r
- ON_COMMAND(ID_PT_PROP, OnPtProp)\r
- ON_COMMAND(ID_PT_WHITEBALANCE, OnPtWhitebalance)\r
- ON_COMMAND(ID_PTOFFLINE, OnPtoffline)\r
- ON_COMMAND(ID_CAPTURE_BACK, OnCaptureBack)\r
- ON_COMMAND(ID_RUNGESTREC, OnRungestrec)\r
- ON_COMMAND(ID_SETTINGS, OnSettings)\r
- ON_COMMAND(ID_TRAIN, OnTrain)\r
- ON_COMMAND(ID_SAVE_DGPARAMS, OnSaveDynamicGestures)\r
- ON_COMMAND(ID_LOAD_DGPARAMS, OnLoadDynamicGestures)\r
- ON_COMMAND(ID_SAVE_BASE, OnSaveBase)\r
- ON_COMMAND(ID_LOAD_BASE, OnLoadBase)\r
- ON_COMMAND(ID_RECOG_FILE_DG, OnRecogFileDg)\r
- ON_COMMAND(ID_DELETE_HMM, OnDeleteHmm)\r
- ON_COMMAND(ID_REMOVE_ALL_DG, OnRemoveAllDg)\r
- ON_UPDATE_COMMAND_UI(ID_RUNGESTREC, OnUpdateRungestrec)\r
- //}}AFX_MSG_MAP\r
- // Standard file based document commands\r
- ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)\r
- ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)\r
- // Standard print setup command\r
- ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)\r
-END_MESSAGE_MAP()\r
-\r
-IPLStatus __stdcall _iplErrorHandler(IPLStatus status, const char* func, const char* context, \r
- const char* file, int line);\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-// CStereoGRApp construction\r
-\r
-CStereoGRApp::CStereoGRApp()\r
-{\r
- InitModulePath();\r
- memset(m_viewIds, 0, sizeof(m_viewIds));\r
- memset(m_views, 0, sizeof(m_viewIds));\r
-\r
- // Initialize IPL\r
- iplRedirectError(_iplErrorHandler);\r
-\r
- \r
- m_findHand.m_dynamicGesture = 0;//m_dgProp->IsSaveToFile();\r
- m_findHand.m_path = m_modulePath;\r
- m_findHand.m_dGestureName = "";//m_dgProp->GetGestureName();\r
-\r
- m_ptOptions = 0;\r
- m_grOptions = 0;\r
- m_hmmParams = 0;\r
- m_dgStat = 0;\r
-\r
- m_doRecog = FALSE;\r
-\r
- POINT p = {-1, -1};\r
- for(int i = 0; i < VIEWS_COUNT; i++)\r
- {\r
- m_TopLefts.push_back(p);\r
- m_TopLefts3D.push_back(p);\r
- }\r
-\r
- m_isClosingView = FALSE; \r
-}\r
-\r
-CStereoGRApp::~CStereoGRApp()\r
-{\r
- delete m_ptOptions;\r
- delete m_grOptions;\r
- delete m_hmmParams;\r
- delete m_dgStat;\r
- delete m_dgProp;\r
-}\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-// The one and only CStereoGRApp object\r
-\r
-CStereoGRApp theApp;\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-// CStereoGRApp initialization\r
-\r
-BOOL CStereoGRApp::InitInstance()\r
-{\r
- AfxEnableControlContainer();\r
-\r
- // Standard initialization\r
- // If you are not using these features and wish to reduce the size\r
- // of your final executable, you should remove from the following\r
- // the specific initialization routines you do not need.\r
-\r
-#ifdef _AFXDLL\r
- Enable3dControls(); // Call this when using MFC in a shared DLL\r
-#else\r
- Enable3dControlsStatic(); // Call this when linking to MFC statically\r
-#endif\r
-\r
- // Change the registry key under which our settings are stored.\r
- // TODO: You should modify this string to be something appropriate\r
- // such as the name of your company or organization.\r
- SetRegistryKey(_T("Local AppWizard-Generated Applications"));\r
-\r
- LoadStdProfileSettings(); // Load standard INI file options (including MRU)\r
-\r
- // Register the application's document templates. Document templates\r
- // serve as the connection between documents, frame windows and views.\r
-\r
- CMultiDocTemplate* pDocTemplate;\r
- pDocTemplate = new CMultiDocTemplate(\r
- IDR_STEREOTYPE,\r
- RUNTIME_CLASS(CStereoGRDoc),\r
- RUNTIME_CLASS(CChildFrame), // custom MDI child frame\r
- RUNTIME_CLASS(CStereoGRView));\r
- AddDocTemplate(pDocTemplate);\r
-\r
- // create main MDI Frame window\r
- CMainFrame* pMainFrame = new CMainFrame;\r
- if (!pMainFrame->LoadFrame(IDR_MAINFRAME))\r
- return FALSE;\r
- m_pMainWnd = pMainFrame;\r
-\r
- // The main window has been initialized, so show and update it.\r
- pMainFrame->ShowWindow(m_nCmdShow);\r
- pMainFrame->UpdateWindow();\r
-\r
- CStatusBar* bar = pMainFrame->GetStatusBar();\r
- bar->SetPaneText(0, "Initializing the camera...");\r
- // Initialize the camera\r
- CString config;\r
- while(1)\r
- {\r
- config = GetProfileString("Settings\\PTGrey", "Config");\r
- _finddata_t filedata;\r
- if(config.IsEmpty() || _findfirst(LPCTSTR(config), &filedata) == -1)\r
- {\r
- CFileDialog dlg(TRUE, "", "config");\r
- AfxMessageBox("For the first run please enter the name of \nthe configuration file of your PointGrey camera.");\r
- if(dlg.DoModal() != IDOK)\r
- {\r
- AfxMessageBox("The configuration file is required for stereo processing.\nPlease contact your camera supplier to obtain the file for your camera.");\r
- return FALSE;\r
- }\r
-\r
- WriteProfileString("Settings\\PTGrey", "Config", LPCTSTR(dlg.GetPathName()));\r
- }\r
- else\r
- {\r
- break;\r
- }\r
- }\r
- PTGreySetConfigFileName(LPCTSTR(config));\r
- \r
- int rawres = 0, stereores = 0;\r
- rawres = GetProfileInt("Settings\\PTGrey", "Raw resolution", rawres);\r
- PTGreySetProperty("RawResolution", &rawres);\r
- stereores = GetProfileInt("Settings\\PTGrey", "Stereo resolution", stereores);\r
- PTGreySetProperty("StereoResolution", &stereores);\r
- BOOL ret = PTGreyInitCamera();\r
- if(!ret)\r
- {\r
- AfxMessageBox(PTGreyGetErrorMessage());\r
- return FALSE;\r
- }\r
- else\r
- {\r
- // Load camera and application settings\r
- LoadSettings();\r
- }\r
-\r
- // Automatically capture background\r
- OnCaptureBack();\r
-\r
- //set hmm parameters \r
- m_dgServer.SetHMMParams( m_hmmParams->m_num_states, m_hmmParams->m_num_mix );\r
-\r
- // Assign an affinity mask to the current thread\r
- int e = SetThreadAffinityMask(GetCurrentThread(), 1);\r
-\r
- bar->SetPaneText(0, "Ready");\r
- return TRUE;\r
-}\r
-\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-// CAboutDlg dialog used for App About\r
-\r
-class CAboutDlg : public CDialog\r
-{\r
-public:\r
- CAboutDlg();\r
-\r
-// Dialog Data\r
- //{{AFX_DATA(CAboutDlg)\r
- enum { IDD = IDD_ABOUTBOX };\r
- //}}AFX_DATA\r
-\r
- // ClassWizard generated virtual function overrides\r
- //{{AFX_VIRTUAL(CAboutDlg)\r
- protected:\r
- virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support\r
- //}}AFX_VIRTUAL\r
-\r
-// Implementation\r
-protected:\r
- //{{AFX_MSG(CAboutDlg)\r
- // No message handlers\r
- //}}AFX_MSG\r
- DECLARE_MESSAGE_MAP()\r
-};\r
-\r
-CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)\r
-{\r
- //{{AFX_DATA_INIT(CAboutDlg)\r
- //}}AFX_DATA_INIT\r
-}\r
-\r
-void CAboutDlg::DoDataExchange(CDataExchange* pDX)\r
-{\r
- CDialog::DoDataExchange(pDX);\r
- //{{AFX_DATA_MAP(CAboutDlg)\r
- //}}AFX_DATA_MAP\r
-}\r
-\r
-BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)\r
- //{{AFX_MSG_MAP(CAboutDlg)\r
- // No message handlers\r
- //}}AFX_MSG_MAP\r
-END_MESSAGE_MAP()\r
-\r
-// App command to run the dialog\r
-void CStereoGRApp::OnAppAbout()\r
-{\r
- CAboutDlg aboutDlg;\r
- aboutDlg.DoModal();\r
-}\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-// CStereoGRApp message handlers\r
-\r
-\r
-int CStereoGRApp::GetDocType()\r
-{\r
- return m_docType;\r
-}\r
-\r
-void CStereoGRApp::OnFileNew() \r
-{\r
- if(m_docType >= VIEWS_COUNT)\r
- return;\r
- \r
- CWinApp::OnFileNew();\r
- m_docType++;\r
-}\r
-\r
-void CStereoGRApp::OnUpdateFileNew(CCmdUI* pCmdUI) \r
-{\r
- pCmdUI->Enable(m_docType < PG_IMAGE_MAX); \r
-}\r
-\r
-void CStereoGRApp::SetDocType(int docType)\r
-{\r
- m_docType = docType;\r
-}\r
-\r
-void CStereoGRApp::OnPtProp() \r
-{\r
- PTGreyShowPropertyPage();\r
-}\r
-\r
-void CStereoGRApp::OnPtWhitebalance() \r
-{\r
- PTGreyShowWhiteBalance();\r
-}\r
-\r
-void CStereoGRApp::OnPtoffline() \r
-{\r
- CStatusBar* bar = ((CMainFrame*)AfxGetMainWnd())->GetStatusBar();\r
- CPTOffline dlg;\r
- dlg.m_strSaveFile = m_modulePath;\r
- dlg.SetFramesCount(30);\r
- if(dlg.DoModal() == IDOK)\r
- {\r
- int framesCount = dlg.GetFrameCount();\r
- // Start collecting frames...\r
- PTGreySetTriclopsInputBuffer(framesCount);\r
- while(1)\r
- {\r
- int count = PTGreyGetFrameNumber();\r
- if(count < 0)\r
- // Finished collecting frames\r
- break;\r
-\r
- CString str;\r
- str.Format("Collected frame %d of %d...", count, framesCount);\r
- bar->SetPaneText(0, str);\r
- Sleep(10);\r
- }\r
- TriclopsInput* buffer = (TriclopsInput*)PTGreyGetTriclopsBuffer();\r
-\r
- // Process the frames...\r
- PTGreyFreezeData(INFINITE);\r
- bar->SetPaneText(0, "Processing the frames...");\r
- PTGreyProcessFrames(PTGreyGetTriclopsBuffer(), framesCount, dlg.m_strSaveFile);\r
- bar->SetPaneText(0, "Ready");\r
- PTGreyUnFreezeData();\r
-\r
- // Freeing the memory...\r
- PTGreySetTriclopsInputBuffer(0);\r
- }\r
-}\r
-\r
-void CStereoGRApp::InitModulePath()\r
-{\r
- char buffer[_MAX_PATH];\r
- char drive[_MAX_DRIVE];\r
- char path[_MAX_PATH];\r
- GetModuleFileName(0, buffer, _MAX_PATH);\r
-\r
- _splitpath(buffer, drive, path, 0, 0);\r
- m_modulePath = CString(drive) + path;\r
-}\r
-\r
-\r
-void CStereoGRApp::OnCaptureBack() \r
-{\r
- PTGreySelectDataType(PT_BACKGROUND_IMAGE, 1); \r
-}\r
-\r
-void CStereoGRApp::Process()\r
-{\r
- ASSERT(iplGetErrStatus() >= 0);\r
- ValidateData();\r
- // Lock the data\r
- PTGreyFreezeData(INFINITE);\r
-\r
- if(!m_viewIds[PT_POINTCLOUD_IMAGE])\r
- {\r
- PTGreyUnFreezeData();\r
- return; // Do not run the algorithm\r
- }\r
- \r
- // Set FindHand object properties\r
- m_findHand.m_dGestureName = m_dgProp->GetGestureName();\r
- m_findHand.m_dynamicGesture = m_dgProp->IsCollectGesture();\r
- m_findHand.SetPointBuffer((CvPoint3D32f*)PTGreyGetDataPointer(PT_POINTCLOUD_IMAGE));\r
- m_findHand.m_pointCount = PTGreyGetPointCount();\r
- TRACE("\n%d", m_findHand.m_pointCount);\r
- m_findHand.m_inputImage = GetImage(PT_RIGHT_RAW_IMAGE);\r
- iplDeallocate(m_findHand.m_disparityImage, IPL_IMAGE_ALL);\r
- m_findHand.m_disparityImage = iplCloneImage(GetView(PT_DISPARITY_OBJ_IMAGE)->GetRecipient());\r
- iplCopy(GetView(PT_DISPARITY_IMAGE)->GetRecipient(), m_findHand.m_disparityImage);\r
-\r
- if(m_findHand.m_outputImage)\r
- {\r
- m_findHand.m_outputImage->roi = 0;\r
- cvReleaseImage(&m_findHand.m_outputImage); // Release and null it.\r
- }\r
- BOOL ret = m_findHand.FitLine();\r
- ASSERT(iplGetErrStatus() >= 0);\r
- if(ret)\r
- {\r
- //if all ok with finding hand increase hand sequence size\r
- if(m_findHand.m_dynamicGesture) m_findHand.m_dgFrameFound = TRUE; \r
- m_findHand.StoreDynGesture(0, PTGreyGetTime());\r
-// m_findHand.FindHand(FALSE);\r
- } \r
- // Use output image as a mask to the right raw image\r
- IplImage* image = m_findHand.m_outputImage;\r
- CMainFrame* frame = (CMainFrame*)AfxGetMainWnd();\r
- frame->GetStatusBar()->SetPaneText(1, "");\r
- IplImage* srcImage = GetImage(PT_RIGHT_RAW_IMAGE);\r
- int width = PTGreyGetWidth(PT_RIGHT_RAW_IMAGE);\r
- int height = PTGreyGetHeight(PT_RIGHT_RAW_IMAGE);\r
- int swidth = PTGreyGetWidth(PT_DISPARITY_IMAGE);\r
- int sheight = PTGreyGetHeight(PT_DISPARITY_IMAGE);\r
- int maxdisp;\r
- PTGreyGetProperty("MaxDisparity", &maxdisp);\r
-\r
- CvPoint valid_size = cvPoint(width*(swidth - maxdisp/2)/swidth,\r
- height*(sheight - maxdisp/2)/sheight);\r
-\r
-// Segment();\r
- if(!ret/*!image*/)\r
- {\r
- ValidateData(FALSE);\r
- cvRectangle(srcImage, cvPoint(0, 0), valid_size, CV_RGB(255, 0, 0), 1);\r
- }\r
- else\r
- {\r
- ValidateData(FALSE);\r
- cvRectangle(srcImage, cvPoint(0, 0), valid_size, CV_RGB(0, 255, 0), 1);\r
-/* iplThreshold(image, image, 1);\r
- if(srcImage)\r
- {\r
- srcImage->roi = iplCreateROI(0, 0, 0, image->width, image->height);\r
- image->roi = iplCreateROI(1, 0, 0, image->width, image->height);\r
- \r
- for(int i = 0; i < 3; i++)\r
- {\r
- srcImage->roi->coi = i + 1;\r
- iplAnd(srcImage, image, srcImage);\r
- }\r
- iplDeleteROI(srcImage->roi);\r
- iplDeleteROI(image->roi);\r
- }\r
- CString str;\r
- str.Format("%d", m_findHand.m_DefectsDepth.size());\r
-\r
- if(m_findHand.m_convexDefCount !=0 )\r
- {\r
- CString def;\r
- for (int i=0;i<m_findHand.m_DefectsDepth.size();i++)\r
- {\r
- def.Format(" %4.1f", m_findHand.m_DefectsDepth[i]);\r
- str+=def;\r
- }\r
-\r
- }\r
- frame->GetStatusBar()->SetPaneText(1, LPCTSTR(str));*/\r
- }\r
-\r
- //********************Dynamic gestures section*********************** /\r
- \r
- //ask findHandCtl if it has collected gesture\r
- if ( m_findHand.IsGestureFixed() && m_findHand.m_dynamicGesture )\r
- {\r
- CDynGesture local_gesture(m_hmmParams->m_num_states, m_hmmParams->m_num_mix);\r
- CDynGesture* gesture = NULL;\r
-\r
- if (!m_doRecog) //collecting gestures\r
- {\r
- //training stage \r
- gesture = m_dgServer.FindGesture( m_findHand.m_dGestureName.c_str() );\r
- \r
- if ( !gesture ) //add new gesture to server\r
- {\r
- gesture = m_dgServer.AddGesture( m_findHand.m_dGestureName.c_str() );\r
- }\r
- }\r
- else\r
- {\r
- gesture = &local_gesture;\r
- }\r
-\r
- //add collected params to gesture\r
- gesture->AddParams( m_findHand.m_geomParams );\r
-\r
- if (m_doRecog) //recognizing gestures\r
- { \r
- float likelihood[10] = { -FLT_MAX,-FLT_MAX,-FLT_MAX,-FLT_MAX,-FLT_MAX,\r
- -FLT_MAX,-FLT_MAX,-FLT_MAX,-FLT_MAX,-FLT_MAX };\r
- \r
- //convert params to observations form\r
- gesture->ExtractObservations(); \r
- \r
- //recognize\r
- int recognized_gesture = m_dgServer.RecognizeDynGesture( gesture, likelihood );\r
- if(recognized_gesture >= 0)\r
- {\r
- CString gesture_name = m_dgServer.GetGesture( recognized_gesture )->GetName();\r
- CStereoGRView* pView = GetView(GR_MAGICCUBE);\r
- \r
- if(gesture_name.CompareNoCase("rotate_left") == 0)\r
- {\r
- pView->RotateAzim(-1);\r
- }\r
- else if(gesture_name.CompareNoCase("rotate_right") == 0)\r
- {\r
- pView->RotateAzim(+1);\r
- }\r
- else if(gesture_name.CompareNoCase("rotate_counterclockwise") == 0)\r
- {\r
- pView->RotateIncl(-1);\r
- }\r
- else if(gesture_name.CompareNoCase("rotate_clockwise") == 0)\r
- {\r
- pView->RotateIncl(+1);\r
- }\r
- else if(gesture_name.CompareNoCase("zoom_in") == 0)\r
- {\r
- pView->Translate(-0.1f);\r
- }\r
- else if(gesture_name.CompareNoCase("zoom_out") == 0)\r
- {\r
- pView->Translate(+0.1f);\r
- }\r
- else if(gesture_name.CompareNoCase("close") == 0)\r
- {\r
- CloseView(GR_MAGICCUBE);\r
- }\r
- else if(gesture_name.CompareNoCase("reset") == 0)\r
- {\r
- pView->InitModel();\r
- }\r
- \r
-\r
- //ASSERT( likelihood[0] <= 0 );\r
- \r
- //write result to status bar\r
- CMainFrame* frame = (CMainFrame*)AfxGetMainWnd();\r
- frame->GetStatusBar()->SetPaneText(2, "");\r
- CString RecogResult;\r
- RecogResult.Format("Recognized %s, likelihood %f",\r
- m_dgServer.GetGesture( recognized_gesture )->GetName(), likelihood[0] ); \r
- frame->GetStatusBar()->SetPaneText(2, RecogResult); \r
- }\r
- }\r
- \r
- m_findHand.ReleaseFixedGesture();\r
- }\r
- /*****************************************************************/\r
-\r
-\r
- ASSERT(iplGetErrStatus() >= 0);\r
- if(::IsWindow(m_gestRec.m_hWnd))\r
- {\r
- m_gestRec.UpdateStatus();\r
- }\r
- ASSERT(iplGetErrStatus() >= 0);\r
-\r
- PTGreyUnFreezeData(); \r
-}\r
-\r
-void CStereoGRApp::OpenView(int dataType)\r
-{\r
- // Check if the view alredy exists...\r
- if(m_views[dataType])\r
- return;\r
-\r
- SetDocType(dataType);\r
- OnFileNew();\r
- switch(dataType)\r
- {\r
- case PT_DISPARITY_OBJ_IMAGE:\r
- OpenView(PT_RIGHT_RAW_IMAGE);\r
- OpenView(PT_DISPARITY_IMAGE);\r
- break;\r
-\r
- case PT_POINTCLOUD_IMAGE:\r
- OpenView(PT_DISPARITY_OBJ_IMAGE);\r
- break;\r
-\r
- case GR_MAGICCUBE:\r
- OpenView(PT_POINTCLOUD_IMAGE);\r
- OpenView(PT_LEFT_RAW_IMAGE);\r
- OpenView(PT_TOP_RAW_IMAGE);\r
- break;\r
- }\r
-}\r
-\r
-void CStereoGRApp::SetView(int dataType, CStereoGRView *pView)\r
-{\r
- m_views[dataType] = pView;\r
- m_viewIds[dataType] = 1;\r
-}\r
-\r
-void CStereoGRApp::CloseView(int dataType)\r
-{\r
- PTGreyFreezeData(INFINITE);\r
- m_isClosingView++;\r
- switch(dataType)\r
- {\r
- case PT_POINTCLOUD_IMAGE:\r
- case PT_LEFT_RAW_IMAGE:\r
- case PT_TOP_RAW_IMAGE:\r
- CloseView(GR_MAGICCUBE);\r
- break;\r
-\r
- case PT_DISPARITY_OBJ_IMAGE:\r
- CloseView(PT_POINTCLOUD_IMAGE);\r
- break;\r
-\r
- case PT_RIGHT_RAW_IMAGE:\r
- case PT_DISPARITY_IMAGE:\r
- CloseView(PT_DISPARITY_OBJ_IMAGE);\r
- break;\r
- }\r
-\r
- ASSERT(dataType >= 0 && dataType < VIEWS_COUNT);\r
- if(m_views[dataType])\r
- {\r
- m_views[dataType]->GetParent()->DestroyWindow();\r
- m_viewIds[dataType] = 0;\r
- }\r
- m_isClosingView--;\r
- PTGreyUnFreezeData();\r
-}\r
-\r
-IPLStatus __stdcall _iplErrorHandler(IPLStatus status, const char* func, const char* context, \r
- const char* file, int line)\r
-{\r
- if(status != -10)\r
- ASSERT(0);\r
- return IPL_StsOk;\r
-}\r
-\r
-void CStereoGRApp::Update()\r
-{\r
- if(!PTGreyFreezeData(INFINITE))\r
- return;\r
-\r
- int e = iplGetErrStatus();\r
- ASSERT(e >= 0);\r
- // Retrieve the data\r
- for(int i = 0; i < VIEWS_COUNT; i++)\r
- {\r
- CStereoGRView* pView = GetView(i);\r
- if(pView)\r
- pView->UpdateData();\r
- }\r
- // Run algorithms on the data\r
- Process();\r
- PTGreyUnFreezeData();\r
-\r
- // Render the results\r
- for(i = 0; i < VIEWS_COUNT; i++)\r
- {\r
- CStereoGRView* pView = GetView(i);\r
- if(pView)\r
- pView->UpdateView();\r
- }\r
- ASSERT(iplGetErrStatus() >= 0);\r
-}\r
-\r
-IplImage* CStereoGRApp::GetImage(int dataType)\r
-{\r
- if(!m_views[dataType])\r
- return 0;\r
-\r
- return m_views[dataType]->GetImage();\r
-}\r
-\r
-/*void CStereoGRApp::SetImage(int dataType, IplImage *image, BOOL copy)\r
-{\r
- if(!m_views[dataType])\r
- return;\r
-\r
- m_views[dataType]->SetImage(image, copy);\r
-}*/\r
-\r
-void CStereoGRApp::OnRungestrec() \r
-{\r
- m_gestRec.DoModal(); \r
-}\r
-\r
-void CStereoGRApp::ValidateData(BOOL flag)\r
-{\r
- m_isNewData = flag;\r
-}\r
-\r
-BOOL CStereoGRApp::IsNewData()\r
-{\r
- return m_isNewData;\r
-}\r
-\r
-\r
-void CStereoGRApp::OnTrain() \r
-{ \r
- m_dgServer.TrainAllGestures();\r
-}\r
-\r
-\r
-void CStereoGRApp::OnSettings()\r
-{\r
- CPropertySheet sheet;\r
- sheet.AddPage(m_ptOptions);\r
- sheet.AddPage(m_grOptions);\r
- sheet.AddPage(m_hmmParams);\r
- sheet.AddPage(m_dgProp);\r
- sheet.AddPage(m_dgStat);\r
-\r
- // Load PointGrey options\r
- int rawres, stereores;\r
- PTGreyGetProperty("StereoResolution", &stereores);\r
- m_ptOptions->m_stereoRes = stereores;\r
- PTGreyGetProperty("RawResolution", &rawres);\r
- m_ptOptions->m_rawRes = rawres;\r
- PTGreyGetProperty("MinDisparity", &m_ptOptions->m_minDisp);\r
- PTGreyGetProperty("MaxDisparity", &m_ptOptions->m_maxDisp);\r
- PTGreyGetProperty("DisparityThreshold", &m_ptOptions->m_dispThresh);\r
- PTGreyGetProperty("DifferenceThreshold", &m_ptOptions->m_diffThresh);\r
- PTGreyGetProperty("DepthThreshold", &m_ptOptions->m_depthThresh);\r
- PTGreyGetProperty("ContourProcessing", &m_ptOptions->m_checkContours);\r
-\r
- // Load StereoGR options\r
- m_grOptions->m_maskImprove = m_findHand.m_maskImprovigFlag;\r
- m_grOptions->m_frameCount = m_findHand.m_trainFrameCount;\r
- m_grOptions->m_segThresh = m_findHand.m_segThresh;\r
-\r
- if(sheet.DoModal() == IDOK)\r
- {\r
- // Save PointGrey options\r
- PTGreyFreezeData(INFINITE);\r
- if(rawres != m_ptOptions->m_rawRes || stereores != m_ptOptions->m_stereoRes)\r
- {\r
- // The resolution has changed...\r
- WriteProfileInt("Settings\\PTGrey", "Raw resolution", m_ptOptions->m_rawRes);\r
- WriteProfileInt("Settings\\PTGrey", "Stereo resolution", m_ptOptions->m_stereoRes);\r
- AfxMessageBox("The resolution change will not take effect until application restart.");\r
- }\r
- PTGreySetProperty("MinDisparity", &m_ptOptions->m_minDisp);\r
- PTGreySetProperty("MaxDisparity", &m_ptOptions->m_maxDisp);\r
- PTGreySetProperty("DisparityThreshold", &m_ptOptions->m_dispThresh);\r
- PTGreySetProperty("DifferenceThreshold", &m_ptOptions->m_diffThresh);\r
- PTGreySetProperty("DepthThreshold", &m_ptOptions->m_depthThresh);\r
- PTGreySetProperty("ContourProcessing", &m_ptOptions->m_checkContours);\r
- PTGreyUnFreezeData();\r
-\r
- // Save StereoGR options\r
- m_findHand.m_maskImprovigFlag = m_grOptions->m_maskImprove;\r
- m_findHand.m_trainFrameCount = m_grOptions->m_frameCount;\r
- m_findHand.m_segThresh = m_grOptions->m_segThresh;\r
-\r
- //change HMM parameters of gestures\r
- \r
- m_dgServer.SetHMMParams( m_hmmParams->m_num_states, m_hmmParams->m_num_mix );\r
- \r
- m_findHand.m_dGestureName = m_dgProp->GetGestureName();\r
- m_findHand.m_dynamicGesture = m_dgProp->IsCollectGesture();\r
- m_findHand.m_saveDynGest = m_dgProp->IsSaveToFile();\r
- m_findHand.m_path = m_dgProp->GetSavePath();\r
- }\r
-}\r
-\r
-\r
-void CStereoGRApp::OnSaveDynamicGestures() \r
-{\r
- int numgest = m_dgServer.GetNumGestures();\r
- for( int i = 0; i < numgest; i++ )\r
- {\r
- CDynGesture* gesture = m_dgServer.GetGesture( i );\r
- CString path = gesture->GetName();\r
- gesture->SaveParams( path );\r
- }\r
- // TODO: Add your command handler code here\r
-}\r
-\r
-CStereoGRApp::LoadSettings()\r
-{\r
- // Create property pages \r
- CreatePropertyPages();\r
- // Load the PTGrey settings\r
- char * _settings[] = {\r
- "CameraBrightness",\r
- "CameraIris",\r
- "CameraExposure",\r
- "MinDisparity",\r
- "MaxDisparity",\r
- "DisparityThreshold",\r
- "DifferenceThreshold",\r
- "DepthThreshold"\r
- };\r
-\r
- for(int i = 0; i < sizeof(_settings)/sizeof(char*); i++)\r
- {\r
- int value;\r
- PTGreyGetProperty(_settings[i], &value);\r
- value = GetProfileInt("Settings\\PTGrey", _settings[i], value);\r
- PTGreySetProperty(_settings[i], &value);\r
- }\r
-\r
- // Load the StereoGR settings\r
- m_findHand.m_segThresh = GetProfileInt("Settings\\PTGrey", "Segmentation threshold", m_findHand.m_segThresh);\r
- m_findHand.m_trainFrameCount = GetProfileInt("Settings\\PTGrey", "Train framecount", \r
- m_findHand.m_trainFrameCount);\r
- m_findHand.m_maskImprovigFlag = GetProfileInt("Settings\\PTGrey", "Improve mask", \r
- m_findHand.m_maskImprovigFlag);\r
-\r
- // Load HMM settings\r
- m_hmmParams->m_num_states = GetProfileInt("Settings\\HMM", "Number of states", 5);\r
- m_hmmParams->m_num_mix = GetProfileInt("Settings\\HMM", "Number of mixtures", 3);\r
-\r
- // Load StereoGR parameters\r
-\r
- RECT mainView;\r
- mainView.left = GetProfileInt("Settings\\StereoGR", "left", 0);\r
- mainView.top = GetProfileInt("Settings\\StereoGR", "top", 0);\r
- mainView.right = mainView.left + GetProfileInt("Settings\\StereoGR", "width", 800);\r
- mainView.bottom = mainView.top + GetProfileInt("Settings\\StereoGR", "height", 600);\r
- AfxGetMainWnd()->MoveWindow(&mainView);\r
-\r
- for(i = 0; i < VIEWS_COUNT; i++)\r
- {\r
- CString str;\r
- str.Format("Settings\\StereoGR\\View%d", i);\r
- POINT view;\r
-\r
- view.x = GetProfileInt(LPCTSTR(str), "left", 0);\r
- view.y = GetProfileInt(LPCTSTR(str), "top", 0);\r
-\r
- m_TopLefts[i] = view;\r
- \r
- if(i == PT_POINTCLOUD_IMAGE || i == GR_MAGICCUBE)\r
- {\r
- str.Format("Settings\\StereoGR\\View%d_3d", i);\r
- POINT view;\r
-\r
- view.x = GetProfileInt(LPCTSTR(str), "left", 0);\r
- view.y = GetProfileInt(LPCTSTR(str), "top", 0);\r
-\r
- m_TopLefts3D[i] = view;\r
- }\r
- }\r
-\r
- m_dgProp->m_savePath = m_modulePath;\r
- return TRUE;\r
-}\r
-\r
-CStereoGRApp::SaveSettings()\r
-{\r
- // Load the PTGrey settings\r
- char * _settings[] = {\r
- "CameraBrightness",\r
- "CameraIris",\r
- "CameraExposure",\r
- "MinDisparity",\r
- "MaxDisparity",\r
- "DisparityThreshold",\r
- "DifferenceThreshold",\r
- "DepthThreshold"\r
- };\r
-\r
- for(int i = 0; i < sizeof(_settings)/sizeof(char*); i++)\r
- {\r
- int value;\r
- PTGreyGetProperty(_settings[i], &value);\r
- WriteProfileInt("Settings\\PTGrey", _settings[i], value);\r
- }\r
-\r
- // Load the StereoGR settings\r
- WriteProfileInt("Settings\\PTGrey", "Segmentation threshold", m_findHand.m_segThresh);\r
- WriteProfileInt("Settings\\PTGrey", "Train framecount", m_findHand.m_trainFrameCount);\r
- WriteProfileInt("Settings\\PTGrey", "Improve mask", m_findHand.m_maskImprovigFlag);\r
-\r
- // Load HMM settings\r
- WriteProfileInt( "Settings\\HMM", "Number of states", m_hmmParams->m_num_states );\r
- WriteProfileInt( "Settings\\HMM", "Number of mixtures", m_hmmParams->m_num_mix );\r
-\r
- // Saving the views positions\r
-\r
- RECT mainRect;\r
- AfxGetMainWnd()->GetWindowRect(&mainRect);\r
- WriteProfileInt("Settings\\StereoGR", "left", mainRect.left);\r
- WriteProfileInt("Settings\\StereoGR", "top", mainRect.top);\r
- WriteProfileInt("Settings\\StereoGR", "width", mainRect.right - mainRect.left);\r
- WriteProfileInt("Settings\\StereoGR", "height", mainRect.bottom - mainRect.top);\r
-\r
- \r
- return TRUE;\r
-}\r
-\r
-int CStereoGRApp::ExitInstance() \r
-{\r
-// SaveSettings(); \r
- int ret = CWinApp::ExitInstance();\r
- PTGreyExitCamera(2);\r
- return ret;\r
-}\r
-\r
-\r
-void CStereoGRApp::OnLoadDynamicGestures() \r
-{\r
- int numgest = 6;\r
- char* names[6] = { "Rotate left", "Rotate right", "Move up", \r
- "Move down", "Zoom out", "Zoom in" };\r
-\r
- for( int i = 0; i < numgest; i++ )\r
- {\r
- CDynGesture* gesture = new CDynGesture(m_hmmParams->m_num_states, m_hmmParams->m_num_mix );\r
- CString path = names[i];\r
- if ( gesture->LoadParams( path ) )\r
- {\r
- gesture->SetName( path );\r
- //add to dgServer\r
- m_dgServer.AddGesture( gesture );\r
- }\r
- else delete gesture; \r
- }\r
-}\r
-\r
-void CStereoGRApp::OnSaveBase() \r
-{\r
- CFileDialog dlg( FALSE, 0, 0, /*OFN_ALLOWMULTISELECT | */OFN_ENABLESIZING |\r
- OFN_EXPLORER,\r
- "Dynamic Gesture base (*.txt) |*.txt|", 0 );\r
- \r
- if ( dlg.DoModal() == IDOK )\r
- { \r
- m_dgServer.SaveGestureBase( dlg.GetFileName() );\r
- }\r
- // TODO: Add your command handler code here \r
-}\r
-\r
-void CStereoGRApp::OnLoadBase() \r
-{\r
- CFileDialog dlg( TRUE, 0, 0, /*OFN_ALLOWMULTISELECT | */OFN_ENABLESIZING |\r
- OFN_EXPLORER,\r
- "Dynamic Gesture base (*.txt) |*.txt|", 0 );\r
- \r
- if ( dlg.DoModal() == IDOK )\r
- {\r
- m_dgServer.LoadGestureBase( dlg.GetFileName() );\r
- }\r
-}\r
-\r
-void CStereoGRApp::OnRecogFileDg() \r
-{\r
- // TODO: Add your command handler code here\r
- CFileDialog dlg( TRUE, 0, 0, /*OFN_ALLOWMULTISELECT | */OFN_ENABLESIZING |\r
- OFN_EXPLORER | OFN_FILEMUSTEXIST,\r
- "Dynamic Gesture observations (*.obs) |*.obs|", 0 );\r
-\r
- if ( dlg.DoModal()== IDOK )\r
- {\r
- float likelihood[10] = {-1, -1, -1, -1, -1, \r
- -1, -1, -1, -1, -1 };\r
-\r
- CDynGesture gesture(m_hmmParams->m_num_states, m_hmmParams->m_num_mix );\r
- gesture.LoadSequence( dlg.GetFileName() );\r
- gesture.ExtractObservations();\r
-\r
- m_dgServer.TrainAllGestures();\r
-\r
- int rg = m_dgServer.RecognizeDynGesture( &gesture, likelihood );\r
-\r
- //write result to status bar\r
- CMainFrame* frame = (CMainFrame*)AfxGetMainWnd();\r
- frame->GetStatusBar()->SetPaneText(2, "");\r
- CString RecogResult;\r
- RecogResult.Format("Recognized %s likelihood %f", \r
- m_dgServer.GetGesture( rg )->GetName(), likelihood[0] ); \r
- frame->GetStatusBar()->SetPaneText(2, RecogResult); \r
- }\r
-}\r
-\r
-\r
-\r
-\r
-void CStereoGRApp::OnDeleteHmm() \r
-{\r
- m_dgServer.DeleteHMMInfo();\r
- // TODO: Add your command handler code here\r
- \r
-}\r
-\r
-void CStereoGRApp::OnRemoveAllDg() \r
-{\r
- m_dgServer.CleanAll();// TODO: Add your command handler code here\r
- \r
-}\r
-\r
-\r
-void CStereoGRApp::Zoom()\r
-{\r
- \r
-}\r
-\r
-\r
-void CStereoGRApp::CreatePropertyPages()\r
-{\r
- m_hmmParams = new CHMMParams;\r
- m_ptOptions = new CPTOptions;\r
- m_grOptions = new CGROptions;\r
- m_dgStat = new CDGStat;\r
- m_dgProp = new CDGProp;\r
-}\r
-\r
-void CStereoGRApp::OnUpdateRungestrec(CCmdUI* pCmdUI) \r
-{\r
- // This feature is disabled in the current release\r
- pCmdUI->Enable(FALSE);\r
-}\r