2011-11-24 39 views
0

我写了创建2个线程(我使用glib)的代码。第一个线程运行一个名为Camera的函数,该函数刚刚开始从相机捕获,并在屏幕上显示捕获的帧。第二个功能是算法CamShift,它使用第一个函数捕获的图像开始运行。我制作了第一个捕捉相机的功能,因为稍后我将添加更多算法,如CamShift,这些算法将从第一个功能访问捕捉。试图使用线程运行CamShift

我的问题是,我希望这两个功能继续运行,直到我告诉他们停止。但我是新来的,使用线程和我编写的编译好的代码并运行2个函数的方式,但它们在启动后立即“暂停”。以下是我的两个功能的代码。

//**********Sensa iluminacion (hilo)****************************************** 
GThread  *idGHilo,*idGHilo1, *idGHilo2, *idGHilo3, *idGHilo4; 
GError  **error = NULL; 
char *valorDevuelto = NULL;/* Valor que va a devolver el thread hijo */ 
if(!g_thread_supported()) // se inicializa el sistema de hilos (se emplea cuando se 
    g_thread_init(NULL); // emplean más de un hilo 


idGHilo1 = g_thread_create((GThreadFunc) Camara, NULL, TRUE, error);//esto lo cambie ayer 23 
/* Comprobamos el error al arrancar el thread */ 
if(error) { 
    g_print("Error: %s\n", error[0]->message); 
    g_error_free(error[0]); 
    //exit (-1); 
} 
sleep(10);   // se da un retardo para dar tiempo a que termine el hilo 
idGHilo2 = g_thread_create((GThreadFunc) CamShift2, NULL, FALSE, error); 
if(error) { 
    g_print("Error: %s\n", error[0]->message); 
    g_error_free(error[0]); 
    //exit (-1); 
} 
sleep(10); //10...5 
g_thread_join(idGHilo1); 
g_thread_join(idGHilo2); 


//**************************** 
// This is the camera function 
void Camara() { 

    capture = cvCaptureFromCAM(0); 
    while(stop != 's') { 

     // get a frame 
     frame = cvQueryFrame(capture); 

     // always check 
     if(!frame) break; 

     // 'fix' frame 
     cvFlip(frame, frame, 2); 
     frame->origin = 0; 

     cvNamedWindow("Camara", CV_WINDOW_AUTOSIZE); 
     cvShowImage("Camara", frame); 

     // quit if user press 'q' 

     stop = cvWaitKey(10); 
    } 
} 

另一个函数是OpenCV自带的常规CamShift算法。我只是修改它以使用Camera函数捕获的帧。这很好,但问题是,就像我之前说过的那样,2个函数开始,然后暂停。

+0

你正在初始化“停止”吗? –

+0

主要功能不需要两个'睡觉'。你只需要确保当你运行CamShift函数时,cvQuerieImage已经被执行了。如果不是,则可以在最差的情况下处理NULL图像,或者在“帧”更新之前处理相同的图像。 这可以通过一个标志来完成,或者你可以使用FIFO队列。 –

回答

0

请勿使用sleep尝试同步这些线程。您需要使用GMutexGStaticRWLock来保护frame变量。这将防止与共享资源发生竞争状况。您也可以使用GCond条件变量结构通知CamShift线程已准备好帧(在Camera线程中)。这将允许CamShift线程阻塞,直到在Camera线程中捕获到帧。

希望有帮助!