尝试使用线程运行CamShift
Trying to run CamShift using threads
我编写了创建2个线程的代码(我使用glib)。第一个线程运行一个名为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: %sn", 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: %sn", 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
来尝试同步线程。您需要使用GMutex或GStaticRWLock来保护frame
变量。这将防止在共享资源上发生竞争条件。您还可以使用GCond条件变量结构通知CamShift
线程一个帧已经准备好了(在Camera
线程中)。这将允许CamShift
线程阻塞,直到在Camera
线程中捕获帧。
希望这是有帮助的!
相关文章:
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 代码在main()中运行,但在函数中出现错误
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何在运行中期切换GTK CSS style_context
- 如何在MS Visual Studio 2019中运行QT UI
- 如何通过cpp程序运行shell脚本
- IPC使用多个管道和分支进程来运行Python程序
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- c++中的指针和运行时错误
- 在C应用程序中运行C++(带有STL)函数
- 运行程序时出现问题
- 在导入的视频上运行 Camshift 演示
- 尝试使用线程运行CamShift