2011-11-24 72 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線程中捕獲到幀。

希望有幫助!