Subversion Repositories seema-scanner

Rev

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;
}