Subversion Repositories seema-scanner

Rev

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

#include "SMCaptureWorker.h"

#include <QCoreApplication>
#include <QTime>
#include <QSettings>

void SMCaptureWorker::setup(){

    // Create projector
    QSettings settings;
    int screenNum = settings.value("projector/screenNumber", -1).toInt();
    if(screenNum != -1)
        projector = new ProjectorOpenGL(screenNum);

    // Create cameras
    int iNum0 = settings.value("camera0/interfaceNumber", -1).toInt();
    int cNum0 = settings.value("camera0/cameraNumber", -1).toInt();
    if(iNum0 != -1)
        camera0 = Camera::NewCamera(iNum0,cNum0,triggerModeSoftware);

    int iNum1 = settings.value("camera1/interfaceNumber", -1).toInt();
    int cNum1 = settings.value("camera1/cameraNumber", -1).toInt();
    if(iNum1 != -1)
        camera1 = Camera::NewCamera(iNum1,cNum1,triggerModeSoftware);

    // Set camera settings
    CameraSettings cameraSettings;
    cameraSettings.shutter = settings.value("camera/shutter", 16.666).toFloat();
    cameraSettings.gain = 0.0;

    camera0->setCameraSettings(cameraSettings);
    camera1->setCameraSettings(cameraSettings);

    // Start capturing
    camera0->startCapture();
    camera1->startCapture();

    // Create rotation stage
    rotationStage = new RotationStage();
}


void SMCaptureWorker::doWork(){

    projector->displayWhite();

    working = true;

    // Processing loop
    QTime time;
    time.start();
    while(working){

        std::vector<cv::Mat> frameSet;

        CameraFrame frame;

        // trigger cameras
        camera0->trigger();
        camera1->trigger();

        // retrieve frames
        frame = camera0->getFrame();
        cv::Mat frameCV;
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
        frameCV = frameCV.clone();
        frameSet.push_back(frameCV);

        emit newFrame(0, frameCV);

        frame = camera1->getFrame();
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
        frameCV = frameCV.clone();
        frameSet.push_back(frameCV);

        emit newFrame(1, frameCV);

        //std::cout << "SMCaptureWorker idle " << time.restart() << "ms" << std::endl;

        // Process events e.g. perform a task
        QCoreApplication::processEvents();
    }

    emit finished();
}

void SMCaptureWorker::rotateTo(float angle){

    std::cout << "Moving to: " << angle << std::endl;
    rotationStage->moveAbsolute(angle);
    rotationStage->wait();
}

void SMCaptureWorker::acquireCalibrationSet(float angle){
    rotateTo(angle);

    CameraFrame frame;
    CalibrationSet calibrationSet;

    // trigger cameras
    camera0->trigger();
    camera1->trigger();

    // retrieve frames
    frame = camera0->getFrame();
    cv::Mat frameCV;
    frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
    frameCV = frameCV.clone();

    calibrationSet.frame0 = frameCV;

    frame = camera1->getFrame();
    frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
    frameCV = frameCV.clone();

    calibrationSet.frame1 = frameCV;

    calibrationSet.rotationAngle = angle;

    emit newCalibrationSet(calibrationSet);
}

void SMCaptureWorker::acquireCalibrationSets(std::vector<float> angles){}

void SMCaptureWorker::acquireFrameSequence(float angle){}
void SMCaptureWorker::acquireFrameSequences(std::vector<float> angles){}

void SMCaptureWorker::abort(){}

void SMCaptureWorker::stopWork(){
    working = false;
}

SMCaptureWorker::~SMCaptureWorker(){
    delete projector;
    delete camera0;
    delete camera1;
    delete rotationStage;
}