我写了创建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队列。 –