From 3288a934a44b58d09535b70568a96d22ea9724fc Mon Sep 17 00:00:00 2001 From: Hiro Protagonist Date: Thu, 23 Mar 2017 15:55:49 +1300 Subject: [PATCH] Image Grabber as async image grabber for custom memory management. --- Taevitas.pro | 6 +++-- Taevitas.pro.user | 2 +- notes.md | 2 ++ src/cameramanager.cpp | 53 +++++++++++++++++++++++-------------------- src/cameramanager.h | 16 +++++++++---- src/imagegrabber.cpp | 25 ++++++++++++++++++++ src/imagegrabber.h | 27 ++++++++++++++++++++++ 7 files changed, 100 insertions(+), 31 deletions(-) create mode 100644 src/imagegrabber.cpp create mode 100644 src/imagegrabber.h diff --git a/Taevitas.pro b/Taevitas.pro index 71373cb..3704bea 100644 --- a/Taevitas.pro +++ b/Taevitas.pro @@ -26,11 +26,13 @@ DEFINES += QT_DEPRECATED_WARNINGS SOURCES += src/main.cpp\ src/mainwindow.cpp\ src/cameramanager.cpp\ - src/recorder.cpp + src/recorder.cpp \ + src/imagegrabber.cpp HEADERS += src/mainwindow.h\ src/cameramanager.h\ - src/recorder.h + src/recorder.h \ + src/imagegrabber.h FORMS += src/forms/mainwindow.ui diff --git a/Taevitas.pro.user b/Taevitas.pro.user index 6db51d4..3781b67 100644 --- a/Taevitas.pro.user +++ b/Taevitas.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/notes.md b/notes.md index 6da1da9..38e76f8 100644 --- a/notes.md +++ b/notes.md @@ -5,3 +5,5 @@ Recorder: Maybe Split Recorder and Manager UP -> DONE Flexible buffer size, options for serial + +Make image grabber nicer diff --git a/src/cameramanager.cpp b/src/cameramanager.cpp index ea6a957..2f81c3c 100644 --- a/src/cameramanager.cpp +++ b/src/cameramanager.cpp @@ -5,14 +5,17 @@ using namespace FlyCapture2; CameraManager::CameraManager(QObject *parent) : QObject(parent), num_cameras {0}, camera_index {-1}, is_capturing {false} { + image_buffer = new QVector(); } CameraManager::~CameraManager() { + delete image_buffer; + stopCapture(); camera.Disconnect(); } -void CameraManager::connectCamera(unsigned int index) { +void CameraManager::connectCamera(int index) { // Don't connect twice. if(camera_index == index) return; @@ -46,22 +49,23 @@ void CameraManager::connectCamera(unsigned int index) { // Do not drop frames! //TODO Flexible Buffer size cam_config = FlyCapture2::FC2Config(); cam_config.grabMode = GrabMode::BUFFER_FRAMES; - cam_config.numBuffers= 50; + cam_config.numBuffers = 10; // We gonna move them into our own data structure. cam_config.highPerformanceRetrieveBuffer = true; - camera_index = index; - camera.SetConfiguration(&cam_config); + + camera_index = index; } // The capture callback is a wrapper to emit the frameCaptured signal. -void CameraManager::captureCallback(FlyCapture2::Image* image, const void *camManager) { +void CameraManager::imageGrabbed(FlyCapture2::Image *image) { //thread Safe static QMutex mutex; mutex.lock(); - if(camManager) { - static_cast(camManager)->frameCaptured(image); - } + image_buffer->append(image); + emit frameCaptured(image_buffer->front()); + delete image_buffer->front(); + image_buffer->removeFirst(); mutex.unlock(); return; @@ -71,13 +75,8 @@ void CameraManager::stopCapture() { if(!is_capturing) return; - Error error; - error = camera.StopCapture(); - - if(error != PGRERROR_OK) { - throw error; - return; - } + grabber->stopCapturing(); + camera.StopCapture(); is_capturing = false; } @@ -85,17 +84,23 @@ void CameraManager::stopCapture() { void CameraManager::startCapture() { // Don't capture twice! if(is_capturing) - return; + return; - // Just a wrapper for the PTGrey method. Let all the errors be generated by the FlyCapture method. - // TODO: Evtl try to connect to first camera... - Error error; - error = camera.StartCapture(captureCallback, this); + Error error; + error = camera.StartCapture(); - if(error != PGRERROR_OK) { - throw error; - return; - } + if(error != PGRERROR_OK) { + throw error; + return; + } + + // Just my own async image grabbing! + // TODO: ERRORS! + grabber = new ImageGrabber(this); + grabber->setCamera(&camera); + connect(grabber, &ImageGrabber::imageCaptured, this, &CameraManager::imageGrabbed, Qt::QueuedConnection); + connect(grabber, &ImageGrabber::finished, grabber, &ImageGrabber::deleteLater); + grabber->start(); is_capturing = true; } diff --git a/src/cameramanager.h b/src/cameramanager.h index 63357a1..44c4b9a 100644 --- a/src/cameramanager.h +++ b/src/cameramanager.h @@ -10,7 +10,10 @@ // TODO: Exclude inline Implementation // TODO: implement camera arrival removal #include +#include +#include #include "FlyCapture2.h" +#include "imagegrabber.h" class CameraManager : public QObject { @@ -43,7 +46,7 @@ public: // Connect camera from index. Once successfull it emits the cameraConnected signal. // Emits Error signal in case of an error. - void connectCamera(unsigned int); + void connectCamera(int); bool isCapturing() { return is_capturing; @@ -61,12 +64,17 @@ private: // Index of the current camera int camera_index; - // Just a littile wrapper function around the callback function for the camera capture to emit signals. - static inline void captureCallback(FlyCapture2::Image*, const void *); - // State Variable bool is_capturing; + QVector *image_buffer; + + // Capture Thread + ImageGrabber *grabber; + +private slots: + void imageGrabbed(FlyCapture2::Image *image); + signals: void frameCaptured(FlyCapture2::Image* image) const; }; diff --git a/src/imagegrabber.cpp b/src/imagegrabber.cpp new file mode 100644 index 0000000..2738cab --- /dev/null +++ b/src/imagegrabber.cpp @@ -0,0 +1,25 @@ +#include "imagegrabber.h" +#include + +void ImageGrabber::run() { + qDebug() << "Starting Capture."; + capture = true; + while(capture) { + FlyCapture2::Image* tmp = new FlyCapture2::Image(); + FlyCapture2::Image* stored_img = new FlyCapture2::Image(); + + cam->RetrieveBuffer(tmp); + tmp->DeepCopy(stored_img); + emit imageCaptured(stored_img); + } +} + +void ImageGrabber::setCamera(FlyCapture2::Camera *cam) { + this->cam = cam; +} + +void ImageGrabber::stopCapturing() { + qDebug() << "Stopping Capture."; + capture = false; +} + diff --git a/src/imagegrabber.h b/src/imagegrabber.h new file mode 100644 index 0000000..c72719a --- /dev/null +++ b/src/imagegrabber.h @@ -0,0 +1,27 @@ +#ifndef IMAGEGRABBER_H +#define IMAGEGRABBER_H + +#include +#include "FlyCapture2.h" + +class ImageGrabber : public QThread +{ + Q_OBJECT + +public: + ImageGrabber(QObject *parent = 0) : QThread(parent) {} + void run() Q_DECL_OVERRIDE; + void setCamera(FlyCapture2::Camera *cam); + +private: + bool capture; + FlyCapture2::Camera *cam; + +signals: + void imageCaptured(FlyCapture2::Image *image); + +public slots: + void stopCapturing(); +}; + +#endif // IMAGEGRABBER_H