From d5af9adec90aa2afee595ea87443b75dd044c609 Mon Sep 17 00:00:00 2001 From: uvos Date: Fri, 18 Jun 2021 16:52:39 +0200 Subject: [PATCH] various bug fixes around free trigger mode, display strings and image pipe robustness --- CMakeLists.txt | 2 +- src/cameras.cpp | 9 ++++++--- src/imagepipeline.cpp | 25 +++++++++++++++++++++---- src/main.cpp | 1 + src/profile.cpp | 6 +++++- src/profile.h | 2 +- src/ui/configurecameradialog.cpp | 4 ++++ src/ui/configurecameradialog.ui | 6 ++++++ src/ui/cvimageviewer.cpp | 7 ++++++- src/ui/editprofiledialog.cpp | 20 +++++++++++++------- src/ui/editprofiledialog.ui | 26 ++++++++++++++++++++------ src/ui/mainwindow.cpp | 2 +- 12 files changed, 85 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b738e7e..ccd29a8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,6 +52,6 @@ set(PROJECT_SOURCES add_executable(MAClient ${PROJECT_SOURCES}) - +target_compile_options(MAClient PRIVATE "-std=gnu++17" "-Wall" "-O2" "-fno-strict-aliasing") target_link_libraries(MAClient PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Concurrent ${OpenCV_LIBS} -luvoscam -luvosled -luvosunwrap) target_include_directories(${PROJECT_NAME} PRIVATE ${OpenCV_INCLUDE_DIRS} src src/ui) diff --git a/src/cameras.cpp b/src/cameras.cpp index 74deaa9..e3dca6f 100644 --- a/src/cameras.cpp +++ b/src/cameras.cpp @@ -111,7 +111,7 @@ bool Cameras::start() ret = false; } - if(free_) + if(free_ && led_) uvosled_set_current(led_, lighting_.mask, lighting_.brightness); return ret; @@ -146,9 +146,11 @@ bool Cameras::setFree(bool free) { if(!camera->cam()->setAcquisitionMode(free ? cam::Camera::MODE_FREE : cam::Camera::MODE_SINGLE)) { - qDebug()<<"failed to set single on camera"<id(); + qDebug()<<"failed to set acquisition mode on camera"<id(); ret = false; } + if(ret) + camera->cam()->setTriggerMode(free ? cam::Camera::TRIGGER_FREE : cam::Camera::TRIGGER_SOFTWARE); } return ret; } @@ -173,13 +175,14 @@ void Cameras::imageRecived(Camera::Image img) { if(!disable_) { + qDebug()<<"free"< #include #include #include #include #include +#include ImagePipeline::ImagePipeline(Cameras* cameras, QObject *parent): QObject(parent), cameras_(cameras) { @@ -46,6 +47,8 @@ cv::Mat ImagePipeline::process(const Profile profile, std::vector { if(camera.id == image.cameraId) { + if(!camera.remapMap.xMat.data || !camera.remapMap.yMat.data) + return cv::Mat(); if(camera.darkmap.data) { cv::Mat subtracted; @@ -67,7 +70,7 @@ cv::Mat ImagePipeline::process(const Profile profile, std::vector } } } - catch(cv::Exception ex) + catch(cv::Exception& ex) { qDebug()< if(remapedImages.size() > 0) { + std::sort(remapedImages.begin(), remapedImages.end(), [](const RemapedImage& imgA, const RemapedImage& imgB) -> bool {return imgA.origin.x < imgB.origin.x;}); cv::Mat output = simpleStich(remapedImages); output.convertTo(output, CV_32FC1, 1.0/255.0, 0); if(profile.lightmap.data) - normalize(output, profile.lightmap); + { + qDebug()<<"output"<getCameras())) diff --git a/src/main.cpp b/src/main.cpp index 9bac951..8f7f2d0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -90,6 +90,7 @@ int main(int argc, char *argv[]) } Cameras cameras(uvosledRet < 0 ? nullptr : &led); + cameras.setFree(false); ImagePipeline pipe(&cameras); MainWindow w; diff --git a/src/profile.cpp b/src/profile.cpp index 21132b2..20cb632 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -57,6 +57,7 @@ void LightingSetup::load(const QSettings& settings) void Profile::store(QSettings& settings) const { + deleteProfile(); qDebug()<<"storing to "<(id)); @@ -143,9 +144,12 @@ void Profile::store() store(name_); } -void Profile::deleteProfile() +void Profile::deleteProfile() const { QFile::remove(profileLocation() + name_ + ".profile.ini"); + QFile::remove(profileLocation() + name_ + ".lightmap.mat"); + QFile::remove(profileLocation() + name_ + ".calcurve.mat"); + QFile::remove(profileLocation() + name_ + ".profile.mat"); } QList Profile::avaiableProfiles() diff --git a/src/profile.h b/src/profile.h index 3eeae19..b8c3999 100644 --- a/src/profile.h +++ b/src/profile.h @@ -54,7 +54,7 @@ public: void load(QSettings& settings); void load(const QString& name); void load(); - void deleteProfile(); + void deleteProfile() const; void setName(const QString name){name_=name;} void setCamerasSetupsFromDescription(const std::vector& desc); QString getName() const {return name_;} diff --git a/src/ui/configurecameradialog.cpp b/src/ui/configurecameradialog.cpp index b311528..0f8a4fc 100644 --- a/src/ui/configurecameradialog.cpp +++ b/src/ui/configurecameradialog.cpp @@ -35,6 +35,8 @@ ConfigureCameraDialog::ConfigureCameraDialog(const CameraSetup& setup, std::shar connect(ui->pushButtonDarkImageCreate, &QPushButton::clicked, this, &ConfigureCameraDialog::captureDark); connect(ui->pushButtonCapture, &QPushButton::clicked, this, &ConfigureCameraDialog::takeImage); connect(camera_.get(), &Camera::newImage, this, &ConfigureCameraDialog::gotImage); + connect(ui->pushButtonBgShow, &QPushButton::clicked, [this](){if(setup_.bgmask.data) ui->widget_4->setImage(Camera::Image(setup_.bgmask, 0));}); + connect(ui->pushButtonDarkImageShow, &QPushButton::clicked, [this](){if(setup_.darkmap.data) ui->widget_4->setImage(Camera::Image(setup_.darkmap, 0));}); checkConfig(); } @@ -157,6 +159,8 @@ bool ConfigureCameraDialog::checkConfig() ui->pushButtonBgClear->setEnabled(bgOk); ui->pushButtonDarkImageClear->setEnabled(darkMapOK); ui->pushButtonRemapClear->setEnabled(remapMapOk); + ui->pushButtonDarkImageShow->setEnabled(darkMapOK); + ui->pushButtonBgShow->setEnabled(bgOk); ui->ledBg->setLit(bgOk); ui->ledDark->setLit(darkMapOK); diff --git a/src/ui/configurecameradialog.ui b/src/ui/configurecameradialog.ui index 94fd5f5..e99dc1d 100644 --- a/src/ui/configurecameradialog.ui +++ b/src/ui/configurecameradialog.ui @@ -97,6 +97,9 @@ + + false + Show @@ -120,6 +123,9 @@ + + false + Show diff --git a/src/ui/cvimageviewer.cpp b/src/ui/cvimageviewer.cpp index 3b864df..d13e5d6 100644 --- a/src/ui/cvimageviewer.cpp +++ b/src/ui/cvimageviewer.cpp @@ -65,7 +65,12 @@ void CvImageViewer::setImage(Camera::Image img) } else if(image_.type() == CV_32FC1 || image_.type() == CV_64FC1) { - img.mat.convertTo(image_, CV_8UC1, 255, 0); + double min, max; + cv::minMaxIdx(img.mat, &min, &max); + double a = 255.0/(max - min); + double b = 0-(min*a); + qDebug()< #include #include +#include #include "configurecameradialog.h" @@ -44,6 +45,7 @@ EditProfileDialog::EditProfileDialog(Cameras* cameras, const Profile profile, QW } ui->calLed->setLit(profile_.calcurve.data); + ui->ledLightmap->setLit(profile_.lightmap.data); connect(ui->doubleSpinBoxBrightness, QOverload::of(&QDoubleSpinBox::valueChanged), [this](double in){profile_.lighting.brightness = in/100.0;}); connect(ui->doubleSpinBoxExposure, QOverload::of(&QDoubleSpinBox::valueChanged), [this](double in){profile_.exposureTime = in; invalidateCameras();}); @@ -53,9 +55,11 @@ EditProfileDialog::EditProfileDialog(Cameras* cameras, const Profile profile, QW connect(ui->checkBoxCh3, &QCheckBox::clicked, this, &EditProfileDialog::setMask); connect(ui->checkBoxCh4, &QCheckBox::clicked, this, &EditProfileDialog::setMask); connect(ui->pushButton, &QPushButton::clicked, this, &EditProfileDialog::configureCamera); - connect(ui->checkBoxNodistort, &QCheckBox::stateChanged, [this](int state){profile_.nodistort = state == Qt::Checked ?: false; setConfigured();}); + connect(ui->checkBoxNodistort, &QCheckBox::stateChanged, [this](int state){profile_.nodistort = state == Qt::Checked; setConfigured();}); connect(ui->pushButtonCalLoad, &QPushButton::clicked, this, &EditProfileDialog::loadCalcurve); - connect(ui->pushButtonLightmapLoad, &QPushButton::clicked, this, &EditProfileDialog::loadCalcurve); + connect(ui->pushButtonLightmapLoad, &QPushButton::clicked, this, &EditProfileDialog::loadLightmap); + connect(ui->pushButtonCalClear, &QPushButton::clicked, [this](){profile_.calcurve.release(); ui->calLed->setLit(profile_.calcurve.data);}); + connect(ui->pushButtonLightmapClear, &QPushButton::clicked, [this](){profile_.lightmap.release(); ui->ledLightmap->setLit(profile_.lightmap.data);}); ui->listView->setCameras(cameras_->getCameras()); ui->listView->setSelectionMode(QAbstractItemView::SingleSelection); setConfigured(); @@ -66,20 +70,22 @@ void EditProfileDialog::loadLightmap() QString fileName = QFileDialog::getOpenFileName(this, "Open Lightmap", "./", "*.mat"); if(!fileName.isEmpty()) { - profile_.calcurve.release(); + profile_.lightmap.release(); cv::FileStorage matf(fileName.toStdString(), cv::FileStorage::READ); matf["image"]>>profile_.lightmap; - - if(matf.isOpened() && (!profile_.calcurve.data || profile_.calcurve.type() != CV_32FC1)) + matf.release(); + if(matf.isOpened() && (!profile_.lightmap.data || profile_.lightmap.type() != CV_32FC1)) { profile_.lightmap.release(); QMessageBox::warning(this, "Invalid file", "File selected dose not contain a valid lightmap"); } - else if(!profile_.calcurve.data) + else if(!profile_.lightmap.data) { QMessageBox::warning(this, "Can no open", "Can not open file selected"); } - matf.release(); + profile_.lightmap = cv::mean(profile_.lightmap)/profile_.lightmap; + cv::GaussianBlur(profile_.lightmap, profile_.lightmap, cv::Size(51,51), 8); + ui->ledLightmap->setLit(profile_.lightmap.data); } } diff --git a/src/ui/editprofiledialog.ui b/src/ui/editprofiledialog.ui index 25d8a49..a275e2f 100644 --- a/src/ui/editprofiledialog.ui +++ b/src/ui/editprofiledialog.ui @@ -201,6 +201,13 @@ + + + + Lightmap: + + + @@ -230,10 +237,10 @@ - - + + - Lightmap: + Load @@ -253,10 +260,17 @@ - - + + - Load + Clear + + + + + + + Clear diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 2cf7348..6b3b7e8 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -63,7 +63,7 @@ void MainWindow::openImage() if(matf.isOpened() && (!image.data || image.type() != CV_32FC1)) { image.release(); - QMessageBox::warning(this, "Invalid file", "File selected dose not contain a valid lightmap"); + QMessageBox::warning(this, "Invalid file", "File selected dose not contain a valid image"); } else if(!image.data) {