尝试使用线程运行CamShift

时间:2011-11-24 19:15:44

标签: c++ linux multithreading opencv glibc

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

我的问题是我希望这两个功能继续运行,直到我告诉他们停止。但我是新的使用线程和编写代码的方式编译好并运行2个函数,但它们只是在它们启动后立即“暂停”。下面是我的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个函数开始然后暂停。

1 个答案:

答案 0 :(得分:0)

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

希望有帮助!