私はアプリケーションを開発していますが、主な目的はフレームグラバーから画像を取得し、処理してGUI上に画像を表示することです。 フレームグラバーはPCIeに接続されています。私はフレームグラバーSDKを使用しています。 イメージストリームは10〜100画像/秒でかなり遅いです 私のコードについてのアドバイスとそれを最適化する方法はこちらです。 まず、Qthreadから継承したクラスのrun()関数があります。 イメージを取得し、バッファqueuecv :: Mat>に配置します。 - 1は、ブロッキング機能へのイメージのおかげを取得したスレッド :...マルチスレッドのアドバイス
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
}
}
そうに
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
}
}
画像はバッファに格納され、その後、処理スレッドがいくつかの作業を行う、私はいくつかの質問を持っています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();
が、それは大丈夫ですか?
条件待ちについて読んでください。最初のスレッドが処理する新しいイメージを取得するまで、2番目のスレッドを待機させることができます。その後、入力イメージのリストが空になり、条件付き待機に戻るまで処理を続けます。私は1つの質問を持っている:ブロック機能は、あなたのフレームグラバーSDKから取得する前に新しい画像が利用可能になるまで待つ? – Micka
ありがとう、私は条件付き待ちについて読んで、それを試みます。 はい、_cam-> getImageDMA0()関数はフレームグラバーSDKからブロック機能を呼び出します。このブロッキング関数は新しいイメージを待ちます。 –