#include "dualcamgrabber.h" #include #include #include #include using namespace std::chrono; typedef high_resolution_clock Time; typedef milliseconds ms; typedef duration fsec; void DualcamGrabber::run() { stop_request = false; size_t counter = 0; if (!wrapper->isOpen()) { return; } Pylon::CInstantCameraArray &cameras = wrapper->getCameraArray(); wrapper->frameRate(static_cast(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(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(done - before); } cameras.StopGrabbing(); }