我寫了創建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個函數開始,然後暫停。
你正在初始化「停止」嗎? –
主要功能不需要兩個'睡覺'。你只需要確保當你運行CamShift函數時,cvQuerieImage已經被執行了。如果不是,則可以在最差的情況下處理NULL圖像,或者在「幀」更新之前處理相同的圖像。 這可以通過一個標誌來完成,或者你可以使用FIFO隊列。 –