Blame | Last modification | View Log | RSS feed
#include <QCoreApplication>
#include <QDir>
#include "SMExportWorker.h"
#include "cvtools.h"
#define PNG_COMPRESSION_LEVEL 1
// Level from 0 - 9 (lowest to highest)
// 1 is default, 9 is *very slow*
void SMExportWorker::abort() {
was_aborted = true;
}
void SMExportWorker::exportFrameSequence(QString path, SMFrameSequence seq) {
paths.push_back(path);
seqs.push_back(seq);
}
void SMExportWorker::work() {
if (working)
return;
working = true;
std::vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
compression_params.push_back(PNG_COMPRESSION_LEVEL);
while(seqs.size() > 0) {
QString path = paths.front(); paths.pop_front();
SMFrameSequence seq = seqs.front(); seqs.pop_front();
if (seq.frames0.size() == 0 || path == QString()) {
emit aborted();
continue;
}
path = QString("%1/sequence_%2").arg(path).arg(seq.id);
if(!QDir().mkdir(path))
std::cerr << "Could not create directory " << path.toStdString() << std::endl;
bool HDR = (seq.frames0[0].depth() == CV_32F);
QString format;
if (HDR) format = "hdr";
else format = "png";
cv::Mat frameBGR;
for(unsigned int i=0; i < seq.frames0.size(); ++i){
emit progressUpdate(100.0 * i / seq.frames0.size());
QString fileName0 = QString("%1/frames0_%2.%3").arg(path).arg(i).arg(format);
QString fileName1 = QString("%1/frames1_%2.%3").arg(path).arg(i).arg(format);
// Convert rgb (png needs BGR order)
if (HDR) {
cv::cvtColor(seq.frames0[i], frameBGR, CV_RGB2BGR);
cv::imwrite(fileName0.toStdString(), frameBGR, compression_params);
cv::cvtColor(seq.frames1[i], frameBGR, CV_RGB2BGR);
cv::imwrite(fileName1.toStdString(), frameBGR, compression_params);
}
else {
cv::cvtColor(seq.frames0[i], frameBGR, CV_BayerBG2BGR);
cv::imwrite(fileName0.toStdString(), frameBGR, compression_params);
cv::cvtColor(seq.frames1[i], frameBGR, CV_BayerBG2BGR);
cv::imwrite(fileName1.toStdString(), frameBGR, compression_params);
}
// Necessary to enable aborting!
QCoreApplication::processEvents();
if (was_aborted) {
emit aborted();
was_aborted = false;
working = false;
return;
}
}
emit finished(seq.id);
QCoreApplication::processEvents();
}
working = false;
}