我有一个循环以 250fps 的速度从高速帧抓取器中获取图像。
/** Loop processes 250 video frames per second **/
while(1){
AcquireFrame();
DoProcessing();
TakeAction();
}
同时,我希望用户能够监控正在发生的事情。用户只需要以大约 30 fps(或更低)的速度查看图像。如何设置第二个线程,每隔一段时间显示当前帧?
Thread(){
cvShowImage();
Wait(30); /** Wait for 30 ms **/
}
我在 Windows 上使用 MinGW、gcc 和 OpenCV 1.1 的四核 Intel 机器。主要标准是显示线程必须尽可能少地离开我的主处理循环。每一毫秒都很重要。
我已经尝试使用 CreateThread()
来创建一个带有 cvShowImage()
和 cvWaitKey()
的新线程,但是 apparently those functions are not threadsafe .
我正在考虑使用 OpenMP,但有些人 report problems with OpenMP and OpenCV .我也在考虑尝试使用 DirectX directDraw,因为它显然非常快。但它looks complicated显然有problems using Windows DLL's with MinGw .
这些途径中的哪一个是最好的起点?
最佳答案
好的。很尴尬的是,我的问题也是它自己的答案。
使用我的问题中描述的 CreateThread()
、CvShowImage()
和 CvWaitKey()
确实有效 - 与一些帖子相反否则建议的网络。
无论如何,我实现了这样的东西:
/** Global Variables **/
bool DispThreadHasFinished;
bool MainThreadHasFinished;
iplImage* myImg;
/** Main Loop that loops at >100fps **/
main() {
DispThreadHasFinished = FALSE;
MainThreadHasFinished = FALSE;
CreateThread(..,..,Thread,..);
while( IsTheUserDone() ) {
myImg=AcquireFrame();
DoProcessing();
TakeAction();
}
MainThreadHasFinished = TRUE;
while ( !DisplayThreadHasFinished ) {
CvWaitKey(100);
}
return;
}
/** Thread that displays image at ~30fps **/
Thread() {
while ( !MainThreadHasFinished ) {
cvShowImage(myImg);
cvWaitKey(30);
}
DispThreadHasFinished=TRUE;
return;
}
当我最初发布这个问题时,我的代码由于不相关的原因而失败。我希望这会有所帮助!
关于c++ - 在第二个线程中显示图像,OpenCV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2050369/