Rev 20 | 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 cameras
QSettings settings;
int iNum0 = settings.value("camera0/interfaceNumber", -1).toInt();
int cNum0 = settings.value("camera0/cameraNumber", -1).toInt();
if(iNum0 != -1)
camera0 = Camera::NewCamera(iNum0,cNum0);
int iNum1 = settings.value("camera1/interfaceNumber", -1).toInt();
int cNum1 = settings.value("camera1/cameraNumber", -1).toInt();
if(iNum1 != -1)
camera1 = Camera::NewCamera(iNum1,cNum1);
// Set camera settings
CameraSettings cameraSettings;
cameraSettings.shutter = settings.value("camera/shutter", 16.666).toFloat();
cameraSettings.gain = 0.0;
camera0->setCameraSettings(cameraSettings);
camera1->setCameraSettings(cameraSettings);
// Read trigger configuration
QString sTriggerMode = settings.value("trigger/mode", "Hardware").toString();
if(sTriggerMode == "hardware")
triggerMode = triggerModeHardware;
else if(sTriggerMode == "software")
triggerMode = triggerModeSoftware;
else
std::cerr << "SLScanWorker: invalid trigger mode " << sTriggerMode.toStdString() << std::endl;
}
void SMCaptureWorker::doWork(){
unsigned int k=0;
QTime time; time.start();
isWorking = true;
if(triggerMode == triggerModeHardware){
camera0->startCapture();
camera1->startCapture();
}
std::vector<Camera*> cameras;
cameras.push_back(camera0);
cameras.push_back(camera1);
// Processing loop
while(isWorking){
std::vector<cv::Mat> frameSet;
CameraFrame frame;
for(int c=0; c<2; c++){
if(triggerMode == triggerModeHardware)
frame = cameras[c]->lockFrame();
else
frame = cameras[c]->getSingleFrame();
cv::Mat frameCV(frame.height, frame.width, CV_8U, frame.memory);
frameCV = frameCV.clone();
frameSet.push_back(frameCV);
}
//QTest::qSleep(50);
// Pass frame sequence to decoder
emit newFrameSet(frameSet);
// Increase iteration counter
k += 1;
std::cout << "Capture worker " << time.restart() << "ms" << std::endl;
// cv::imwrite("frameSet0.png",frameSet[0]);
// cv::imwrite("frameSet1.png",frameSet[1]);
// Process events e.g. check for exit flag
QCoreApplication::processEvents();
}
if(triggerMode == triggerModeHardware){
for(unsigned int i=0; i<cameras.size(); i++){
cameras[i]->stopCapture();
}
}
// Emit message to e.g. initiate thread break down
emit finished();
}
void SMCaptureWorker::stopWorking(){
isWorking = false;
}
SMCaptureWorker::~SMCaptureWorker(){
delete camera0;
delete camera1;
}