C++ 尝试使用线程运行CamShift
我编写了创建两个线程的代码(我使用glib)。第一个线程运行一个名为C++ 尝试使用线程运行CamShift,c++,linux,multithreading,opencv,glibc,C++,Linux,Multithreading,Opencv,Glibc,我编写了创建两个线程的代码(我使用glib)。第一个线程运行一个名为Camera的函数,该函数刚开始从摄像机捕获,并在屏幕上显示捕获的帧。第二个功能是算法CamShift,它使用从第一个功能捕获的图像开始运行。我创建了第一个从相机捕获的函数,因为稍后我将添加更多算法,如CamShift,以访问第一个函数中的捕获 我的问题是,我希望这两个函数继续运行,直到我告诉它们停止。但是我对使用线程和我编写代码的方式是新的,它编译得很好,并运行这两个函数,但它们只是在启动后立即“暂停”。下面是我的2个函数的代
Camera
的函数,该函数刚开始从摄像机捕获,并在屏幕上显示捕获的帧。第二个功能是算法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
算法。我刚刚修改了它,以使用从相机
功能捕获的帧。这很好,但问题是,正如我前面所说的,这两个函数启动后只是暂停。不要使用睡眠
来尝试同步线程。您需要使用或保护帧
变量。这将防止共享资源出现争用情况。您还可以使用条件变量结构通知CamShift
线程帧已准备就绪(在Camera
线程中)。这将允许CamShift
线程阻塞,直到在Camera
线程中捕获帧
希望这是有帮助的 是否正在初始化“停止”?不需要在主功能中设置两个“休眠”。您只需确保在运行CamShift函数时,cvQuerieImage已被执行。如果不是,您可以在最坏的情况下使用空图像,或者在更新“帧”之前处理相同的图像。这可以通过一个标志来确定捕获已经完成,也可以使用FIFO队列。