mirror of
https://github.com/vale981/Taevitas
synced 2025-03-05 09:31:42 -05:00
Image Grabber as async image grabber for custom memory management.
This commit is contained in:
parent
56ebb20342
commit
3288a934a4
7 changed files with 100 additions and 31 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE QtCreatorProject>
|
||||
<!-- Written by QtCreator 4.2.1, 2017-03-21T20:27:33. -->
|
||||
<!-- Written by QtCreator 4.2.1, 2017-03-23T15:54:31. -->
|
||||
<qtcreator>
|
||||
<data>
|
||||
<variable>EnvironmentId</variable>
|
||||
|
|
2
notes.md
2
notes.md
|
@ -5,3 +5,5 @@ Recorder:
|
|||
Maybe Split Recorder and Manager UP -> DONE
|
||||
|
||||
Flexible buffer size, options for serial
|
||||
|
||||
Make image grabber nicer
|
||||
|
|
|
@ -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<FlyCapture2::Image *>();
|
||||
}
|
||||
|
||||
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<const CameraManager*>(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;
|
||||
}
|
||||
|
|
|
@ -10,7 +10,10 @@
|
|||
// TODO: Exclude inline Implementation
|
||||
// TODO: implement camera arrival removal
|
||||
#include <QObject>
|
||||
#include <QVector>
|
||||
#include <QThread>
|
||||
#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<FlyCapture2::Image *> *image_buffer;
|
||||
|
||||
// Capture Thread
|
||||
ImageGrabber *grabber;
|
||||
|
||||
private slots:
|
||||
void imageGrabbed(FlyCapture2::Image *image);
|
||||
|
||||
signals:
|
||||
void frameCaptured(FlyCapture2::Image* image) const;
|
||||
};
|
||||
|
|
25
src/imagegrabber.cpp
Normal file
25
src/imagegrabber.cpp
Normal file
|
@ -0,0 +1,25 @@
|
|||
#include "imagegrabber.h"
|
||||
#include <QDebug>
|
||||
|
||||
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;
|
||||
}
|
||||
|
27
src/imagegrabber.h
Normal file
27
src/imagegrabber.h
Normal file
|
@ -0,0 +1,27 @@
|
|||
#ifndef IMAGEGRABBER_H
|
||||
#define IMAGEGRABBER_H
|
||||
|
||||
#include <QThread>
|
||||
#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
|
Loading…
Add table
Reference in a new issue