Subversion Repositories seema-scanner

Rev

Rev 24 | Rev 26 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include "SMScanner.h"
#include "ui_SMScanner.h"

#include "SMCalibrator.h"

#include <QMetaObject>

SMScanner::SMScanner(QWidget *parent) :QMainWindow(parent), ui(new Ui::SMScanner), calibrationReviewMode(false){
    ui->setupUi(this);

    // Restore geometry
    this->restoreGeometry(settings.value("geometry/mainwindow").toByteArray());
    this->restoreState(settings.value("state/mainwindow").toByteArray());

    // Set up threads
    captureWorker = new SMCaptureWorker;
    captureWorkerThread = new QThread(this);
    captureWorkerThread->setObjectName("captureWorkerThread");
    captureWorker->moveToThread(captureWorkerThread);
    captureWorkerThread->start();

    // Connections
    qRegisterMetaType<cv::Mat>("cv::Mat");
    qRegisterMetaType< std::vector<cv::Mat> >("std::vector<cv::Mat>");
    qRegisterMetaType<CalibrationSet>("CalibrationSet");
    connect(captureWorker, SIGNAL(newFrame(unsigned int, cv::Mat)), this, SLOT(onReceiveFrame(unsigned int, cv::Mat)));
    connect(captureWorker, SIGNAL(newCalibrationSet(CalibrationSet)), this, SLOT(onReceiveCalibrationSet(CalibrationSet)));

    // Start capturing
    QMetaObject::invokeMethod(captureWorker, "setup");
    QMetaObject::invokeMethod(captureWorker, "doWork");

}

void SMScanner::onReceiveFrame(unsigned int camId, cv::Mat frame){

    if(camId == 0){
        if(!calibrationReviewMode)
            ui->calibrationCamera0Widget->showImageCV(frame);
        ui->captureCamera0Widget->showImageCV(frame);
    } else if(camId == 1){
        if(!calibrationReviewMode)
            ui->calibrationCamera1Widget->showImageCV(frame);
        ui->captureCamera1Widget->showImageCV(frame);
    }
}

void SMScanner::on_actionPreferences_triggered(){

    preferenceDialog.show();
}

void SMScanner::closeEvent(QCloseEvent *event){

    // Stop capturing thread
    connect(captureWorker, SIGNAL(finished()), captureWorker, SLOT(deleteLater()));
    connect(captureWorker, SIGNAL(finished()), captureWorkerThread, SLOT(quit()));
    QMetaObject::invokeMethod(captureWorker, "stopWork");
    captureWorkerThread->quit();
    captureWorkerThread->wait();

    // Save window geometry
    settings.setValue("geometry/mainwindow", this->saveGeometry());
    settings.setValue("state/mainwindow", this->saveState());

    event->accept();

}

SMScanner::~SMScanner(){
    delete ui;
}

void SMScanner::on_singleCalibrationButton_clicked(){

    // If in review mode, go back to aquisition mode
    if(calibrationReviewMode){
        ui->singleCalibrationButton->setText("Single Aquisition");
        ui->batchCalibrationButton->setText("Batch Aquisition");
        calibrationReviewMode = false;
        return;
    }

    float position = ui->calibrationRotationDial->value();
    QMetaObject::invokeMethod(captureWorker, "acquireCalibrationSet", Q_ARG(float, position));

}

void SMScanner::on_calibrationRotationDial_sliderReleased(){
    float angle = ui->calibrationRotationDial->value();
    std::cout << "Rotation stage target: " << angle << std::endl;
    QMetaObject::invokeMethod(captureWorker, "rotateTo", Q_ARG(float, angle));
}

void SMScanner::onReceiveCalibrationSet(CalibrationSet calibrationSet){
    calibrationData.push_back(calibrationSet);

    // Add identifier to list
    QListWidgetItem* item = new QListWidgetItem(QString("Set %1").arg(ui->calibrationListWidget->count()), ui->calibrationListWidget);
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
    item->setCheckState(Qt::Checked);
    ui->calibrationListWidget->addItem(item);

    // Set enabled checkmark
    if(calibrationData.size() >= 2)
        ui->calibrateButton->setEnabled(true);
}

void SMScanner::on_calibrationListWidget_currentRowChanged(int currentRow){

    calibrationReviewMode = true;
    ui->singleCalibrationButton->setText("Live View");
    ui->batchCalibrationButton->setText("Live View");

    if(!calibrationData[currentRow].frame0Result.empty())
        ui->calibrationCamera0Widget->showImageCV(calibrationData[currentRow].frame0Result);
    else
        ui->calibrationCamera0Widget->showImageCV(calibrationData[currentRow].frame0);

    if(!calibrationData[currentRow].frame1Result.empty())
        ui->calibrationCamera1Widget->showImageCV(calibrationData[currentRow].frame1Result);
    else
        ui->calibrationCamera1Widget->showImageCV(calibrationData[currentRow].frame1);
}

void SMScanner::on_calibrateButton_clicked(){

    // set checked flags
    for(int i=0; i<calibrationData.size(); i++){
        calibrationData[i].checked = (ui->calibrationListWidget->item(i)->checkState() == Qt::Checked);
    }

    SMCalibrator calibrator;
    calibrator.performCalibration(calibrationData);

}