【发布时间】:2016-03-13 12:30:53
【问题描述】:
我正在开发一个应用程序,主要目标是从图像采集卡中抓取图像,进行一些处理,然后在 GUI 上显示图像。 图像采集卡连接到 PCIe。我正在使用图像采集卡 SDK。 图像流非常慢 10 到 100 张图像/秒 我来这里是为了对我的代码以及如何优化它有一些建议。 首先,我的 run() 函数来自从 Qthread 继承的类 我抓取一张图像并将其放在缓冲区 queuecv:: Mat>.
void ImageIn::run(){
_cam->allocMemory();
_cam->startAquisition();
_runningThread = true;
while(_runningThread)
{
Mat image(_cam.getSizeX(), _cam.getSizeY(), CV_16U, _cam->getImageDMA0());
_ctrl->getMutexIn()->lock(); // Lock BufferIn
_ctrl->getBufferIn()->push(image); // store Image in BufferIn
_ctrl->getMutexIn()->unlock(); // Unlock bufferIn
}
}
图像存储在缓冲区中,然后处理线程做一些工作......
void ImageProcessing::run(){
while(_runningThread){
if (_ctrl->getMutexIn()->tryLock()){
while(!_ctrl->getBufferIn()->empty()){
_ctrl->getBufferIn()->front().convertTo(tempConvert, CV_32F);
_bufferLocalIn.push(tempConvert);
_ctrl->getBufferIn()->pop();
}
_ctrl->getMutexIn()->unlock();
}
// Do some processing and put image and a buffer for GUI
}
}
所以,我有一些问题: - 由于阻塞功能,线程 1 获取图像,因此 CPU 消耗很低,但线程 2 连续运行并消耗大量 CPU 重新评估我能做些什么来解决这个问题? - 这是正确的编码方式吗?
所以我尝试了:
QThread* thread = new QThread;
ImageWriter* worker = new ImageWriter();
worker->moveToThread(thread);
QTimer* timer = new QTimer();
int msec = 100;
timer->setInterval(msec);
QObject::connect(thread, SIGNAL(started()), worker, SLOT(process()));
QObject::connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
QObject::connect(timer, SIGNAL(timeout()), thread, SLOT(start()));
timer->start();
还好吗?
【问题讨论】:
-
了解条件等待。您可以让第二个线程等待,直到第一个线程捕获到要处理的新图像。然后它将继续处理,直到输入图像列表为空并退回到条件等待。我有一个问题:阻止功能来自您的图像采集卡 SDK,以等待有新图像可用后再尝试抓取?
-
谢谢,我会阅读有关条件等待的信息并尝试一下。是的,_cam->getImageDMA0() 函数从图像采集卡 SDK 调用了一个阻塞函数。此阻塞功能等待新图像。
标签: c++ multithreading qt opencv