У меня есть петля, чтобы снимать изображения с высокоскоростного framegrabbger со скоростью 250 кадров в секунду.
/** Loop processes 250 video frames per second **/
while(1){
AcquireFrame();
DoProcessing();
TakeAction();
}
В то же время я хотел бы, чтобы пользователь мог следить за тем, что происходит. Пользователь должен видеть только изображения со скоростью около 30 кадров в секунду (или меньше). Как настроить второй поток, который так часто отображает текущий кадр?
Thread(){
cvShowImage();
Wait(30); /** Wait for 30 ms **/
}
Я нахожусь на Windows на четырехъядерном процессоре Intel с использованием MinGW, gcc и OpenCV 1.1. Основными критериями являются то, что поток отображения должен занимать как можно меньше времени от моего основного цикла обработки. Каждые миллисекунды считаются.
Я попытался использовать CreateThread()
для создания нового потока с cvShowImage()
и cvWaitKey()
, но очевидно, что эти функции не являются потокобезопасными,
Я рассматриваю возможность использования OpenMP, но некоторые люди сообщают о проблемах с OpenMP и OpenCV. Я также рассматриваю возможность использования DirectX DirectDraw, потому что, по-видимому, это очень быстро. но выглядит сложным и, очевидно, существуют проблемы с использованием Windows DLL с MinGw.
Какое из этих направлений было бы лучшим местом для начала?