From a6b6d0e88915ca6317d9eda255061a88261bafc5 Mon Sep 17 00:00:00 2001 From: Jan Grewe Date: Mon, 16 Mar 2020 12:23:15 +0100 Subject: [PATCH] allow user to set buffer size and framerate --- grabber.cpp | 2 +- grabber.h | 12 +++++++++--- pylonrecorder.cpp | 36 +++++++++++++++++++++++++++++++----- pylonrecorder.h | 4 ++++ 4 files changed, 45 insertions(+), 9 deletions(-) diff --git a/grabber.cpp b/grabber.cpp index 4c70d09..bb2f5ac 100644 --- a/grabber.cpp +++ b/grabber.cpp @@ -10,7 +10,7 @@ void Grabber::run() { Pylon::CInstantCamera *cam = camera->getCamera(); cam->StartGrabbing(); while (!stop_request) { - camera->frameRate(50); + camera->frameRate(static_cast(framerate)); MyImage img; cam->RetrieveResult( 5000, frame, Pylon::TimeoutHandling_ThrowException); img.setFrame(frame); diff --git a/grabber.h b/grabber.h index 49c9695..7365da0 100644 --- a/grabber.h +++ b/grabber.h @@ -10,22 +10,28 @@ class Grabber : public QThread { Q_OBJECT public: - Grabber(PylonWrapper *camera, ImageBuffer*buffer, QObject *parent = nullptr) : - QThread(parent), camera(camera), buffer(buffer) {} + Grabber(PylonWrapper *camera, ImageBuffer*buffer, int framerate, QObject *parent = nullptr) : + QThread(parent), camera(camera), buffer(buffer), framerate(framerate) {} void run() override; void stop(); + int currentFramerate() { + return framerate; + } private: bool stop_request = false; PylonWrapper *camera; ImageBuffer *buffer; + int framerate; public slots: void requestStop() { stop_request=true; } - + void setFrameRate(int newFramerate) { + framerate = newFramerate; + } signals: void terminated(); }; diff --git a/pylonrecorder.cpp b/pylonrecorder.cpp index 86b42fa..f8904f4 100644 --- a/pylonrecorder.cpp +++ b/pylonrecorder.cpp @@ -42,8 +42,8 @@ PylonRecorder::PylonRecorder(QWidget *parent) setCentralWidget(scrollArea); pylon = new PylonWrapper(); - buffer = new ImageBuffer(1000); - grabber = new Grabber(pylon, buffer); + buffer = new ImageBuffer(defaultBufferSize); + grabber = new Grabber(pylon, buffer, defaultFrameRate); writer = new Writer(buffer); connect(writer, &Writer::writingDone, this, &PylonRecorder::writerDone); @@ -356,6 +356,23 @@ void PylonRecorder::createActions() { helpMenu->addAction(tr("&About"), this, &PylonRecorder::about); helpMenu->addAction(tr("About &Qt"), &QApplication::aboutQt); + + framerateSpinner = new QSpinBox(); + framerateSpinner->setRange(1, 120); + framerateSpinner->setSuffix("Hz"); + framerateSpinner->setFixedWidth(120); + framerateSpinner->setFixedHeight(30); + framerateSpinner->setValue(defaultFrameRate); + framerateSpinner->setStyleSheet("QSpinBox{font-size: 10px;font-family: Arial;color: rgb(0, 0, 0);background-color: rgb(255,255,255);}"); + //framerateSpinner->setStyleSheet("QSpinBox{font-size: 10px;font-family: Arial;color: rgb(255, 255, 255);background-color: rgb(38,56,76);}"); + + buffersizeSpinner = new QSpinBox(); + buffersizeSpinner->setRange(100, 5000); + buffersizeSpinner->setSingleStep(25); + buffersizeSpinner->setValue(defaultBufferSize); + buffersizeSpinner->setFixedSize(120, 30); + buffersizeSpinner->setStyleSheet("QSpinBox{font-size: 10px;font-family: Arial;color: rgb(0, 0, 0);background-color: rgb(255,255,255);}"); + QToolBar *toolbar = addToolBar("main toolbar"); toolbar->addAction(exitAct); toolbar->addSeparator(); @@ -365,6 +382,11 @@ void PylonRecorder::createActions() { toolbar->addAction(grab_still_action); toolbar->addAction(grab_continuous_action); toolbar->addAction(grab_stop_action); + toolbar->addSeparator(); + toolbar->addWidget(new QLabel("frame rate:")); + toolbar->addWidget(framerateSpinner); + toolbar->addWidget(new QLabel("buffer size:")); + toolbar->addWidget(buffersizeSpinner); } void PylonRecorder::updateActions() { @@ -440,6 +462,10 @@ void PylonRecorder::startRecording() { specs.pixelType = settings.pixelType; specs.orientation = settings.orientation; specs.quality = 95; + if (buffersizeSpinner->value() != static_cast(buffer->capacity())) + buffer->resize(static_cast(buffersizeSpinner->value())); + if (framerateSpinner->value() != grabber->currentFramerate()) + grabber->setFrameRate(framerateSpinner->value()); writer->setVideoSpecs(specs); buffer->clear(); grabber->start(); @@ -450,7 +476,7 @@ void PylonRecorder::startRecording() { preassureTimer->start(50); frameTimer->start(50); - labelTimer->start(333); + labelTimer->start(650); updateActions(); } @@ -470,8 +496,8 @@ void PylonRecorder::writerDone() { preassureBar->reset(); loadBar->reset(); labelTimer->stop(); - writingLabel->setEnabled(false); - grabbingLabel->setEnabled(false); + writingLabel->setStyleSheet(inactiveLabelStyle); + grabbingLabel->setStyleSheet(inactiveLabelStyle); grabber->wait(10000); writer->wait(10000); writing = false; diff --git a/pylonrecorder.h b/pylonrecorder.h index 2a6fedf..5e1b56a 100644 --- a/pylonrecorder.h +++ b/pylonrecorder.h @@ -3,6 +3,8 @@ #include #include +#include + #include "pylonwrapper.h" #include "imagebuffer.h" #include "grabber.h" @@ -72,6 +74,7 @@ private: void applyScaling(); void adjustScrollBar(QScrollBar *scrollBar, double factor); + int defaultBufferSize = 1000, defaultFrameRate = 50; QImage image; QTimer *frameTimer, *preassureTimer, *labelTimer; QLabel *imageLabel, *writingLabel, *grabbingLabel, *cameraConnectedLabel; @@ -88,6 +91,7 @@ private: QString activeLabelStyleHigh = "QLabel { color : red; }"; QString activeLabelStyleLow = "QLabel { color : cmyk(0, 255, 255, 0, 50); }"; QString inactiveLabelStyle = ("QLabel { color :gray; }"); + QSpinBox *framerateSpinner, *buffersizeSpinner; #if defined(QT_PRINTSUPPORT_LIB) && QT_CONFIG(printer)