From 47ea6fb27e344e2bd60eadf41cc68cbb220f0af7 Mon Sep 17 00:00:00 2001 From: Jan Grewe Date: Fri, 8 Mar 2024 09:13:48 +0100 Subject: [PATCH] a bit of cleanup and x,y offset to VideoSpecs --- imagebuffer.cpp | 8 +----- pylonrecorder.cpp | 69 ++++++++++++++++++++++++++++++++++++++--------- pylonrecorder.h | 3 ++- writer.h | 3 ++- 4 files changed, 61 insertions(+), 22 deletions(-) diff --git a/imagebuffer.cpp b/imagebuffer.cpp index bed161c..eef78d3 100644 --- a/imagebuffer.cpp +++ b/imagebuffer.cpp @@ -8,20 +8,14 @@ ImageBuffer::ImageBuffer(size_t buffer_size, QObject *parent) : QObject(parent), } void ImageBuffer::clear() { - std::cerr << "Clear Image buffer!" << std::endl; + // std::cerr << "Clear Image buffer!" << std::endl; for (auto & img: buffer) { - std::cerr << "Clear Image buffer!" << std::endl; - if (img != nullptr) delete(img); img = nullptr; } - std::cerr << "Clear Image buffer!" << std::endl; - resize(buffer_size); - std::cerr << "Clear Image buffer! done" << std::endl; - } size_t ImageBuffer::capacity() { diff --git a/pylonrecorder.cpp b/pylonrecorder.cpp index 0af1573..877bb10 100644 --- a/pylonrecorder.cpp +++ b/pylonrecorder.cpp @@ -32,9 +32,8 @@ #endif PylonRecorder::PylonRecorder(QWidget *parent) - : QMainWindow(parent), imageLabel(new QLabel), scrollArea(new QScrollArea), grabber(nullptr), writer(nullptr), buffer(nullptr), pyloncam(nullptr) + : QMainWindow(parent), imageLabel(new QLabel), scrollArea(new QScrollArea), grabber(nullptr), writer(nullptr), buffer(nullptr), pyloncam(nullptr), dryRun(false), cameraOpened(false) { - dryRun = false; imageLabel->setBackgroundRole(QPalette::Base); imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); imageLabel->setScaledContents(true); @@ -562,7 +561,7 @@ void PylonRecorder::updateActions() { disconnect_camera_action->setEnabled(deviceList.size() > 0); connect_camera_action->setEnabled(true); grab_still_action->setEnabled(deviceList.size() > 0); - //grab_continuous_action->setEnabled(deviceList.size() > 0 && pyloncam->isOpen() && !grabbing); + grab_continuous_action->setEnabled(cameraOpened && !grabbing); grab_stop_action->setEnabled(grabbing); } @@ -612,13 +611,14 @@ void PylonRecorder::cameraConfiguration(){ } void PylonRecorder::camerasetup() { - qDebug() << "Cameras setting " << ((d->result()) ? "Accepted" : "Dicarded"); + qDebug() << "Cameras setting " << ((d->result()) ? "Accepted" : "Discarded"); this->layout = d->layout(); delete d; } void PylonRecorder::connectCamera() { this->layout = CameraLayout(); + std::cerr << this->layout.rois.size() << " " << this->layout.devices.size() << std::endl; qDebug() << "connecting camera(s)"; if (deviceList.size() == 0) { detectCameras(); @@ -638,11 +638,13 @@ void PylonRecorder::connectCamera() { if (success) { cameraConnectedLabel->setText("connected"); cameraConnectedLabel->setStyleSheet("QLabel { font-size: 10px;font-family: Arial;color: green;}"); + cameraOpened = true; } else { QMessageBox msgBox; QString msg = "

Could not open camera device!

" + QString::fromStdString(message) + "

"; msgBox.setText(msg); msgBox.exec(); + cameraOpened = false; } statusBar()->showMessage(QString::fromStdString(message)); updateActions(); @@ -664,32 +666,73 @@ void PylonRecorder::disconnectCamera() { qDebug() << "disconnecting cameras done"; } +VideoSpecs PylonRecorder::getVideoSpecs(const ImageSettings &settings) { + VideoSpecs s = VideoSpecs(); + if (this->layout.mode == CameraMode::single && this->layout.devices.size() > 0) { + s.fps = framerateSpinner->value(); + s.exposureTime = static_cast(exposureSpinner->value()); + s.detectorGain = static_cast(gainSpinner->value()); + s.width = static_cast(this->layout.rois[0].width); + s.height = static_cast(this->layout.rois[0].height); + s.xoffset = static_cast(this->layout.rois[0].x); + s.yoffset = static_cast(this->layout.rois[0].y); + + s.pixelType = settings.pixelType; + s.orientation = settings.orientation; + s.quality = 95; + } else { + qWarning() << "Dual camera mode not supported yet!"; + } + return s; +} void PylonRecorder::startRecording() { + qDebug() << "start recording!"; std::string filename = createFilename(); fileLabel->setText(QString::fromStdString(filename)); + qDebug() << "storing to file " << filename.c_str(); + ImageSettings settings = pyloncam->getImageSettings(); + qDebug() << "got image settings"; - VideoSpecs specs; - specs.fps = framerateSpinner->value(); + VideoSpecs specs = getVideoSpecs(settings); specs.filename = filename; - specs.exposureTime = static_cast(exposureSpinner->value()); - specs.detectorGain = static_cast(gainSpinner->value()); - specs.width = static_cast(settings.width); - specs.height= static_cast(settings.height); - specs.pixelType = settings.pixelType; - specs.orientation = settings.orientation; - specs.quality = 95; + qDebug() << "got video specifications"; + + if (buffer != nullptr) { + buffer->clear(); + delete buffer; + buffer = nullptr; + } + qDebug() << "setting image buffer to size " << buffersizeSpinner->value(); + buffer = new ImageBuffer(defaultBufferSize); if (buffersizeSpinner->value() != static_cast(buffer->capacity())) { buffer->resize(static_cast(buffersizeSpinner->value())); loadBar->setRange(0, buffersizeSpinner->value()); } + + qDebug() << "setting up grabber"; + if (grabber != nullptr) { + delete grabber; + grabber = nullptr; + } + grabber = new Grabber(pyloncam, buffer, defaultFrameRate); + if (framerateSpinner->value() != grabber->currentFramerate()) grabber->setFrameRate(framerateSpinner->value()); if (exposureSpinner->value() != int(grabber->currentExposureTime())) grabber->setExposureTime(static_cast(exposureSpinner->value())); if (gainSpinner->value() != int(grabber->currentGain())) grabber->setGain(static_cast(gainSpinner->value())); + + qDebug() << "setup writer"; + if (writer != nullptr) { + delete writer; + writer = nullptr; + } + writer = new Writer(buffer); + connect(writer, &Writer::writingDone, this, &PylonRecorder::writerDone); + writer->setVideoSpecs(specs); QSettings s; this->mdata.read(s); diff --git a/pylonrecorder.h b/pylonrecorder.h index cb8e6a8..7bd7832 100644 --- a/pylonrecorder.h +++ b/pylonrecorder.h @@ -80,6 +80,7 @@ private: QColor progressColor(int value); std::string createFilename(); void cameraConfiguration(); + VideoSpecs getVideoSpecs(const ImageSettings &settings); bool saveFile(const QString &fileName); void setImage(const QImage &newImage); @@ -103,7 +104,7 @@ private: Grabber *grabber; Writer *writer; CameraLayout layout; - bool grabbing, stopRequest, writing, labelSwitch, dryRun; + bool grabbing, stopRequest, writing, labelSwitch, dryRun, cameraOpened; QPalette progressPalette; QString activeLabelStyleHigh = "QLabel { font-size: 10pt;font-family: Arial; color : red; }"; QString activeLabelStyleLow = "QLabel { font-size: 10pt;font-family: Arial; color : cmyk(0, 255, 255, 0, 50); }"; diff --git a/writer.h b/writer.h index 161dad7..c8e2fde 100644 --- a/writer.h +++ b/writer.h @@ -13,7 +13,8 @@ struct VideoSpecs { std::string filename; - uint32_t width, height, quality = 10 ; + uint32_t width, height, quality = 10; + uint32_t xoffset, yoffset = 0; int fps; double exposureTime; double detectorGain;