void CGUIFaceInVideoView::OnDraw(CDC* pDC) { CGUIFaceInVideoDoc* pDoc = GetDocument(); // CGUIFaceInVideoView* pView = (CGUIFaceInVideoView*)GetActiveView(); // CGUIFaceInVideoDoc *pDoc = (CGUIFaceInVideoDoc*)pView->GetDocument(); ASSERT_VALID(pDoc); if (pDoc == NULL) return; CFaceRecognizer *frIds = & pDoc->m_frIds; // in 24x24 image // char sWhatValuesToUse[5]; // "011" - don't use I, use dIx, dIy // char sHowToCrop[5]; // "22001" - cut from left and right 2 pixels , from top/bottom 0 pixels and scale by 1. char // sWhatValuesToUse[]="111", sWhatValuesToUse[]="111", sHowToCrop[]="00001"; // just remeber: The m_imgY will not be diplayed properly if m_nWidth is not muliple of 4 ! sHowToCrop[3]='0'; frIds->initialize(10, sWhatValuesToUse, sHowToCrop); CIplImage *pImgIn; CvPoint *pPointL, *pPointR; int nNameTag, nBestMatch; char strMessage[256], str[200], strNameTag[40]; /* if (frIds->m_nStoredFaces > frIds->m_pinn.m_N / 2) // MAX_FACES - 1 ) { OnDraw_LogWindow(pDC, "Memory is full!", set_window(0,0), 0); return; } */ // Update all sliders data: frIds->m_pinn.m_nNoise = pDoc->m_gui.slider1*frIds->m_pinn.m_N/100; frIds->m_pinn.m_D = pDoc->m_gui.slider2/100.0; //Doc->m_memory.m_pinn.m_dFade=1;// 1-pDoc->m_gui.slider3/1000.0; // ************************************************************************************************ // Show MemoryContents // ************************************************************************************************ if (m_nVideoStream == VIDEO_STREAM_CURRENT_FRAME) // Draw all stored faces for(int n=0; n< MIN (frIds->m_nStoredFaces, FR_MAX_FACES); n++) // frIds->m_nStoredFaces frIds->m_arrImgStoredFaces[n].draw(pDC->m_hDC, set_faceRect(n)); if (m_bShowPINN ) // Draw the contents of PINN memory { // if (m_bShowPINNwell ) { /* RECT rect; rect.left = IMAGE_160*2+2; rect.top = 0; rect.right = rect.left + frIds->m_pinn.m_N; rect.bottom = rect.top + frIds->m_pinn.m_N; */ frIds->getPINNasImage()-> draw(pDC->m_hDC, set_window(3,0, 1, 1), false); } // else // frIds->getPINNasImage()->draw(pDC->m_hDC, set_window(4,0, 264), true); //, false); } // Clear memory and reset all checks to unchecked if (pDoc->m_gui.check3) { CMainFrame *pMainFrm = (CMainFrame*)GetParentFrame(); CButton* check = (CButton*)((pMainFrm->GetDlgItem(IDD_DIALOGBAR1))->GetDlgItem(IDC_CHECK2)); check->SetCheck(BST_UNCHECKED); // back to video mode check = (CButton*)((pMainFrm->GetDlgItem(IDD_DIALOGBAR1))->GetDlgItem(IDC_CHECK1)); check->SetCheck(BST_UNCHECKED);// back to memorization mode check = (CButton*)((pMainFrm->GetDlgItem(IDD_DIALOGBAR1))->GetDlgItem(IDC_CHECK3)); check->SetCheck(BST_UNCHECKED); pDoc->m_gui.check1 = false; pDoc->m_gui.check2 = false; pDoc->m_gui.check3 = false; // fclose(pDoc->m_fScenario); // fclose(pDoc->m_fScenarioTest); pDoc->closeFaceList(); pDoc->openFaceList(); pMainFrm->UpdateData(FALSE); frIds->destroy(); OnEraseBkgnd(pDC); // pDoc->m_bWorkWithFiles = false; OnDraw_LogWindow(pDC, "Memory cleared ", set_window(1,0), 0); return; } /***************************************************************************************/ /*** Use data from video camera / AVI **************************************************/ /***************************************************************************************/ CPerceptualVisionSystem *pPVS = pDoc->getPVS(); OnDraw_LogWindow(pDC, pPVS->m_strFrameRate, set_window(0,2,1,0), 0); sprintf(strMessage, "%i: %i (%i) msec ", pPVS->m_nFrame, pPVS->m_tBetweenFrames, pPVS->m_tBetweenFramesNow); OnDraw_LogWindow(pDC, strMessage, set_window(0,2), 1); bool bRes = pPVS->initializeNextFrame(); if (bRes == false) return; // if want to show it but not process it, change it. pPVS->m_imgIn.draw(pDC->m_hDC, set_window(0,0), false, false); // Detect up to 1 person and // load the rescaled to 28x28 face of this person into m_face int nFacesDetected = pPVS->m_fd.detectFacesIn(&pPVS->m_imgBW); if (nFacesDetected<=0) return; sprintf(strMessage, "%i faced detected", nFacesDetected); OnDraw_LogWindow(pDC, strMessage, set_window(0,2), -2); if (nFacesDetected>1) OnDraw_LogWindow(pDC, strMessage, set_window(0,1,1,0), 5); else OnDraw_LogWindow(pDC, " ", set_window(0,1,1,0), 5); pPVS->m_chanColour.updateImages(&pPVS->m_imgIn);// NB: Colour is useless, unless you recompute skin model (like Bradski) pPVS->m_chanMotion.updateImages(&pPVS->m_imgIn); pPVS->m_chanMotion.compute_dI(); // pPVS->m_chanMotion.compute_ddI(); pPVS->m_chanMotion.compute_FG(); int nFaceRotation; for(int nFace=0; nFace<nFacesDetected; nFace++) // for(int nFace=0; nFace<1; nFace++) { CvPoint ptL, ptR; int nEye; CFace::fdRect2Eyes(pPVS->m_fd.getLocationOfFace(nFace), &ptL, &ptR, &nEye); CvPoint pt00={ptL.x-nEye/2, ptL.y-nEye/2}, pt11={ptR.x+nEye/2, ptR.y+nEye}; CvRect rect={pt00.x, pt00.y, pt11.x-pt00.x, pt11.y-pt00.y}; cvRectangle(pPVS->m_imgOut.getIplImage(), pt00, pt11, 0xffffaa, 2 ); // Detect rotation - do it later nFaceRotation = g_findDominantOrientation(&pPVS->m_imgBW, rect, 5); ptL.y -= 3.14/180.0*nEye*nFaceRotation; ptR.y += 3.14/180.0*nEye*nFaceRotation; CFace::draw_Glasses(&pPVS->m_imgOut, ptL, ptR, 0xff00aa); sprintf(strMessage, "%3i degrees rotated", nFaceRotation); OnDraw_LogWindow(pDC, strMessage, set_window(1,2), 5); //////////////////////////////// PVI_BLOB blobC1, blobC2, blobM; bool resC1 = isThereAnything(&pPVS->m_chanColour.m_imbSkinYCrCb, &rect, &blobC1); // bool resC1 = pPVS->m_chanMotion.isThereAnything(&pPVS->m_chanColour.m_imbSkinYCrCb, &rect, &blobC1); bool resC2 = isThereAnything(&pPVS->m_chanColour.m_imbSkinUCS, &rect, &blobC2); bool resM = isThereAnything(&pPVS->m_chanMotion.m_imbFG, &rect, &blobM); // bool resM = pPVS->m_chanMotion.isThereSomething(&pPVS->m_chanMotion.m_imbFG, &rect, &blobM); /* if ( ! resC1 ) // ( (blobC1.N > rect0->width) && (blobC1.N > rect0->width) )) { sprintf(strMessage, "No skin detected" ); OnDraw_LogWindow(pDC, strMessage, set_window(1,3), 0); return; } else { sprintf(strMessage, "Skin detected " ); OnDraw_LogWindow(pDC, strMessage, set_window(1,3), 0); } */ if ( !resM ) { sprintf(strMessage, "No motion detected" ); OnDraw_LogWindow(pDC, strMessage, set_window(3,3), 0); return; } else { // sprintf(strMessage, "Motion detected " ); // OnDraw_LogWindow(pDC, strMessage, set_window(3,3), 0); break; } } // A uzh kakoj iz nih m_face[f] use decide sam int nFaceSelected = nFace-1; // Load into a 0th face Selected Face / MUST PASS pPVS->m_imgBW image not Colour image !! pPVS->m_face[0].loadFace(&pPVS->m_imgBW, pPVS->m_fd.getLocationOfFace(nFaceSelected), nFaceRotation); frIds->loadVectorsFromFace(& pPVS->m_face[0]); // Maybe I should just : frIds->loadVectorsFromFace(&pPVS->m_imgBW, pPVS->m_fd.getLocationOfFace(nFaceSelected)); cvRectangle(pPVS->m_face[0].m_imgFaceDetected.getIplImage(), cvPoint( 2+a2i( frIds->m_sItoCrop[0] ),2+a2i( frIds->m_sItoCrop[1] ) ), cvPoint( 26-a2i( frIds->m_sItoCrop[2] ), 26-a2i( frIds->m_sItoCrop[3] ) ), 0xffffaa, 2 ); pPVS->m_face[0].m_imgFaceDetected.draw(pDC->m_hDC, set_window(0,1, 2*pPVS->m_face[0].m_imgFaceDetected.getWidth(),0,0)); if (!m_bTraceMode) { /* frIds->m_imgNewFace.draw(pDC->m_hDC, set_window(4,1, 24*3)); frIds->m_imgQueryFace.draw(pDC->m_hDC, set_window(4,1, 24*3, 1,0)); */ frIds->getSasImage(frIds->m_S, 0)->draw(pDC->m_hDC, set_window(1,1, 60)); frIds->getSasImage(frIds->m_S, 1)->draw(pDC->m_hDC, set_window(2,1, 60)); frIds->getSasImage(frIds->m_S, 2)->draw(pDC->m_hDC, set_window(3,1, 60)); frIds->getYasImage(frIds->m_Y, 0)->draw(pDC->m_hDC, set_window(1,1, 60, 1,0)); frIds->getYasImage(frIds->m_Y, 1)->draw(pDC->m_hDC, set_window(2,1, 60, 1,0)); frIds->getYasImage(frIds->m_Y, 2)->draw(pDC->m_hDC, set_window(3,1, 60, 1,0)); } pPVS->m_imgOut.draw(pDC->m_hDC, set_window(1,0), false, false); pPVS->m_chanColour.m_imbSkinYCrCb.draw(pDC->m_hDC, set_window(0,3)); pPVS->m_chanColour.m_imbSkinUCS.draw(pDC->m_hDC, set_window(1,3)); pPVS->m_chanMotion.m_imbFG.draw(pDC->m_hDC, set_window(2,3)); pPVS->m_chanMotion.m_imb_dI.draw(pDC->m_hDC, set_window(3,3)); // pPVS->m_chanMotion.m_imb_ddI.draw(pDC->m_hDC, set_window(4,3)); nNameTag = pDoc->m_gui.slider4;//-1; // ************************************************************************************************ if (!pDoc->m_gui.check_start) // It has to be checked to start the process return; //NB: frIds->m_pinn.m_dFade, frIds->m_pinn.m_D zadautsq by sliders; !!! frIds->m_pinn.m_D = 1.0; #if 1 // later // ************************************************************************************************ if (pDoc->m_gui.check1 == false) // memorize // ************************************************************************************************ { bool bStoreOnDisk = m_bTraceMode; // use every Nth frame if (pDoc->m_PVSystem.m_nFrame % (pDoc->m_gui.slider2+1) != 0) { sprintf(strMessage, "... skipped (%i/%i) ", pDoc->m_PVSystem.m_nFrame % (pDoc->m_gui.slider2+1), pDoc->m_gui.slider2+1); OnDraw_LogWindow(pDC, strMessage, set_window(0,1), 5); return; } // frIds->LoadID(nNameTag); frIds->setIDto1(nNameTag); int res = frIds->m_pinn.putInMemory(frIds->m_Y); //** // nn->MemorizeV_as(nNameTag); frIds->m_arrImgStoredFaces[frIds->m_nStoredFaces++ % FR_MAX_FACES].copy(&pPVS->m_face[0].m_imgFaceDetected); // if (m_bShowPINNwell ) { frIds->m_pinn.analyzeMemory(); sprintf(strMessage, "Brain model: N=%i D=%4.2f, C: %4.2f %4.2f %4.2f", frIds->m_pinn.m_N, frIds->m_pinn.m_D, frIds->m_pinn.m_dAveCii, frIds->m_pinn.m_dAveCij2, frIds->m_pinn.m_dAveAbsCij2); } /* else sprintf(strMessage, "Brain model: N=%i", frIds->m_pinn.m_N, frIds->m_pinn.m_D, frIds->m_pinn.m_dAveCii, frIds->m_pinn.m_dAveCij2, frIds->m_pinn.m_dAveAbsCij2); */ OnDraw_LogWindow(pDC, strMessage, set_window(2,0,2,0), 0); sprintf(strMessage,"Memorize: ID=%i, E:%.1f ", nNameTag, frIds->m_pinn.m_E); // %s, strNameTag, OnDraw_LogWindow(pDC, strMessage, set_window(2,0), 1); if (res==0) sprintf(strMessage, " similar face already memorized"); else sprintf(strMessage, " face memorized (#%i) ! ", frIds->m_pinn.m_M); // frIds->m_nStoredFaces-1); OnDraw_LogWindow(pDC,strMessage, set_window(2,0), 2); // for(int i=2;i<=20;i++) // OnDraw_LogWindow(pDC, " ", set_window(1,0,0,1), i+2); if ( (! pDoc->m_gui.check2) && (! pDoc->m_gui.check_nonstop )) // i.e. from video { // Uncheck checkbox (switch to recognition mode) CMainFrame *pMainFrm = (CMainFrame*)GetParentFrame(); CButton* check = (CButton*)((pMainFrm->GetDlgItem(IDD_DIALOGBAR1))->GetDlgItem(IDC_CHECK1)); check->SetCheck(BST_CHECKED); pDoc->m_gui.check1 = true; pMainFrm->UpdateData(FALSE); } } // ************************************************************************************************ else // recognize // ************************************************************************************************ { // frIds->m_imgQueryFace.draw(pDC->m_hDC, set_window(0,1)); // OnDraw_LogWindow(pDC, "Stimulus", set_window(0,1), 0); // move this line to memorization! Nope... it does not work this way... frIds->m_pinn.setMemoryToDormantState(); // Influence of past history // for(int k=0; k<pDoc->nLastFrameIDs; k++) // frIds->setIDto1(pDoc->nLastFrameID[k]); // this is too much influence/ //** we should //** frIds->setYofID(pDoc->nLastFrameID[k], 0.15); frIds->m_pinn.retrieveFromMemory(frIds->m_Y, &frIds->m_Y); // frIds->m_pinn.retrieveFromMemory(); nNameTag = 0; char word[5][100], strY[100]="", strS[100]=" "; int nPosY=0; strcpy(word[4],""); pDoc->nLastFrameIDs=0; for(int i=0; i<frIds->m_nIDs; i++) { int nY = frIds->getYofID(i); // sprintf (word[1], "%+1i", (i+1)*nY); if (nY > 0) { sprintf (word[1], "1 ", (i+1)*nY); sprintf (word[2], "*%2.0f", (frIds->getSofID(i))*10); // nPosY++; pDoc->nLastFrameID[ pDoc->nLastFrameIDs++ ] = i; sprintf (word[3], "%i ", i); strcat(word[4], word[3]); } else { sprintf (word[1], "_ ", (i+1)*nY); // sprintf (word[2], " "); sprintf (word[2], " %2.0f", ((-1)*frIds->getSofID(i))*10); } strcat(strY, word[1]); strcat(strS, word[2]); } OnDraw_LogWindow(pDC, word[4], set_window(0,0), 0); sprintf(strMessage, "Neural response: %s ",word[4]); OnDraw_LogWindow(pDC, strMessage, set_window(1,0), 0); sprintf(strMessage, " It=%i, E=%3.0f ", frIds->m_pinn.m_nIter, frIds->m_pinn.m_E); OnDraw_LogWindow(pDC, strMessage, set_window(1,0), 1); // OnDraw_LogWindow(pDC, strY, set_window(1,0), 1); // OnDraw_LogWindow(pDC, strS, set_window(3,3,1,0), 1); int nStack= pDoc->m_gui.slider1+1; /* for(i=0;i<nStack;i++) { strcpy(pDoc->sStackY[i],""); strcpy(pDoc->sStackS[i],""); } */ strcpy(pDoc->sStackY[nStack],strY); strcpy(pDoc->sStackS[nStack],strS); // nNameTag !!!!!!!!!!! decode and display! int nResConsistent=0; // int nTagOverTime = nNameTag; // char sTags[30]; // char sTagsNum[11]; // int nIDs=0; for(i=1;i<=nStack;i++) { // if (pDoc->nStack[i-1]==pDoc->nStack[i]) // nBestMatch) // nResConsistent ++; pDoc->nStack[i-1]=pDoc->nStack[i]; strcpy(pDoc->sStackY[i-1],pDoc->sStackY[i]); strcpy(pDoc->sStackS[i-1],pDoc->sStackS[i]); sprintf(strMessage, "%s ", pDoc->sStackY[i-1]); // pDoc->nStack[i-1]); OnDraw_LogWindow(pDC, strMessage, set_window(1,0), i+1); if (m_bShowPINNwell ) { sprintf(strMessage, "%s ", pDoc->sStackS[i]); // pDoc->nStack[i-1]); OnDraw_LogWindow(pDC, strMessage, set_window(2,0), i+1); } } for(i;i<=20;i++) { OnDraw_LogWindow(pDC, " ", set_window(1,0), i+1); OnDraw_LogWindow(pDC, " ", set_window(2,0), i+1); } // if (m_bTraceMode) { frIds->getSasImage(frIds->m_pinn.m_S, 0)->draw(pDC->m_hDC, set_window(1,1, 24*3, 0,1)); frIds->getSasImage(frIds->m_pinn.m_S, 1)->draw(pDC->m_hDC, set_window(2,1, 24*3, 0,1)); frIds->getSasImage(frIds->m_pinn.m_S, 2)->draw(pDC->m_hDC, set_window(3,1, 24*3, 0,1)); frIds->getYasImage(frIds->m_Y, 0)->draw(pDC->m_hDC, set_window(1,1, 24*3, 1,1)); frIds->getYasImage(frIds->m_Y, 1)->draw(pDC->m_hDC, set_window(2,1, 24*3, 1,1)); frIds->getYasImage(frIds->m_Y, 2)->draw(pDC->m_hDC, set_window(3,1, 24*3, 1,1)); } } // end of recognition #endif // ************************************************************************************************ // end of memorization/recognition // ************************************************************************************************ // ************************************************************************************************ pDoc->m_bWorkWithFiles = false; if (m_bTraceMode == true && pDoc->m_gui.check2) // if scenario, wait to continue // AfxMessageBox("Next", MB_OK); if (MessageBox("Proceed to next face?",NULL,MB_OKCANCEL) != IDOK) exit(1); // strcpy(pDoc->m_input.strFile1,""); }