And*_*dyL 13 c++ multithreading opencv image-processing
我有一个循环从250fps的高速framegrabbger中获取图像.
/** Loop processes 250 video frames per second **/
while(1){
AcquireFrame();
DoProcessing();
TakeAction();
}
Run Code Online (Sandbox Code Playgroud)
同时,我希望用户能够监控正在发生的事情.用户只需要以大约30 fps(或更低)的速度查看图像.如何设置第二个线程,每隔一段时间显示当前帧?
Thread(){
cvShowImage();
Wait(30); /** Wait for 30 ms **/
}
Run Code Online (Sandbox Code Playgroud)
我在使用MinGW,gcc和OpenCV 1.1的四核Intel机器的Windows上.主要标准是显示线程必须尽可能少地离开主处理循环.每毫秒都很重要.
我已经尝试使用CreateThread()创建一个新线程cvShowImage()和cvWaitKey(),但显然这些功能不是线程安全的.
我正在考虑使用OpenMP,但有些人报告了OpenMP和OpenCV的问题.我也正在考虑尝试使用DirectX directDraw,因为它显然非常快.但它看起来很复杂,显然使用Windows DLL与MinGw有问题.
哪些途径是最好的起点?
And*_*dyL 10
好.令人尴尬的是,我的问题也是它自己的答案.
使用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;
}
Run Code Online (Sandbox Code Playgroud)
当我最初发布这个问题时,我的代码因无关原因而失败.我希望这有帮助!
| 归档时间: |
|
| 查看次数: |
17969 次 |
| 最近记录: |