From cec42f91d7c064b6e1ec9087b5d6360c728bade7 Mon Sep 17 00:00:00 2001 From: Patrick Roth Date: Thu, 1 Jul 2021 11:04:05 +0200 Subject: [PATCH] support of horizontal trapeze correction added The horizontal isosceles trapeze perspective correction is supported since color-pipe library version 1.1.0. The horizontal correction weight can be set at the frontend and is forwarded to the color-pipe library. --- QML/ColorPipelineColor.qml | 62 ++++++++++++++++++++++++++++++++++++-- QML/ColorPipelineMono.qml | 57 +++++++++++++++++++++++++++++++++++ imgpromngr.cpp | 21 +++++++++++++ imgpromngr.hpp | 3 ++ imgproworkers.cpp | 19 ++++++++++++ imgproworkers.hpp | 2 ++ 6 files changed, 162 insertions(+), 2 deletions(-) diff --git a/QML/ColorPipelineColor.qml b/QML/ColorPipelineColor.qml index d4cd471..0bb9dab 100644 --- a/QML/ColorPipelineColor.qml +++ b/QML/ColorPipelineColor.qml @@ -42,8 +42,8 @@ Window { x: Screen.width/2-width/2 y: Screen.height/2-height/2 width: 450 - height: 360 - maximumHeight: 360 + height: 400 + maximumHeight: 400 maximumWidth: 450 Component.onCompleted: { @@ -177,6 +177,61 @@ Window { } } } + + ColumnLayout { + CheckBox { + id: trapezecor + text: qsTr("Trapeze correction") + onCheckedChanged: { + if (checked) { + trapezecorr_h_label.opacity = 1 + trapezecorr_h.enabled = true +// trapezecorr_v_label.opacity = 1 +// trapezecorr_v.enabled = true + } + else{ + trapezecorr_h_label.opacity = 0.5 + trapezecorr_h.enabled = false +// trapezecorr_v_label.opacity = 0.5 +// trapezecorr_v.enabled = false + } +// imgpromngr.setTrapezeCor(checked, trapezecorr_h.value, trapezecorr_v.value) + imgpromngr.setTrapezeCor(checked, trapezecorr_h.value, 1.0) + } + } + + RowLayout { + Layout.leftMargin: 25 + Layout.minimumWidth: 300 + + Label { id: trapezecorr_h_label; opacity: 0.5; text: qsTr("horizontal") } + SpinBox { + id: trapezecorr_h + enabled: false + value: 0.0 + minimumValue: -100.0 + stepSize: 1.0 + maximumValue: 100.0 + decimals: 1 + implicitWidth: 70 +// onValueChanged: imgpromngr.setTrapezeCor(trapezecor.checked, value, trapezecorr_v.value) + onValueChanged: imgpromngr.setTrapezeCor(trapezecor.checked, value, 0) + } + +// Label { id: trapezecorr_v_label; opacity: 0.5; text: qsTr("vertical") } +// SpinBox { +// id: trapezecorr_v +// enabled: false +// value: 0.0 +// minimumValue: -100.0 +// stepSize: 1.0 +// maximumValue: 100.0 +// decimals: 1 +// implicitWidth: 70 +// onValueChanged: imgpromngr.setTrapezeCor(trapezecor.checked, trapezecorr_h.value, value) +// } + } + } } } @@ -262,6 +317,9 @@ Gamma correction: Raise all the pixel values to a power, the gamma value. So, de sharp.checked = false gamma.value = 1.2 gammacor.checked = false + trapezecor.checked = false + trapezecorr_h.value = 0.0 +// trapezecorr_v.value = 0.0 } onClosing: help.close() } diff --git a/QML/ColorPipelineMono.qml b/QML/ColorPipelineMono.qml index bbed0bc..2c0776d 100644 --- a/QML/ColorPipelineMono.qml +++ b/QML/ColorPipelineMono.qml @@ -165,6 +165,61 @@ Window { } } } + + ColumnLayout { + CheckBox { + id: trapezecor + text: qsTr("Trapeze correction") + onCheckedChanged: { + if (checked) { + trapezecorr_h_label.opacity = 1 + trapezecorr_h.enabled = true +// trapezecorr_v_label.opacity = 1 +// trapezecorr_v.enabled = true + } + else{ + trapezecorr_h_label.opacity = 0.5 + trapezecorr_h.enabled = false +// trapezecorr_v_label.opacity = 0.5 +// trapezecorr_v.enabled = false + } +// imgpromngr.setTrapezeCor(checked, trapezecorr_h.value, trapezecorr_v.value) + imgpromngr.setTrapezeCor(checked, trapezecorr_h.value, 1.0) + } + } + + RowLayout { + Layout.leftMargin: 25 + Layout.minimumWidth: 300 + + Label { id: trapezecorr_h_label; opacity: 0.5; text: qsTr("horizontal") } + SpinBox { + id: trapezecorr_h + enabled: false + value: 0.0 + minimumValue: -100.0 + stepSize: 1.0 + maximumValue: 100.0 + decimals: 1 + implicitWidth: 70 +// onValueChanged: imgpromngr.setTrapezeCor(trapezecor.checked, value, trapezecorr_v.value) + onValueChanged: imgpromngr.setTrapezeCor(trapezecor.checked, value, 0) + } + +// Label { id: trapezecorr_v_label; opacity: 0.5; text: qsTr("vertical") } +// SpinBox { +// id: trapezecorr_v +// enabled: false +// value: 0.0 +// minimumValue: -100.0 +// stepSize: 1.0 +// maximumValue: 100.0 +// decimals: 1 +// implicitWidth: 70 +// onValueChanged: imgpromngr.setTrapezeCor(trapezecor.checked, trapezecorr_h.value, value) +// } + } + } } } @@ -248,6 +303,8 @@ Gamma correction: Raise all the pixel values to a power, the gamma value. So, de sharp.checked = false gamma.value = 1.2 gammacor.checked = false + trapezecorr_h.value = 0.0 +// trapezecorr_v.value = 0.0 } onClosing: help.close() diff --git a/imgpromngr.cpp b/imgpromngr.cpp index e19fb5d..d482f8f 100644 --- a/imgpromngr.cpp +++ b/imgpromngr.cpp @@ -76,6 +76,8 @@ ImgProMngr::ImgProMngr(QMutex *m_mutex) { connect(this, SIGNAL(disableSharp()), worker[i], SLOT(disableSharp())); connect(this, SIGNAL(enableGammaCor(float)), worker[i], SLOT(enableGammaCor(float))); connect(this, SIGNAL(disableGammaCor()), worker[i], SLOT(disableGammaCor())); + connect(this, SIGNAL(enableTrapezeCor(float, float)), worker[i], SLOT(enableTrapezeCor(float, float))); + connect(this, SIGNAL(disableTrapezeCor()), worker[i], SLOT(disableTrapezeCor())); connect(this, SIGNAL(startProcessing(QByteArray, struct img_header_t, int)), worker[i], SLOT(bufferProcessing(QByteArray, struct img_header_t, int))); worker_thread[i]->start(); } @@ -559,6 +561,24 @@ void ImgProMngr::setGamma(bool a, float gamma) { disableGammaCor(); } +/** + * @brief ImgProMngr::setTrapezeCor + * Called from GUI to enable/disable trapeze perspective correction. + * + * @param enable enabling flag + * @param factH horizontal factor + * @param factV vertical factor + */ +void ImgProMngr::setTrapezeCor(bool enable, float factH, float factV) { + + if(enable) { + enableTrapezeCor(factH, factV); + } + else { + disableTrapezeCor(); + } +} + /** * @brief ImgProMngr::enable * Called from GUI to enable the color pipeline. @@ -589,6 +609,7 @@ void ImgProMngr::resetColorPipeLine() { disableCcm(color_pipeline.ccm_preset); disableGammaCor(); disableSharp(); + disableTrapezeCor(); } /** diff --git a/imgpromngr.hpp b/imgpromngr.hpp index e3891f6..67fa239 100644 --- a/imgpromngr.hpp +++ b/imgpromngr.hpp @@ -68,6 +68,8 @@ signals: void disableSharp(); void enableGammaCor(float gamma); void disableGammaCor(); + void enableTrapezeCor(float factH, float factV); + void disableTrapezeCor(); void startProcessing(QByteArray, struct img_header_t, int); void lostFrame(); @@ -97,6 +99,7 @@ public: Q_INVOKABLE void setCcm(bool a, int ccm_preset); Q_INVOKABLE void setSharp(bool a, float factor, int alg, float sens); Q_INVOKABLE void setGamma(bool a, float gamma); + Q_INVOKABLE void setTrapezeCor(bool enable, float factH, float factV); Q_INVOKABLE void resetColorPipeLine(); Q_INVOKABLE void resetFilters(); Q_INVOKABLE void resetZoomingParameters(); diff --git a/imgproworkers.cpp b/imgproworkers.cpp index 7c70d76..67af3d7 100644 --- a/imgproworkers.cpp +++ b/imgproworkers.cpp @@ -641,6 +641,25 @@ void ImgProWorkers::disableGammaCor() { color_pipe_stageconf_gamma(color_pipe, FALSE, 1.0); } +/** + * @brief ImgProWorkers::enableTrapezeCor + * Enable trapeze correction. + * + * @param factH horizontal correction factor + * @param factV vertical correction factor + */ +void ImgProWorkers::enableTrapezeCor(float factH, float factV) { + color_pipe_stageconf_trapcorr(color_pipe, TRUE, factV, factH); +} + +/** + * @brief ImgProWorkers::disableTrapezeCor + * Disable trapeze correction. + */ +void ImgProWorkers::disableTrapezeCor() { + color_pipe_stageconf_trapcorr(color_pipe, FALSE, 1.0, 1.0); +} + /** * @brief ImgProWorkers::initColorPipeLine * Open color pipeline. Called once in the diff --git a/imgproworkers.hpp b/imgproworkers.hpp index eb25e1a..ddfd632 100644 --- a/imgproworkers.hpp +++ b/imgproworkers.hpp @@ -84,6 +84,8 @@ public slots: void disableSharp(); void enableGammaCor(float gamma); void disableGammaCor(); + void enableTrapezeCor(float factH, float factV); + void disableTrapezeCor(); public: ImgProWorkers(Manager *mngr, QMutex *mutex, int id); -- GitLab