Compare commits

...

6 Commits

14 changed files with 123 additions and 78 deletions

View File

@@ -65,7 +65,7 @@ void CameraPreview::setCamera(QString &device){
delete camera; delete camera;
camera = nullptr; camera = nullptr;
} }
camera = new PylonWrapper(cameraname.toStdString()); camera = new SingleCamWrapper(cameraname.toStdString());
std::string message; std::string message;
bool success = camera->openCamera(message); bool success = camera->openCamera(message);
if (!success) { if (!success) {

View File

@@ -12,7 +12,7 @@
#include <QPainter> #include <QPainter>
#include <pylon/PylonIncludes.h> #include <pylon/PylonIncludes.h>
#include "pylonwrapper.h" #include "singlecamwrapper.h"
#include "util.h" #include "util.h"
namespace Ui { namespace Ui {
class CameraPreview; class CameraPreview;
@@ -53,7 +53,7 @@ private:
void setImage(const QPixmap &img); void setImage(const QPixmap &img);
void validate(QSpinBox *origin, QSpinBox *dest, int limit); void validate(QSpinBox *origin, QSpinBox *dest, int limit);
PylonWrapper *camera; SingleCamWrapper *camera;
}; };

View File

@@ -2,6 +2,11 @@
#include <iostream> #include <iostream>
#include <pylon/PylonIncludes.h> #include <pylon/PylonIncludes.h>
#include <stitchimage.h> #include <stitchimage.h>
#include <chrono>
using namespace std::chrono;
typedef high_resolution_clock Time;
typedef milliseconds ms;
typedef duration<float> fsec;
void DualcamGrabber::run() { void DualcamGrabber::run() {
stop_request = false; stop_request = false;
@@ -9,9 +14,10 @@ void DualcamGrabber::run() {
if (wrapper->isOpen()) { if (wrapper->isOpen()) {
Pylon::CInstantCameraArray &cameras = wrapper->getCameraArray(); Pylon::CInstantCameraArray &cameras = wrapper->getCameraArray();
wrapper->frameRate(static_cast<uint>(framerate)); wrapper->frameRate(static_cast<uint>(framerate), -1);
wrapper->exposureTime(exposure); wrapper->exposureTime(exposure);
wrapper->gain(gain); wrapper->gain(gain);
cameras.StartGrabbing(); cameras.StartGrabbing();
Pylon::CGrabResultPtr frame0, frame1; Pylon::CGrabResultPtr frame0, frame1;
Pylon::CPylonImage leftImage; Pylon::CPylonImage leftImage;
@@ -19,14 +25,27 @@ void DualcamGrabber::run() {
Pylon::CPylonImage stitchedImage; Pylon::CPylonImage stitchedImage;
std::string errorMessage = ""; std::string errorMessage = "";
// int ifi = 0;
// int deviation = 0;
// std::cerr << wrapper->frameRate(0) << "\t" << wrapper->frameRate(1) << "\t" << framerate << std::endl;
// int desired_ifi = (1./wrapper->frameRate(0) * 1000000);
// auto framestart = high_resolution_clock::now();
while (cameras.IsGrabbing() && !stop_request) { while (cameras.IsGrabbing() && !stop_request) {
// if (counter > 0) {
// deviation = desired_ifi - ifi;
// if (deviation > 0)
// // usleep(deviation);
// std::cerr << desired_ifi << "\t" << deviation << std::endl;
// }
// auto start = high_resolution_clock::now();
MyImage *img = new MyImage(); MyImage *img = new MyImage();
// auto stop1 = high_resolution_clock::now();
cameras[0].RetrieveResult( 5000, frame0, Pylon::TimeoutHandling_ThrowException ); cameras[0].RetrieveResult( 5000, frame0, Pylon::TimeoutHandling_ThrowException );
// auto stop2 = high_resolution_clock::now();
cameras[1].RetrieveResult( 5000, frame1, Pylon::TimeoutHandling_ThrowException ); cameras[1].RetrieveResult( 5000, frame1, Pylon::TimeoutHandling_ThrowException );
// auto stop3 = high_resolution_clock::now();
leftImage.AttachGrabResultBuffer( frame0 ); leftImage.AttachGrabResultBuffer( frame0 );
rightImage.AttachGrabResultBuffer( frame1 ); rightImage.AttachGrabResultBuffer( frame1 );
if (leftImage.IsValid() && rightImage.IsValid()) { if (leftImage.IsValid() && rightImage.IsValid()) {
try { try {
StitchImage::StitchToRight(leftImage, rightImage, &stitchedImage, errorMessage); StitchImage::StitchToRight(leftImage, rightImage, &stitchedImage, errorMessage);
@@ -36,6 +55,17 @@ void DualcamGrabber::run() {
std::cerr << e.what() << '\n'; std::cerr << e.what() << '\n';
} }
} }
// auto stop4 = high_resolution_clock::now();
// auto duration1 = duration_cast<microseconds>(stop1 - start);
// auto duration2 = duration_cast<microseconds>(stop2 - stop1);
// auto duration3 = duration_cast<microseconds>(stop3 - stop2);
// auto duration4 = duration_cast<microseconds>(stop4 - stop3);
// std::cerr << "framecount: " << counter << " image constr: " << duration1.count() << "\t" << " retrieve1: " << duration2.count() << "\t" << " retrieve2: " << duration3.count() << "\t" << "conversion: " << duration4.count() << std::endl;
// ifi = duration_cast<microseconds>(stop4 - framestart).count();
// framestart = stop4;
// if (counter > 0) {
// std::cerr << "frame " << counter << " inter frame interval: " << ifi << "microseconds" << std::endl;
// }
counter += 1; counter += 1;
} }
cameras.StopGrabbing(); cameras.StopGrabbing();

View File

@@ -54,8 +54,8 @@ bool DualcamWrapper::frameRate(uint new_framerate, int camindex) {
frameRate(new_framerate, 0); frameRate(new_framerate, 0);
frameRate(new_framerate, 1); frameRate(new_framerate, 1);
return true; return true;
} else if (camindex == 0 && camindex ==1) { } else if (camindex >= 0 && camindex < 2) {
GenApi::INodeMap& nodemap = getNodemap(0); GenApi::INodeMap& nodemap = getNodemap(camindex);
GenApi::INode* n = nodemap.GetNode( "AcquisitionFrameRateEnable" ); GenApi::INode* n = nodemap.GetNode( "AcquisitionFrameRateEnable" );
Pylon::CBooleanParameter enableframerate(n); Pylon::CBooleanParameter enableframerate(n);
enableframerate.SetValue(true); enableframerate.SetValue(true);
@@ -72,7 +72,7 @@ bool DualcamWrapper::frameRate(uint new_framerate, int camindex) {
double DualcamWrapper::frameRate(int camindex) { double DualcamWrapper::frameRate(int camindex) {
assert(camindex > 0 && camindex < 2); assert(camindex >= 0 && camindex < 2);
double rate = -1.; double rate = -1.;
if (valid) { if (valid) {
GenApi::INodeMap& nodemap = getNodemap(camindex); GenApi::INodeMap& nodemap = getNodemap(camindex);
@@ -173,14 +173,14 @@ bool DualcamWrapper::grabFrame(MyImage &img, int camindex) {
qDebug() << "grabFrame from camera " << camindex; qDebug() << "grabFrame from camera " << camindex;
if (valid) { if (valid) {
GenApi::INodeMap &nodemap = getNodemap(camindex); GenApi::INodeMap &nodemap = getNodemap(camindex);
qDebug() << "Setting width" << layout.rois[0].width; qDebug() << "Setting width" << layout.rois[camindex].width;
Pylon::CIntegerParameter(nodemap, "Width").SetValue(layout.rois[0].width); Pylon::CIntegerParameter(nodemap, "Width").SetValue(layout.rois[camindex].width);
qDebug() << "Setting height" << layout.rois[0].height; qDebug() << "Setting height" << layout.rois[0].height;
Pylon::CIntegerParameter(nodemap, "Height").SetValue(layout.rois[0].height); Pylon::CIntegerParameter(nodemap, "Height").SetValue(layout.rois[camindex].height);
qDebug() << "Setting xoffset" << layout.rois[0].x; qDebug() << "Setting xoffset" << layout.rois[camindex].x;
Pylon::CIntegerParameter(nodemap, "OffsetX").SetValue(layout.rois[0].x); Pylon::CIntegerParameter(nodemap, "OffsetX").SetValue(layout.rois[camindex].x);
qDebug() << "Setting yoffset" << layout.rois[0].y; qDebug() << "Setting yoffset" << layout.rois[camindex].y;
Pylon::CIntegerParameter(nodemap, "OffsetY").SetValue(layout.rois[0].y); Pylon::CIntegerParameter(nodemap, "OffsetY").SetValue(layout.rois[camindex].y);
camera->StartGrabbing(); camera->StartGrabbing();
camera->RetrieveResult( 5000, frame, Pylon::TimeoutHandling_ThrowException); camera->RetrieveResult( 5000, frame, Pylon::TimeoutHandling_ThrowException);
@@ -191,15 +191,25 @@ bool DualcamWrapper::grabFrame(MyImage &img, int camindex) {
} }
void DualcamWrapper::setROI() {
for (int camindex = 0; camindex < 2; camindex++){
qDebug() << "Setting ROI: w" << layout.rois[camindex].width << " h: "<< layout.rois[camindex].height << " x " << layout.rois[camindex].x << " y " << layout.rois[camindex].y;
GenApi::INodeMap &nodemap = getNodemap(camindex);
Pylon::CIntegerParameter(nodemap, "Width").SetValue(layout.rois[camindex].width);
Pylon::CIntegerParameter(nodemap, "Height").SetValue(layout.rois[camindex].height);
Pylon::CIntegerParameter(nodemap, "OffsetX").SetValue(layout.rois[camindex].x);
Pylon::CIntegerParameter(nodemap, "OffsetY").SetValue(layout.rois[camindex].y);
}
}
void DualcamWrapper::resetCamera(int camindex) { void DualcamWrapper::resetCamera(int camindex) {
GenApi::INodeMap &nodemap = getNodemap( camindex ); GenApi::INodeMap &nodemap = getNodemap( camindex );
int64_t dfltWidth = 2048; int64_t dfltWidth = 2048;
int64_t dfltHeight = 1536; int64_t dfltHeight = 1536;
qDebug() << "resetting camera to default ROI (" << dfltWidth << ", " << dfltHeight << ")"; qDebug() << "resetting camera to default ROI (" << dfltWidth << ", " << dfltHeight << ")";
try { try {
// std::cerr << "MaxWidth: " << Pylon::CIntegerParameter(nodemap, "WidthMax").GetValue() << std::endl;
Pylon::CIntegerParameter(nodemap, "Width").SetValue(dfltWidth, false); Pylon::CIntegerParameter(nodemap, "Width").SetValue(dfltWidth, false);
// std::cerr << "MaxHeight: " << Pylon::CIntegerParameter(nodemap, "HeightMax").GetValue() << std::endl;
Pylon::CIntegerParameter(nodemap, "Height").SetValue(dfltHeight, false); Pylon::CIntegerParameter(nodemap, "Height").SetValue(dfltHeight, false);
Pylon::CIntegerParameter(nodemap, "OffsetX").SetValue(0); Pylon::CIntegerParameter(nodemap, "OffsetX").SetValue(0);
Pylon::CIntegerParameter(nodemap, "OffsetY").SetValue(0); Pylon::CIntegerParameter(nodemap, "OffsetY").SetValue(0);
@@ -229,8 +239,9 @@ bool DualcamWrapper::openCameras(std::string &message) {
valid = false; valid = false;
return valid; return valid;
} }
resetCamera(0); // resetCamera(0);
resetCamera(1); // resetCamera(1);
setROI();
return valid; return valid;
} }

View File

@@ -15,7 +15,6 @@ public:
DualcamWrapper(const CameraLayout &layout); DualcamWrapper(const CameraLayout &layout);
~DualcamWrapper(); ~DualcamWrapper();
ImageSettings getImageSettings(int camindex); ImageSettings getImageSettings(int camindex);
bool isOpen(); bool isOpen();
void terminate(); void terminate();
@@ -35,6 +34,7 @@ private:
void resetCamera(int camindex); void resetCamera(int camindex);
Pylon::CInstantCameraArray cameras; Pylon::CInstantCameraArray cameras;
GenApi::INodeMap& getNodemap(int camindex); GenApi::INodeMap& getNodemap(int camindex);
void setROI();
bool valid, withLayout; bool valid, withLayout;
CameraLayout layout; CameraLayout layout;

View File

@@ -27,6 +27,8 @@ bool MyImage::setFrame( Pylon::CPylonImage &img) {
img_width = img.GetWidth(); img_width = img.GetWidth();
img_height = img.GetHeight(); img_height = img.GetHeight();
memcpy(&buffer, img.GetBuffer(), img.GetImageSize()); memcpy(&buffer, img.GetBuffer(), img.GetImageSize());
auto t = std::chrono::system_clock::now();
img_timestamp = std::chrono::system_clock::to_time_t(t);
} }
return valid; return valid;
} }

View File

@@ -652,7 +652,7 @@ void PylonRecorder::connectCamera() {
std::string cname = layout.devices[0]; std::string cname = layout.devices[0];
std::string message; std::string message;
qDebug() << "connecting to camera " << cname.c_str(); qDebug() << "connecting to camera " << cname.c_str();
singlecam = new PylonWrapper(layout); singlecam = new SingleCamWrapper(layout);
bool success = singlecam->openCamera(message); bool success = singlecam->openCamera(message);
if (success) { if (success) {
cameraConnectedLabel->setText("connected"); cameraConnectedLabel->setText("connected");
@@ -762,7 +762,7 @@ void PylonRecorder::startSinglecamRecording() {
delete singlecamgrabber; delete singlecamgrabber;
singlecamgrabber = nullptr; singlecamgrabber = nullptr;
} }
singlecamgrabber = new Grabber(singlecam, buffer, defaultFrameRate); singlecamgrabber = new SinglecamGrabber(singlecam, buffer, defaultFrameRate);
if (framerateSpinner->value() != singlecamgrabber->currentFramerate()) if (framerateSpinner->value() != singlecamgrabber->currentFramerate())
singlecamgrabber->setFrameRate(framerateSpinner->value()); singlecamgrabber->setFrameRate(framerateSpinner->value());
@@ -776,8 +776,8 @@ void PylonRecorder::startSinglecamRecording() {
delete writer; delete writer;
writer = nullptr; writer = nullptr;
} }
writer = new Writer(buffer, 0); writer = new Writer(buffer);
connect(writer, SLOT(writingDone()), this, SLOT(writerDone())); connect(writer, SIGNAL(writingDone()), this, SLOT(writerDone()));
writer->setVideoSpecs(specs); writer->setVideoSpecs(specs);
QSettings s; QSettings s;
@@ -807,7 +807,7 @@ void PylonRecorder::startDualcamRecording() {
VideoSpecs specs = getVideoSpecs(settings); VideoSpecs specs = getVideoSpecs(settings);
specs.filename = filename; specs.filename = filename;
specs.format = VideoFormat::mp4; specs.format = VideoFormat::mp4;
qDebug() << "got video specifications"; qDebug() << "got video specifications " << specs.fps;
if (buffer != nullptr) { if (buffer != nullptr) {
buffer->clear(); buffer->clear();
delete buffer; delete buffer;
@@ -839,7 +839,7 @@ void PylonRecorder::startDualcamRecording() {
delete writer; delete writer;
writer = nullptr; writer = nullptr;
} }
writer = new Writer(buffer, 0); writer = new Writer(buffer);
connect(writer, SIGNAL(writingDone()), this, SLOT(writerDone())); connect(writer, SIGNAL(writingDone()), this, SLOT(writerDone()));
writer->setVideoSpecs(specs); writer->setVideoSpecs(specs);

View File

@@ -7,10 +7,10 @@
#include <QCheckBox> #include <QCheckBox>
#include <QSettings> #include <QSettings>
#include <pylon/PylonIncludes.h> #include <pylon/PylonIncludes.h>
#include "pylonwrapper.h" #include "singlecamwrapper.h"
#include "dualcamwrapper.h" #include "dualcamwrapper.h"
#include "imagebuffer.h" #include "imagebuffer.h"
#include "grabber.h" #include "singlecamgrabber.h"
#include "dualcamgrabber.h" #include "dualcamgrabber.h"
#include "writer.h" #include "writer.h"
#include "projectsettings.h" #include "projectsettings.h"
@@ -105,10 +105,10 @@ private:
QProgressBar *loadBar; QProgressBar *loadBar;
QScrollArea *scrollArea; QScrollArea *scrollArea;
double scaleFactor = 1; double scaleFactor = 1;
PylonWrapper *singlecam; SingleCamWrapper *singlecam;
DualcamWrapper *dualcam; DualcamWrapper *dualcam;
ImageBuffer *buffer; ImageBuffer *buffer;
Grabber *singlecamgrabber; SinglecamGrabber *singlecamgrabber;
DualcamGrabber *dualcamgrabber; DualcamGrabber *dualcamgrabber;
Writer *writer; Writer *writer;
CameraLayout layout; CameraLayout layout;

View File

@@ -1,8 +1,8 @@
#include "grabber.h" #include "singlecamgrabber.h"
#include <iostream> #include <iostream>
#include <pylon/PylonIncludes.h> #include <pylon/PylonIncludes.h>
void Grabber::run() { void SinglecamGrabber::run() {
stop_request = false; stop_request = false;
int count = 0; int count = 0;
if (camera->isOpen()) { if (camera->isOpen()) {

View File

@@ -1,16 +1,16 @@
#ifndef GRABBER_H #ifndef SINGLECAMGRABBER_H
#define GRABBER_H #define SINGLECAMGRABBER_H
#include <QObject> #include <QObject>
#include <QThread> #include <QThread>
#include "pylonwrapper.h" #include "singlecamwrapper.h"
#include "imagebuffer.h" #include "imagebuffer.h"
class Grabber : public QThread class SinglecamGrabber : public QThread
{ {
Q_OBJECT Q_OBJECT
public: public:
Grabber(PylonWrapper *camera, ImageBuffer*buffer, int framerate, QObject *parent = nullptr) : SinglecamGrabber(SingleCamWrapper *camera, ImageBuffer*buffer, int framerate, QObject *parent = nullptr) :
QThread(parent), camera(camera), buffer(buffer), framerate(framerate) {} QThread(parent), camera(camera), buffer(buffer), framerate(framerate) {}
void run() override; void run() override;
@@ -29,7 +29,7 @@ public:
private: private:
bool stop_request = false; bool stop_request = false;
PylonWrapper *camera; SingleCamWrapper *camera;
ImageBuffer *buffer; ImageBuffer *buffer;
int framerate; int framerate;
double exposure, gain; double exposure, gain;
@@ -51,4 +51,4 @@ signals:
void terminated(); void terminated();
}; };
#endif // GRABBER_H #endif // SINGLECAMGRABBER_H

View File

@@ -1,19 +1,19 @@
#include "pylonwrapper.h" #include "singlecamwrapper.h"
PylonWrapper::PylonWrapper(const std::string &fullName): SingleCamWrapper::SingleCamWrapper(const std::string &fullName):
valid(false), fullName(fullName), camera(nullptr), withLayout(false) { valid(false), fullName(fullName), camera(nullptr), withLayout(false) {
qDebug() << "Constructor with name"; qDebug() << "Constructor with name";
Pylon::PylonInitialize(); Pylon::PylonInitialize();
} }
PylonWrapper::PylonWrapper(const CameraLayout &layout): valid(false), withLayout(true), camera(nullptr) { SingleCamWrapper::SingleCamWrapper(const CameraLayout &layout): valid(false), withLayout(true), camera(nullptr) {
qDebug() << "Constructor with layout"; qDebug() << "Constructor with layout";
this->fullName = layout.devices[0]; this->fullName = layout.devices[0];
this->layout = layout; this->layout = layout;
Pylon::PylonInitialize(); Pylon::PylonInitialize();
} }
PylonWrapper::~PylonWrapper() { SingleCamWrapper::~SingleCamWrapper() {
qDebug() << "wrapper destructor"; qDebug() << "wrapper destructor";
if (camera != nullptr){ if (camera != nullptr){
if (camera->IsOpen()) { if (camera->IsOpen()) {
@@ -27,7 +27,7 @@ PylonWrapper::~PylonWrapper() {
qDebug() << "Successfully deleted camera"; qDebug() << "Successfully deleted camera";
} }
void PylonWrapper::terminate() { void SingleCamWrapper::terminate() {
qDebug() << "Terminate"; qDebug() << "Terminate";
try { try {
Pylon::PylonTerminate(); Pylon::PylonTerminate();
@@ -36,11 +36,11 @@ void PylonWrapper::terminate() {
} }
} }
bool PylonWrapper::isOpen() { bool SingleCamWrapper::isOpen() {
return valid; return valid;
} }
double PylonWrapper::maxFrameRate() { double SingleCamWrapper::maxFrameRate() {
double max_rate = -1; double max_rate = -1;
if (valid) { if (valid) {
GenApi::INodeMap& nodemap = camera->GetNodeMap(); GenApi::INodeMap& nodemap = camera->GetNodeMap();
@@ -51,7 +51,7 @@ double PylonWrapper::maxFrameRate() {
return max_rate; return max_rate;
} }
bool PylonWrapper::frameRate(uint new_framerate) { bool SingleCamWrapper::frameRate(uint new_framerate) {
if (valid) { if (valid) {
GenApi::INodeMap& nodemap = camera->GetNodeMap(); GenApi::INodeMap& nodemap = camera->GetNodeMap();
GenApi::INode* n = nodemap.GetNode( "AcquisitionFrameRateEnable" ); GenApi::INode* n = nodemap.GetNode( "AcquisitionFrameRateEnable" );
@@ -66,7 +66,7 @@ bool PylonWrapper::frameRate(uint new_framerate) {
return false; return false;
} }
double PylonWrapper::frameRate() { double SingleCamWrapper::frameRate() {
double rate = -1.; double rate = -1.;
if (valid) { if (valid) {
GenApi::INodeMap& nodemap = camera->GetNodeMap(); GenApi::INodeMap& nodemap = camera->GetNodeMap();
@@ -77,7 +77,7 @@ double PylonWrapper::frameRate() {
return rate; return rate;
} }
double PylonWrapper::exposureTime() { double SingleCamWrapper::exposureTime() {
double time = -1.; double time = -1.;
if (valid) { if (valid) {
GenApi::INodeMap& nodemap = camera->GetNodeMap(); GenApi::INodeMap& nodemap = camera->GetNodeMap();
@@ -88,7 +88,7 @@ double PylonWrapper::exposureTime() {
return time; return time;
} }
bool PylonWrapper::exposureTime(double exposure_time) { bool SingleCamWrapper::exposureTime(double exposure_time) {
if (valid) { if (valid) {
GenApi::INodeMap& nodemap = camera->GetNodeMap(); GenApi::INodeMap& nodemap = camera->GetNodeMap();
double d = GenApi::CFloatPtr(nodemap.GetNode("ExposureTime"))->GetValue(); double d = GenApi::CFloatPtr(nodemap.GetNode("ExposureTime"))->GetValue();
@@ -105,7 +105,7 @@ bool PylonWrapper::exposureTime(double exposure_time) {
return false; return false;
} }
double PylonWrapper::gain() { double SingleCamWrapper::gain() {
double gain = -1.; double gain = -1.;
if (valid) { if (valid) {
GenApi::INodeMap& nodemap = camera->GetNodeMap(); GenApi::INodeMap& nodemap = camera->GetNodeMap();
@@ -116,7 +116,7 @@ double PylonWrapper::gain() {
return gain; return gain;
} }
bool PylonWrapper::gain(double gain_db) { bool SingleCamWrapper::gain(double gain_db) {
if (valid) { if (valid) {
GenApi::INodeMap& nodemap = camera->GetNodeMap(); GenApi::INodeMap& nodemap = camera->GetNodeMap();
GenApi::CFloatPtr(nodemap.GetNode("Gain"))->SetValue(gain_db); GenApi::CFloatPtr(nodemap.GetNode("Gain"))->SetValue(gain_db);
@@ -125,7 +125,7 @@ bool PylonWrapper::gain(double gain_db) {
return false; return false;
} }
ImageSettings PylonWrapper::getImageSettings() { ImageSettings SingleCamWrapper::getImageSettings() {
ImageSettings settings; ImageSettings settings;
if (valid) { if (valid) {
Pylon::CEnumParameter pixelFormat( camera->GetNodeMap(), "PixelFormat" ); Pylon::CEnumParameter pixelFormat( camera->GetNodeMap(), "PixelFormat" );
@@ -141,7 +141,7 @@ ImageSettings PylonWrapper::getImageSettings() {
return settings; return settings;
} }
bool PylonWrapper::grabFrame(MyImage &img) { bool SingleCamWrapper::grabFrame(MyImage &img) {
Pylon::CGrabResultPtr frame; Pylon::CGrabResultPtr frame;
qDebug() << "grabFrame"; qDebug() << "grabFrame";
if (valid) { if (valid) {
@@ -162,7 +162,7 @@ bool PylonWrapper::grabFrame(MyImage &img) {
return frame.IsValid(); return frame.IsValid();
} }
void PylonWrapper::resetCamera() { void SingleCamWrapper::resetCamera() {
int64_t dfltWidth = 2048; int64_t dfltWidth = 2048;
int64_t dfltHeight = 1536; int64_t dfltHeight = 1536;
qDebug() << "resetting camera to default ROI (" << dfltWidth << ", " << dfltHeight << ")"; qDebug() << "resetting camera to default ROI (" << dfltWidth << ", " << dfltHeight << ")";
@@ -181,7 +181,7 @@ void PylonWrapper::resetCamera() {
} }
} }
bool PylonWrapper::openCamera(std::string &message) { bool SingleCamWrapper::openCamera(std::string &message) {
qDebug() << "opening camera"; qDebug() << "opening camera";
try { try {
camera = new Pylon::CInstantCamera(); camera = new Pylon::CInstantCamera();
@@ -215,7 +215,7 @@ bool PylonWrapper::openCamera(std::string &message) {
return valid; return valid;
} }
void PylonWrapper::closeCamera() { void SingleCamWrapper::closeCamera() {
qDebug() << "Close camera!"; qDebug() << "Close camera!";
if (camera->IsOpen()) { if (camera->IsOpen()) {
try { try {
@@ -229,11 +229,11 @@ void PylonWrapper::closeCamera() {
} }
} }
Pylon::CInstantCamera *PylonWrapper::getCamera() { Pylon::CInstantCamera *SingleCamWrapper::getCamera() {
return camera; return camera;
} }
QString PylonWrapper::userName() { QString SingleCamWrapper::userName() {
GenApi::INodeMap& nodemap = camera->GetNodeMap(); GenApi::INodeMap& nodemap = camera->GetNodeMap();
QString username = Pylon::CStringParameter(nodemap, "DeviceUserID").GetValue().c_str(); QString username = Pylon::CStringParameter(nodemap, "DeviceUserID").GetValue().c_str();
return username; return username;

View File

@@ -1,5 +1,5 @@
#ifndef PYLONWRAPPER_H #ifndef SINGLECAMWRAPPER_H
#define PYLONWRAPPER_H #define SINGLECAMWRAPPER_H
#include <pylon/PylonIncludes.h> #include <pylon/PylonIncludes.h>
#include <pylon/BaslerUniversalInstantCamera.h> #include <pylon/BaslerUniversalInstantCamera.h>
@@ -7,12 +7,12 @@
#include "util.h" #include "util.h"
#include "myimage.h" #include "myimage.h"
class PylonWrapper class SingleCamWrapper
{ {
public: public:
PylonWrapper(const std::string &name); SingleCamWrapper(const std::string &name);
PylonWrapper(const CameraLayout &layout); SingleCamWrapper(const CameraLayout &layout);
~PylonWrapper(); ~SingleCamWrapper();
ImageSettings getImageSettings(); ImageSettings getImageSettings();
bool isOpen(); bool isOpen();
@@ -41,4 +41,4 @@ private:
}; };
#endif // PYLONWRAPPER_H #endif // SINGLECAMWRAPPER_H

View File

@@ -1,9 +1,7 @@
#include "writer.h" #include "writer.h"
#include <chrono> #include <chrono>
#include <fstream> #include <fstream>
#include <pylon/VideoWriter.h> #include <pylon/VideoWriter.h>
using namespace std::chrono;
void Writer::setVideoSpecs(VideoSpecs specs) { void Writer::setVideoSpecs(VideoSpecs specs) {
videoSpecs = specs; videoSpecs = specs;
@@ -37,7 +35,7 @@ void Writer::run() {
// Releases all pylon resources. // Releases all pylon resources.
// PylonTerminate(); // PylonTerminate();
// Return with error code 1. // Return with error code 1.
emit writingDone(this->cam_number); emit writingDone();
return; return;
} }
qDebug() << "checks done!"; qDebug() << "checks done!";
@@ -114,7 +112,12 @@ void Writer::run() {
} }
} }
if (count < chunksize) { if (count < chunksize) {
try {
stamps_buffer[count] = nix::util::timeToStr(img->timestamp()); stamps_buffer[count] = nix::util::timeToStr(img->timestamp());
} catch (...) {
std::cerr << "Bad time to string conversion " << img->timestamp() << std::endl;
stamps_buffer[count] = "invalid";
}
ids_buffer[count] = img->index(); ids_buffer[count] = img->index();
count ++; count ++;
} else { } else {
@@ -138,11 +141,11 @@ void Writer::run() {
frametimes.setData(nix::DataType::String, stamps_buffer.data(), chunk_shape, offset); frametimes.setData(nix::DataType::String, stamps_buffer.data(), chunk_shape, offset);
frameindices.setData(nix::DataType::Int64, ids_buffer.data(), chunk_shape, offset); frameindices.setData(nix::DataType::Int64, ids_buffer.data(), chunk_shape, offset);
} }
// videoWriter.Close(); videoWriter.Close();
myFile.close(); myFile.close();
nix_file.close(); nix_file.close();
} else { } else {
std::cerr << "Got no video specifications, not writing!" << std::endl; std::cerr << "Got no video specifications, not writing!" << std::endl;
} }
emit writingDone(cam_number); emit writingDone();
} }

View File

@@ -6,7 +6,7 @@
#include <pylon/PylonIncludes.h> #include <pylon/PylonIncludes.h>
#include <nix.hpp> #include <nix.hpp>
#include "pylonwrapper.h" #include "singlecamwrapper.h"
#include "imagebuffer.h" #include "imagebuffer.h"
#include "projectsettings.h" #include "projectsettings.h"
#include "util.h" #include "util.h"
@@ -15,8 +15,8 @@ class Writer : public QThread
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit Writer(ImageBuffer*buffer, int number, QObject *parent = nullptr) : explicit Writer(ImageBuffer*buffer, QObject *parent = nullptr) :
QThread(parent), buffer(buffer), cam_number(number) {} QThread(parent), buffer(buffer) {}
void setVideoSpecs(VideoSpecs specs); void setVideoSpecs(VideoSpecs specs);
void setProjectMetadata(ProjectMetadata mdata); void setProjectMetadata(ProjectMetadata mdata);
@@ -25,10 +25,9 @@ public:
signals: signals:
void terminated(); void terminated();
void writingDone(int cam); void writingDone();
private: private:
int cam_number;
ImageBuffer *buffer; ImageBuffer *buffer;
VideoSpecs videoSpecs; VideoSpecs videoSpecs;
ProjectMetadata metadata; ProjectMetadata metadata;