【发布时间】:2014-01-22 18:24:54
【问题描述】:
我正在使用 50 fps 的相机(在 Ubuntu 环境和 Qt 框架中),每 20 毫秒我会处理一个帧。
我编写了一个代码来从相机中读取图像,然后将它们存储在硬盘中。
while(3.14)
{
cv::Mat Camera_Image = Capture_Image();
double T1 = (double)cv::getTickCount();
cv::imwrite (STORE_ADDRESS,Camera_Image);
T1 = (((double)cv::getTickCount() -T1)*1000)/cv::getTickFrequency();
print(T1);
}
当我看到输出时,对于 2048*1080 的图像大小,将单个图像写入硬盘的时间约为 30 毫秒。每个图像都是单通道(灰度),但我将它们以 .jpg 格式写入硬盘。硬盘中每张图片的大小约为 500Kbytes。
由于我在大约 20 毫秒内捕获一帧,因此我无法将它们全部实时写入硬盘。我已经使用 Qthread 编写了我的代码并创建了一个队列以查看是否有任何改进,但结果是相同的,这只是内存开销。
是否有可能改变这种情况,或者使用其他库更快地将这些图像写入硬盘?如果可用,我也更喜欢 Qt 解决方案...
另外我需要将每一帧都写入硬盘,所以请不要建议使用运动压缩算法,因为它们不适用于我的情况......
代码: 主窗口.cpp
Qlist<cv::Mat> FINAL_IM_VEC;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
IMREAD *IMR = new IMREAD(this); // an instance of IMREAD Class which reads camera frames
IMWRITE *IMW = new IMWRITE(this); // an instance of IMWRITE Class which Writes camera frames into hard disk
QThread *IMAGE_READ_Thread = new QThread(this);
QThread *Image_Store_Thread = new QThread(this);
connect(IMAGE_READ_Thread,SIGNAL(started()),IMR,SLOT(IMREAD_Process()));
connect(Image_Store_Thread,SIGNAL(started()),IMW,SLOT(IMWrite_Process()));
IMR.moveToThread(IMAGE_READ_Thread);
IMW.moveToThread(Image_Store_Thread);
IMAGE_READ_Thread->start();
Image_Store_Thread->start();
}
imread.hpp
class IMREAD : public QObject
{
Q_OBJECT
public:
explicit IMREAD(QObject *parent = 0);
signals:
public slots:
void IMREAD_Process();
private:
bool Stop;
};
imread.cpp
IMREAD::IMREAD(QObject *parent) :
QObject(parent)
{
this->Stop = false;
}
void IMREAD::IMREAD_Process()
{
while(!Stop)
{
cv::Mat Image = CAM::Campture_F(25);//wait a maximum of 25 milisecond to grab a new frame
if(Image.data())
{
FINAL_IM_VEC.push_back(Image);
}
}
}
}
imwrite.hpp
#ifndef IMWRITE_H
#define IMWRITE_H
#pragma once
#include <QObject>
class IMWRITE : public QObject
{
Q_OBJECT
public:
explicit IMWRITE(QObject *parent = 0);
signals:
public slots:
void IMWrite_Process();
private:
bool Stop;
};
imwrite.cpp
IMWRITE::IMWRITE(QObject *parent) :
QObject(parent)
{
this->Stop =false;
}
void IMWRITE::IMWrite_Process()
{
static int counter = 0;
while(!Stop)
{
for(int i = 0 ; i < FINAL_IM_VEC.size() ; i++)
{
QString address = "/home/Provisioner/ThreadT/Results/" + QString::number(counter++) + ".jpg";
cv::imwrite(address.toUtf8().constData(),FINAL_IM_VEC[i]);
FINAL_IM_VEC.erase(FINAL_IM_VEC.begin() + i);
i--;
}
}
}
由于这只是整个项目的一部分,我已经删除了一些不相关的部分......但它展示了我如何在大图中编写多线程代码......所以如果有任何问题请告知我。
提前致谢。
【问题讨论】:
-
"qt" 标签被移除,因为问题中没有 Qt 代码。
-
亲爱的 Laszlo 我使用了 qt 标签,因为我希望其他人提出 qt 函数而不是 opencv imwrite 函数 ....
-
然后,请在问题中写下您希望的内容。我无法读懂你的心思。 :)
-
@EmilioGaravaglia:您也应该扩展问题内容。不看cmets还是不清楚...
-
您没有声明:您需要 JPEG 输出吗?因为你的大部分时间都被压缩消耗了(或者你有一个 16 Mbyte/s 的驱动器)。图像流为 2048x1080x1x50 = 110 Mbyte/s。对于 2013 年,大多数旋转磁盘驱动器都可以支持该写入吞吐量。另存为 BMP。
标签: c++ qt opencv qthread qtcore