From 07e6b6611dc31cbc579430779f5d906bbe1b8eab Mon Sep 17 00:00:00 2001 From: uvos Date: Fri, 9 Jul 2021 12:18:43 +0200 Subject: [PATCH] fix comand line parser bug add statistics dialog add ability to zoom in on image viewer --- CMakeLists.txt | 7 +- src/main.cpp | 2 +- src/profile.h | 2 +- src/ui/cvimageviewer.cpp | 177 ++++++++++++++++++++++++++++++----- src/ui/cvimageviewer.h | 15 +++ src/ui/cvimageviewer.ui | 28 ------ src/ui/editprofiledialog.cpp | 5 +- src/ui/mainwindow.cpp | 3 +- src/ui/mainwindow.h | 2 + src/ui/mainwindow.ui | 12 +++ 10 files changed, 196 insertions(+), 57 deletions(-) delete mode 100644 src/ui/cvimageviewer.ui diff --git a/CMakeLists.txt b/CMakeLists.txt index f4e3825..07e78c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,7 +40,6 @@ set(PROJECT_SOURCES src/ui/mainwindow.ui src/ui/cvimageviewer.cpp src/ui/cvimageviewer.h - src/ui/cvimageviewer.ui src/ui/led.cpp src/ui/led.h src/ui/cameralistwidget.h @@ -48,6 +47,12 @@ set(PROJECT_SOURCES src/ui/configurecameradialog.cpp src/ui/configurecameradialog.h src/ui/configurecameradialog.ui + src/ui/aboutdiag.h + src/ui/aboutdiag.cpp + src/ui/aboutdiag.ui + src/ui/statisticsdialog.h + src/ui/statisticsdialog.cpp + src/ui/statisticsdialog.ui ) diff --git a/src/main.cpp b/src/main.cpp index 94d3d58..8cfa4e1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -82,7 +82,7 @@ int main(int argc, char *argv[]) parser.addOption(simpleStichOption); QCommandLineOption quirkDurationOption(QStringList() << "d" << "quirk-duration", QCoreApplication::translate("main", "PhotonFocus quirk duration time"), QCoreApplication::translate("main", "time")); parser.addOption(quirkDurationOption); - QCommandLineOption cameraBootDurationOption(QStringList() << "d" << "quirk-duration", QCoreApplication::translate("main", "Camera boot time"), QCoreApplication::translate("main", "time")); + QCommandLineOption cameraBootDurationOption(QStringList() << "t" << "boot-duration", QCoreApplication::translate("main", "Camera boot time"), QCoreApplication::translate("main", "time")); parser.addOption(cameraBootDurationOption); parser.process(a); diff --git a/src/profile.h b/src/profile.h index 3b73a10..3b73827 100644 --- a/src/profile.h +++ b/src/profile.h @@ -49,7 +49,7 @@ public: std::vector cameras; bool nodistort = false; - Profile(const QString& name = "Unamed"); + Profile(const QString& name = ""); void store(QSettings& settings) const; void store(const QString& name); void store(); diff --git a/src/ui/cvimageviewer.cpp b/src/ui/cvimageviewer.cpp index 1133582..fab68d6 100644 --- a/src/ui/cvimageviewer.cpp +++ b/src/ui/cvimageviewer.cpp @@ -4,16 +4,28 @@ #include #include #include +#include CvImageViewer::CvImageViewer(QWidget *parent, size_t lastId) : QWidget(parent), lastId_(lastId), - saveAction_("Save Image", nullptr) + saveAction_("Save Image", nullptr), + zoomAction_("Zoom to selection", nullptr), + resetAction_("Reset Zoom", nullptr), + statisticsAction_("Get selection properties", nullptr), + roi_(0,0,0,0) { - connect(&saveAction_, &QAction::triggered, this, &CvImageViewer::saveImage); qimage_.load(":/images/noimage.png"); + connect(&saveAction_, &QAction::triggered, this, &CvImageViewer::saveImage); + connect(&zoomAction_, &QAction::triggered, this, &CvImageViewer::zoomToSelection); + connect(&resetAction_, &QAction::triggered, this, &CvImageViewer::resetZoom); + connect(&statisticsAction_, &QAction::triggered, this, &CvImageViewer::showSatDiag); + imageContextMenu_.addAction(&saveAction_); + imageContextMenu_.addAction(&zoomAction_); + imageContextMenu_.addAction(&resetAction_); + imageContextMenu_.addAction(&statisticsAction_); } CvImageViewer::~CvImageViewer() @@ -50,62 +62,177 @@ void CvImageViewer::saveImage() } } -void CvImageViewer::setImage(Camera::Image img) +void CvImageViewer::showSatDiag() { - image_ = img.mat; - origImage_=img.mat; - qDebug()<<"viwer got"< 1 || selectionRect_.width() < 2 || selectionRect_.height() < 2) + return; + + int xA; + int yA; + int xB; + int yB; + transfromToSourceCoordinates(selectionRect_.x(), selectionRect_.y(), xA, yA); + transfromToSourceCoordinates(selectionRect_.x()+selectionRect_.width(), selectionRect_.y()+selectionRect_.height(), xB, yB); + selectionRect_ = QRect(0, 0, 0, 0); + cv::Rect roi(xA, yA, xB-xA, yB-yA); + + cv::Mat roiImage = origImage_(roi); + if(roiImage.type() != CV_64FC1) + roiImage.convertTo(roiImage, CV_64FC1); + + std::vector data; + data.reserve(roiImage.total()); + for (cv::MatIterator_ it = roiImage.begin(); it != roiImage.end(); ++it) + data.push_back(*it); + + StatisticsDialog diag(data, this); + diag.show(); + diag.exec(); +} + +void CvImageViewer::convertImage(cv::Mat image) +{ + image_ = image; if(image_.type() == CV_8UC3 || image_.type() == CV_8SC3) { qimage_ = QImage(image_.data, image_.cols, image_.rows, image_.step, QImage::Format_RGB888); + statisticsAction_.setDisabled(true); } else if(image_.type() == CV_8UC1 || image_.type() == CV_8SC1) { qimage_ = QImage(image_.data, image_.cols, image_.rows, image_.step, QImage::Format_Grayscale8); + statisticsAction_.setDisabled(false); } else if(image_.type() == CV_32FC1 || image_.type() == CV_64FC1) { double min, max; - cv::minMaxIdx(img.mat, &min, &max); + cv::minMaxIdx(image_, &min, &max); double a = 255.0/(max - min); double b = 0-(min*a); qDebug()<(imgrect_.width())*roi_.width; + outY = roi_.y+(inY-imgrect_.y())/static_cast(imgrect_.height())*roi_.height; +} + + +void CvImageViewer::resetZoom() +{ + selectionRect_ = QRect(0, 0, 0, 0); + convertImage(origImage_); + update(); + roi_ = cv::Rect(0, 0, image_.size().width, image_.size().height); +} + +void CvImageViewer::zoomToSelection() +{ + if(selectionRect_.width() > 2 && selectionRect_.height() > 2) + { + convertImage(origImage_); + int xA; + int yA; + int xB; + int yB; + transfromToSourceCoordinates(selectionRect_.x(), selectionRect_.y(), xA, yA); + transfromToSourceCoordinates(selectionRect_.x()+selectionRect_.width(), selectionRect_.y()+selectionRect_.height(), xB, yB); + selectionRect_ = QRect(0, 0, 0, 0); + roi_ = cv::Rect(xA, yA, xB-xA, yB-yA); + cv::Mat cropped; + cropped = image_(roi_); + convertImage(cropped); + update(); + } } void CvImageViewer::mousePressEvent(QMouseEvent *event) { - if(event->button() == Qt::RightButton) + if(origImage_.data) { - saveAction_.setEnabled(origImage_.data); - imageContextMenu_.popup(event->globalPos()); - } - else if(origImage_.data && event->x() > imgrect_.x() && event->y() > imgrect_.y() && event->x() < imgrect_.x()+imgrect_.width() && event->y() < imgrect_.y()+imgrect_.height()) - { - int x = (event->x()-imgrect_.x())/static_cast(imgrect_.width())*origImage_.cols; - int y = (event->y()-imgrect_.y())/static_cast(imgrect_.height())*origImage_.rows; - qDebug()<button() == Qt::RightButton) { - if(x >= 0 && y >= 0 && x <= origImage_.cols && y < origImage_.rows) - sigValue(x, y, origImage_.at(y,x)); + saveAction_.setEnabled(origImage_.data); + imageContextMenu_.popup(event->globalPos()); } - else + else if(origImage_.data && event->x() > imgrect_.x() && event->y() > imgrect_.y() && event->x() < imgrect_.x()+imgrect_.width() && event->y() < imgrect_.y()+imgrect_.height()) { - sigValue(x, y, 0); + selectionStarted_ = true; + selectionRect_.setTopLeft(event->pos()); + selectionRect_.setBottomRight(event->pos()); + int x; + int y; + transfromToSourceCoordinates(event->x(), event->y(), x, y); + if(origImage_.type() == CV_32FC1) + { + if(x >= 0 && y >= 0 && x <= origImage_.cols && y < origImage_.rows) + sigValue(x, y, origImage_.at(y,x)); + } + else + { + sigValue(x, y, 0); + } } } QWidget::mousePressEvent(event); } +void CvImageViewer::mouseMoveEvent(QMouseEvent *event) +{ + if(selectionStarted_) + { + if(event->x() > imgrect_.x() && event->y() > imgrect_.y() && event->x() < imgrect_.x()+imgrect_.width() && event->y() < imgrect_.y()+imgrect_.height()) + { + selectionRect_.setBottomRight(event->pos()); + repaint(); + } + } +} + +void CvImageViewer::mouseReleaseEvent(QMouseEvent *event) +{ + selectionStarted_ = false; + QWidget::mouseReleaseEvent(event); +} + +void CvImageViewer::resizeEvent(QResizeEvent *event) +{ + selectionRect_ = QRect(0, 0, 0, 0); + QWidget::resizeEvent(event); +} + void CvImageViewer::paintEvent(QPaintEvent* event) { Q_UNUSED(event) @@ -117,4 +244,8 @@ void CvImageViewer::paintEvent(QPaintEvent* event) else imgrect_.setRect((rect().width()-rect().height()/ratio)/2, 0, rect().height()/ratio, rect().height()); painter.drawImage(imgrect_, qimage_); + + painter.setPen(QPen(QBrush(QColor(0,0,0,180)),1,Qt::DashLine)); + painter.setBrush(QBrush(QColor(255,255,255,120))); + painter.drawRect(selectionRect_); } diff --git a/src/ui/cvimageviewer.h b/src/ui/cvimageviewer.h index f932a99..9dac4cb 100644 --- a/src/ui/cvimageviewer.h +++ b/src/ui/cvimageviewer.h @@ -18,14 +18,29 @@ private: size_t lastId_; QMenu imageContextMenu_; QAction saveAction_; + QAction zoomAction_; + QAction resetAction_; + QAction statisticsAction_; QRect imgrect_; + cv::Rect roi_; + QRect selectionRect_; + bool selectionStarted_ = false; + + void transfromToSourceCoordinates(int inX, int inY, int& outX, int& outY); + void convertImage(cv::Mat image); private slots: void saveImage(); + void zoomToSelection(); + void resetZoom(); + void showSatDiag(); protected: virtual void paintEvent(QPaintEvent* event) override; virtual void mousePressEvent(QMouseEvent *event) override; + virtual void mouseMoveEvent(QMouseEvent *event) override; + virtual void mouseReleaseEvent(QMouseEvent *event) override; + virtual void resizeEvent(QResizeEvent *event) override; signals: void sigValue(size_t x, size_t y, double value); diff --git a/src/ui/cvimageviewer.ui b/src/ui/cvimageviewer.ui deleted file mode 100644 index 4ecee63..0000000 --- a/src/ui/cvimageviewer.ui +++ /dev/null @@ -1,28 +0,0 @@ - - - CvImageViewer - - - - 0 - 0 - 400 - 300 - - - - Form - - - - - - - - - - - - - - diff --git a/src/ui/editprofiledialog.cpp b/src/ui/editprofiledialog.cpp index 6d63704..fef18d9 100644 --- a/src/ui/editprofiledialog.cpp +++ b/src/ui/editprofiledialog.cpp @@ -15,8 +15,9 @@ EditProfileDialog::EditProfileDialog(Cameras* cameras, const Profile profile, QW ui(new Ui::EditProfileDialog) { ui->setupUi(this); - - ui->lineEditName->setText(profile_.getName()); + QString name = profile_.getName(); + if(!name.isEmpty()) + ui->lineEditName->setText(name); ui->doubleSpinBoxBrightness->setValue(profile_.lighting.brightness*100.0); ui->doubleSpinBoxExposure->setValue(profile_.exposureTime); diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index dd8aed5..bb30fa3 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -9,6 +9,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) + , about_(this) , ui(new Ui::MainWindow) { ui->setupUi(this); @@ -22,9 +23,9 @@ MainWindow::MainWindow(QWidget *parent) connect(ui->mainViewer, &CvImageViewer::sigValue, this, &MainWindow::setImageValue); connect(ui->actionOpen, &QAction::triggered, [this](bool checked){(void)checked; openImage();}); connect(ui->actionSave_2, &QAction::triggered, [this](bool checked){(void)checked; saveImage();}); + connect(ui->actionAbout, &QAction::triggered, [this](bool checked){(void)checked; about_.show();}); refreshProfiles(); } - void MainWindow::setImageValue(size_t x, size_t y, double value) { ui->lcdNumber_3->display((double)x); diff --git a/src/ui/mainwindow.h b/src/ui/mainwindow.h index f245063..effa831 100644 --- a/src/ui/mainwindow.h +++ b/src/ui/mainwindow.h @@ -5,6 +5,7 @@ #include #include "../cameras.h" #include "cvimageviewer.h" +#include "aboutdiag.h" QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } @@ -15,6 +16,7 @@ class MainWindow : public QMainWindow Q_OBJECT private: std::vector viewers_; + AboutDiag about_; private slots: void setImageValue(size_t x, size_t y, double value); diff --git a/src/ui/mainwindow.ui b/src/ui/mainwindow.ui index 0378a26..a662687 100644 --- a/src/ui/mainwindow.ui +++ b/src/ui/mainwindow.ui @@ -246,8 +246,15 @@ + + + Help + + + + @@ -289,6 +296,11 @@ Ctrl+O + + + About + +