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:
#include <stdio.h>
#include "cv.h"
#include "highgui.h"
#include <stdlib.h>

CvHaarClassifierCascade *cascade;
CvMemStorage            *storage;

int  detectFaces (IplImage *img, int cameraId); 
CvSeq *faces;
int w,h;

int main (int argc, char **argv)
{
    
    CvCapture* capture1 = cvCaptureFromCAM(0);
    CvCapture* capture2 = cvCaptureFromCAM(1);
    CvCapture* capture3 = cvCaptureFromCAM(2);
    
    if ( !capture1 || !capture2 || !capture3 ) {
	  fprintf( stderr, "Errore: Impossibile inizializzare la webcam!\n" );
	  return 1;
	}
    
    int key=0;
    char *filename = "haarcascade_frontalface_alt.xml";
    
    cascade = (CvHaarClassifierCascade *) cvLoad (filename, 0, 0, 0);
    storage = cvCreateMemStorage (0);
    assert(cascade && storage && capture1 && capture2 && capture3);
    
    w = GetSystemMetrics(SM_CXSCREEN);
    h = GetSystemMetrics(SM_CYSCREEN);
    printf("\n\t\t\t --- Face Detection ---\n\n\n\nScreen Resolution: %dx%d\n\n\n",w,h);
	
     cvNamedWindow ("Camera left", CV_WINDOW_FULLSCREEN);
     cvNamedWindow ("Camera right", CV_WINDOW_FULLSCREEN);
     cvNamedWindow ("Camera central", CV_WINDOW_FULLSCREEN);
         
     int ok1 = TRUE;
     int ok2 = TRUE;
     int ok3 = TRUE;
          
    while (key != 27) {
           
           do {
                  IplImage* frame1 = cvQueryFrame (capture1);
                  cvFlip (frame1, frame1, 1);
                  frame1->origin = 0; 
                  ok1=detectFaces(frame1,1);
                  cvShowImage ( "Camera left", frame1);
                  }  while(ok1);
                  
           do {
                  IplImage* frame2 = cvQueryFrame (capture2);
                  cvFlip (frame2, frame2, 1);
                  frame2->origin = 0;
                  ok2 = detectFaces(frame2,2);
                  cvShowImage ( "Camera right", frame2);
                  } while(ok2);
           
           do {
                  IplImage* frame3 = cvQueryFrame (capture3);
                   cvFlip (frame3, frame3, 1);
                   frame3->origin = 0;
                   ok3 = detectFaces(frame3,3);
                   cvShowImage ( "Camera central", frame3);
                   } while(ok3);
                   
           key = cvWaitKey (10);
           }
           
     cvReleaseCapture (&capture1);
     cvReleaseCapture (&capture2);
     cvReleaseCapture (&capture3);
     
     void cvDestroyAllWindows(void);
     
     cvReleaseHaarClassifierCascade (&cascade);
     cvReleaseMemStorage (&storage);
    
     return 0;
}

int detectFaces (IplImage *img,int cameraId)
{
     int i;

     printf ( "Cercando facce sulla camera %d\n", cameraId );

     CvSeq *faces = cvHaarDetectObjects (
                                       img,
                                       cascade,
                                       storage,
                                       1.1,
                                       3,
                                       0,
                                       cvSize(40, 40));
                                       
     for (i = 0; i < (faces ? faces->total :0 ); i++) {
         CvRect *r = (CvRect *) cvGetSeqElem  (faces, i);
         cvRectangle (img,
                     cvPoint (r->x, r->y),
                     cvPoint (r->x + r->width, r->y + r->height),
                     CV_RGB (255, 0, 0), 1, 8, 0 );
                
     printf("Trovata faccia! \n"); 
     }
    
    if(faces -> total!=0)
        return TRUE;
               
    else
        return FALSE;
   }