Update to 2.0.0 tree from current Fremantle build
[opencv] / apps / StereoGR / StereoGR.cpp
diff --git a/apps/StereoGR/StereoGR.cpp b/apps/StereoGR/StereoGR.cpp
deleted file mode 100644 (file)
index 3d35faa..0000000
+++ /dev/null
@@ -1,1042 +0,0 @@
-/*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