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