PylonRecorder/dualcamgrabber.cpp

86 lines
2.6 KiB
C++

#include "dualcamgrabber.h"
#include <iostream>
#include <pylon/PylonIncludes.h>
#include <stitchimage.h>
#include <chrono>
using namespace std::chrono;
typedef high_resolution_clock Time;
typedef milliseconds ms;
typedef duration<float> fsec;
void DualcamGrabber::run() {
stop_request = false;
size_t counter = 0;
if (!wrapper->isOpen()) {
return;
}
Pylon::CInstantCameraArray &cameras = wrapper->getCameraArray();
wrapper->frameRate(static_cast<uint>(100), -1);
wrapper->exposureTime(exposure);
wrapper->gain(gain);
wrapper->enableSoftwareTrigger(0);
wrapper->enableSoftwareTrigger(1);
cameras.StartGrabbing();
Pylon::CGrabResultPtr frame0, frame1;
Pylon::CPylonImage leftImage;
Pylon::CPylonImage rightImage;
Pylon::CPylonImage stitchedImage;
std::string errorMessage = "";
bool failure = false;
auto before = high_resolution_clock::now();
auto done = high_resolution_clock::now();
auto total_duration = duration_cast<microseconds>(done - before);
int expected_usecs = (int)(1./framerate * 1000000);
while (cameras.IsGrabbing() && !stop_request && !failure) {
if (counter > 0) {
long delay = total_duration.count() - expected_usecs;
if (delay > 0) {
emit delayed(delay, counter-1);
} else {
usleep(-delay);
}
}
before = high_resolution_clock::now();
if (cameras[0].WaitForFrameTriggerReady(1000, Pylon::TimeoutHandling_ThrowException) &&
cameras[1].WaitForFrameTriggerReady(1000, Pylon::TimeoutHandling_ThrowException)) {
// std::cerr << "executing software triggers" << std::endl;
cameras[0].ExecuteSoftwareTrigger();
cameras[1].ExecuteSoftwareTrigger();
}
try {
cameras[0].RetrieveResult( 5000, frame0, Pylon::TimeoutHandling_ThrowException );
cameras[1].RetrieveResult( 5000, frame1, Pylon::TimeoutHandling_ThrowException );
leftImage.AttachGrabResultBuffer( frame0 );
rightImage.AttachGrabResultBuffer( frame1 );
} catch( const Pylon::GenericException &e ) {
qDebug() << "Grabbing frame failed! " << e.what();
failure = true;
}
if (!failure && leftImage.IsValid() && rightImage.IsValid()) {
try {
StitchImage::StitchToRight(leftImage, rightImage, &stitchedImage, errorMessage);
MyImage *img = new MyImage(stitchedImage.GetWidth(), stitchedImage.GetHeight());
img->setFrame(stitchedImage);
buffer->push(img);
} catch(const std::exception& e) {
std::cerr << e.what() << '\n';
}
}
counter += 1;
done = high_resolution_clock::now();
total_duration = duration_cast<microseconds>(done - before);
}
cameras.StopGrabbing();
}