簡體   English   中英

嘗試使用線程運行CamShift

[英]Trying to run CamShift using threads

我編寫了創建2個線程的代碼(我正在使用glib)。 第一個線程運行一個名為Camera的功能,該功能僅從Camera開始捕獲,並在屏幕上顯示捕獲的幀。 第二個函數是CamShift算法,該算法使用從第一個函數捕獲的圖像開始運行。 我制作了第一個從相機捕獲的功能,因為稍后我將添加更多的算法(例如CamShift ,這些算法將從第一個功能訪問捕獲的圖像。

我的問題是我希望這兩個功能繼續運行,直到我告訴它們停止為止。 但是我是新來的使用線程的人,而且我編寫代碼的方式可以很好地編譯並運行這兩個函數,但是它們只是在啟動后立即“暫停”。 下面是我的兩個函數的代碼。

//**********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功能捕獲的幀。 效果很好,但是問題是,就像我之前說的那樣,這兩個函數先啟動然后暫停。

不要使用sleep嘗試同步線程。 您需要使用GMutexGStaticRWLock保護frame變量。 這將防止該共享資源發生競爭條件。 您還可以使用GCond條件變量結構通知CamShift線程(在Camera線程中)幀已准備就緒。 這將允許CamShift線程阻塞,直到在Camera線程中捕獲到一幀為止。

希望對您有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM