Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema con funzione e contatore
Forum - C/C++ - Problema con funzione e contatore

Avatar
solo_soletto (Normal User)
Newbie


Messaggi: 1
Iscritto: 06/01/2012

Segnala al moderatore
Postato alle 16:15
Venerdì, 06/01/2012
Ciao a tutti!
Sono nuovo nel forum e spero possiate aiutarmi!
Sto lavorando ad un programma nella quale 3 webcam controllano se viene rilevato un volto.
Nel caso in cui un volto venisse trovato si deve aprire una finestra che visualizza un'immagine o altro.

Il mio problema è sapere come posso inserire all'interno del codice la funzione che mi apre la finestra. Il punto è che vorrei mettere un contatore:la finestra si deve aprire quando viene rilevato un volto (si deve aprire UNA volta sola, non tutte le volte che viene rilevato..altrimenti si aprirebbero mille finestre!) e poi chiudersi se non viene trovato niente dopo un tot di tentativi.
Il programma è scritto in linguaggio C ed è il seguente. E' scritto utilizzando le librerie Open CV. Conosco gà la funzione "cvShowImage", ma voglio sapere dove inserirla all'interno del codice per far sì che si apra una volta sola e dove mettere il contatore.

Riuscite a darmi una mano?? Grazie :)


Ecco il codice:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include "cv.h"
  3. #include "highgui.h"
  4. #include <stdlib.h>
  5.  
  6. CvHaarClassifierCascade *cascade;
  7. CvMemStorage            *storage;
  8.  
  9. int  detectFaces (IplImage *img, int cameraId);
  10. CvSeq *faces;
  11. int w,h;
  12.  
  13. int main (int argc, char **argv)
  14. {
  15.    
  16.     CvCapture* capture1 = cvCaptureFromCAM(0);
  17.     CvCapture* capture2 = cvCaptureFromCAM(1);
  18.     CvCapture* capture3 = cvCaptureFromCAM(2);
  19.    
  20.     if ( !capture1 || !capture2 || !capture3 ) {
  21.           fprintf( stderr, "Errore: Impossibile inizializzare la webcam!\n" );
  22.           return 1;
  23.         }
  24.    
  25.     int key=0;
  26.     char *filename = "haarcascade_frontalface_alt.xml";
  27.    
  28.     cascade = (CvHaarClassifierCascade *) cvLoad (filename, 0, 0, 0);
  29.     storage = cvCreateMemStorage (0);
  30.     assert(cascade && storage && capture1 && capture2 && capture3);
  31.    
  32.     w = GetSystemMetrics(SM_CXSCREEN);
  33.     h = GetSystemMetrics(SM_CYSCREEN);
  34.     printf("\n\t\t\t --- Face Detection ---\n\n\n\nScreen Resolution: %dx%d\n\n\n",w,h);
  35.        
  36.      cvNamedWindow ("Camera left", CV_WINDOW_FULLSCREEN);
  37.      cvNamedWindow ("Camera right", CV_WINDOW_FULLSCREEN);
  38.      cvNamedWindow ("Camera central", CV_WINDOW_FULLSCREEN);
  39.          
  40.      int ok1 = TRUE;
  41.      int ok2 = TRUE;
  42.      int ok3 = TRUE;
  43.          
  44.     while (key != 27) {
  45.            
  46.            do {
  47.                   IplImage* frame1 = cvQueryFrame (capture1);
  48.                   cvFlip (frame1, frame1, 1);
  49.                   frame1->origin = 0;
  50.                   ok1=detectFaces(frame1,1);
  51.                   cvShowImage ( "Camera left", frame1);
  52.                   }  while(ok1);
  53.                  
  54.            do {
  55.                   IplImage* frame2 = cvQueryFrame (capture2);
  56.                   cvFlip (frame2, frame2, 1);
  57.                   frame2->origin = 0;
  58.                   ok2 = detectFaces(frame2,2);
  59.                   cvShowImage ( "Camera right", frame2);
  60.                   } while(ok2);
  61.            
  62.            do {
  63.                   IplImage* frame3 = cvQueryFrame (capture3);
  64.                    cvFlip (frame3, frame3, 1);
  65.                    frame3->origin = 0;
  66.                    ok3 = detectFaces(frame3,3);
  67.                    cvShowImage ( "Camera central", frame3);
  68.                    } while(ok3);
  69.                    
  70.            key = cvWaitKey (10);
  71.            }
  72.            
  73.      cvReleaseCapture (&capture1);
  74.      cvReleaseCapture (&capture2);
  75.      cvReleaseCapture (&capture3);
  76.      
  77.      void cvDestroyAllWindows(void);
  78.      
  79.      cvReleaseHaarClassifierCascade (&cascade);
  80.      cvReleaseMemStorage (&storage);
  81.    
  82.      return 0;
  83. }
  84.  
  85. int detectFaces (IplImage *img,int cameraId)
  86. {
  87.      int i;
  88.  
  89.      printf ( "Cercando facce sulla camera %d\n", cameraId );
  90.  
  91.      CvSeq *faces = cvHaarDetectObjects (
  92.                                        img,
  93.                                        cascade,
  94.                                        storage,
  95.                                        1.1,
  96.                                        3,
  97.                                        0,
  98.                                        cvSize(40, 40));
  99.                                        
  100.      for (i = 0; i < (faces ? faces->total :0 ); i++) {
  101.          CvRect *r = (CvRect *) cvGetSeqElem  (faces, i);
  102.          cvRectangle (img,
  103.                      cvPoint (r->x, r->y),
  104.                      cvPoint (r->x + r->width, r->y + r->height),
  105.                      CV_RGB (255, 0, 0), 1, 8, 0 );
  106.                
  107.      printf("Trovata faccia! \n");
  108.      }
  109.    
  110.     if(faces -> total!=0)
  111.         return TRUE;
  112.                
  113.     else
  114.         return FALSE;
  115.    }



PM