diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2023-06-01 17:45:13 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-01 17:45:13 +0200 |
commit | 171b2d95039ac94c5e6fee603d0c673aba273f6f (patch) | |
tree | 1c00ddd053e75b20df0e1b6c62ec1232ee6d985e | |
parent | 71dbcd16b2b54c695eae1395d65129b037983d0f (diff) | |
parent | 51ebc1a7f860341cd170b4fcc5af6680ce77767a (diff) |
Merge pull request #1665 from tombrazier/chroma_key_saturated
-rw-r--r-- | tracker-pt/FTNoIR_PT_Controls.ui | 445 | ||||
-rw-r--r-- | tracker-pt/ftnoir_tracker_pt_dialog.cpp | 24 | ||||
-rw-r--r-- | tracker-pt/ftnoir_tracker_pt_dialog.h | 2 | ||||
-rw-r--r-- | tracker-pt/lang/nl_NL.ts | 8 | ||||
-rw-r--r-- | tracker-pt/lang/ru_RU.ts | 8 | ||||
-rw-r--r-- | tracker-pt/lang/stub.ts | 8 | ||||
-rw-r--r-- | tracker-pt/lang/zh_CN.ts | 8 | ||||
-rw-r--r-- | tracker-pt/module/point_extractor.cpp | 38 | ||||
-rw-r--r-- | tracker-pt/module/point_extractor.h | 2 | ||||
-rw-r--r-- | tracker-pt/pt-settings.hpp | 2 |
10 files changed, 341 insertions, 204 deletions
diff --git a/tracker-pt/FTNoIR_PT_Controls.ui b/tracker-pt/FTNoIR_PT_Controls.ui index 4cf4344c..3f83b68c 100644 --- a/tracker-pt/FTNoIR_PT_Controls.ui +++ b/tracker-pt/FTNoIR_PT_Controls.ui @@ -10,7 +10,7 @@ <x>0</x> <y>0</y> <width>413</width> - <height>575</height> + <height>630</height> </rect> </property> <property name="sizePolicy"> @@ -79,21 +79,47 @@ <string>Camera settings</string> </property> <layout class="QGridLayout" name="gridLayout_2"> - <item row="8" column="1"> - <widget class="QPushButton" name="camera_settings"> + <item row="11" column="1"> + <widget class="QCheckBox" name="chroma_key_overexposed"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="5" column="0"> + <widget class="QLabel" name="label_4"> <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> + <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> + <property name="cursor"> + <cursorShape>WhatsThisCursor</cursorShape> + </property> + <property name="toolTip"> + <string>This should be 56° or 76° for the PS3 Eye, dependent upon the physical lens setting. It's only neccessary to get position correspond to real-world values.</string> + </property> <property name="text"> - <string>Open</string> + <string>Diagonal field of view</string> </property> </widget> </item> - <item row="5" column="0"> - <widget class="QLabel" name="label_4"> + <item row="6" column="0"> + <widget class="QLabel" name="label_5"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Dynamic pose (for caps only, never clips)</string> + </property> + </widget> + </item> + <item row="9" column="0"> + <widget class="QLabel" name="label_12"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> <horstretch>0</horstretch> @@ -104,23 +130,49 @@ <cursorShape>WhatsThisCursor</cursorShape> </property> <property name="toolTip"> - <string>This should be 56° or 76° for the PS3 Eye, dependent upon the physical lens setting. It's only neccessary to get position correspond to real-world values.</string> + <string><html><head/><body><p>For LEDs, 'Natural' is the fastest grayscale mode thanks to optimized SIMD code. Color key allows to track regular pieces of colored paper.</p></body></html></string> </property> <property name="text"> - <string>Diagonal field of view</string> + <string>Color channels used</string> </property> </widget> </item> - <item row="8" column="0"> - <widget class="QLabel" name="label_9"> + <item row="8" column="1"> + <widget class="QPushButton" name="camera_settings"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Open</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QCheckBox" name="use_mjpeg"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="label_13"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> + <property name="cursor"> + <cursorShape>WhatsThisCursor</cursorShape> + </property> + <property name="toolTip"> + <string>Enable MJPEG compression for high-speed cameras other than the PS3 Eye. Windows only.</string> + </property> <property name="text"> - <string>Camera settings (when available)</string> + <string>MJPEG compression</string> </property> </widget> </item> @@ -153,73 +205,15 @@ </property> </widget> </item> - <item row="9" column="1"> - <widget class="QComboBox" name="blob_color"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <item row="11" column="0"> + <widget class="QLabel" name="label_16"> + <property name="text"> + <string>Chroma key includes overexposed pixels</string> </property> - <item> - <property name="text"> - <string>Grayscale BT.709</string> - </property> - </item> - <item> - <property name="text"> - <string>Grayscale (from hardware)</string> - </property> - </item> - <item> - <property name="text"> - <string>Red only</string> - </property> - </item> - <item> - <property name="text"> - <string>Green only</string> - </property> - </item> - <item> - <property name="text"> - <string>Blue only</string> - </property> - </item> - <item> - <property name="text"> - <string>Red chroma key</string> - </property> - </item> - <item> - <property name="text"> - <string>Green chroma key</string> - </property> - </item> - <item> - <property name="text"> - <string>Blue chroma key</string> - </property> - </item> - <item> - <property name="text"> - <string>Cyan chroma key</string> - </property> - </item> - <item> - <property name="text"> - <string>Yellow chroma key</string> - </property> - </item> - <item> - <property name="text"> - <string>Magenta chroma key</string> - </property> - </item> </widget> </item> - <item row="2" column="0"> - <widget class="QLabel" name="label_41"> + <item row="8" column="0"> + <widget class="QLabel" name="label_9"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> <horstretch>0</horstretch> @@ -227,20 +221,26 @@ </sizepolicy> </property> <property name="text"> - <string>Height</string> + <string>Camera settings (when available)</string> </property> </widget> </item> - <item row="6" column="0"> - <widget class="QLabel" name="label_5"> + <item row="7" column="1"> + <widget class="QSpinBox" name="init_phase_timeout"> <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> + <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="text"> - <string>Dynamic pose (for caps only, never clips)</string> + <property name="suffix"> + <string> ms</string> + </property> + <property name="minimum"> + <number>50</number> + </property> + <property name="maximum"> + <number>5000</number> </property> </widget> </item> @@ -257,8 +257,8 @@ </property> </widget> </item> - <item row="2" column="1"> - <widget class="QSpinBox" name="res_y_spin"> + <item row="1" column="1"> + <widget class="QSpinBox" name="res_x_spin"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> <horstretch>0</horstretch> @@ -266,7 +266,7 @@ </sizepolicy> </property> <property name="toolTip"> - <string>Desired capture height</string> + <string>Desired capture width</string> </property> <property name="suffix"> <string> px</string> @@ -279,22 +279,16 @@ </property> </widget> </item> - <item row="9" column="0"> - <widget class="QLabel" name="label_12"> + <item row="7" column="0"> + <widget class="QLabel" name="label_6"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="cursor"> - <cursorShape>WhatsThisCursor</cursorShape> - </property> - <property name="toolTip"> - <string><html><head/><body><p>For LEDs, 'Natural' is the fastest grayscale mode thanks to optimized SIMD code. Color key allows to track regular pieces of colored paper.</p></body></html></string> - </property> <property name="text"> - <string>Color channels used</string> + <string>Dynamic pose timeout</string> </property> </widget> </item> @@ -311,25 +305,32 @@ </property> </widget> </item> - <item row="1" column="1"> - <widget class="QSpinBox" name="res_x_spin"> + <item row="0" column="0"> + <widget class="QLabel" name="label_2"> <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> + <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip"> - <string>Desired capture width</string> + <property name="text"> + <string>Device</string> </property> - <property name="suffix"> - <string> px</string> + <property name="buddy"> + <cstring>camdevice_combo</cstring> </property> - <property name="maximum"> - <number>2000</number> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_41"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> </property> - <property name="singleStep"> - <number>10</number> + <property name="text"> + <string>Height</string> </property> </widget> </item> @@ -352,23 +353,69 @@ </property> </widget> </item> - <item row="7" column="1"> - <widget class="QSpinBox" name="init_phase_timeout"> + <item row="9" column="1"> + <widget class="QComboBox" name="blob_color"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="suffix"> - <string> ms</string> - </property> - <property name="minimum"> - <number>50</number> - </property> - <property name="maximum"> - <number>5000</number> - </property> + <item> + <property name="text"> + <string>Grayscale BT.709</string> + </property> + </item> + <item> + <property name="text"> + <string>Grayscale (from hardware)</string> + </property> + </item> + <item> + <property name="text"> + <string>Red only</string> + </property> + </item> + <item> + <property name="text"> + <string>Green only</string> + </property> + </item> + <item> + <property name="text"> + <string>Blue only</string> + </property> + </item> + <item> + <property name="text"> + <string>Red chroma key</string> + </property> + </item> + <item> + <property name="text"> + <string>Green chroma key</string> + </property> + </item> + <item> + <property name="text"> + <string>Blue chroma key</string> + </property> + </item> + <item> + <property name="text"> + <string>Cyan chroma key</string> + </property> + </item> + <item> + <property name="text"> + <string>Yellow chroma key</string> + </property> + </item> + <item> + <property name="text"> + <string>Magenta chroma key</string> + </property> + </item> </widget> </item> <item row="5" column="1"> @@ -393,60 +440,70 @@ </property> </widget> </item> - <item row="0" column="0"> - <widget class="QLabel" name="label_2"> + <item row="2" column="1"> + <widget class="QSpinBox" name="res_y_spin"> <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> + <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="text"> - <string>Device</string> + <property name="toolTip"> + <string>Desired capture height</string> </property> - <property name="buddy"> - <cstring>camdevice_combo</cstring> + <property name="suffix"> + <string> px</string> </property> - </widget> - </item> - <item row="7" column="0"> - <widget class="QLabel" name="label_6"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <property name="maximum"> + <number>2000</number> </property> - <property name="text"> - <string>Dynamic pose timeout</string> + <property name="singleStep"> + <number>10</number> </property> </widget> </item> - <item row="4" column="0"> - <widget class="QLabel" name="label_13"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="cursor"> - <cursorShape>WhatsThisCursor</cursorShape> - </property> - <property name="toolTip"> - <string>Enable MJPEG compression for high-speed cameras other than the PS3 Eye. Windows only.</string> - </property> + <item row="10" column="0"> + <widget class="QLabel" name="label_17"> <property name="text"> - <string>MJPEG compression</string> + <string>Chroma key strength</string> </property> </widget> </item> - <item row="4" column="1"> - <widget class="QCheckBox" name="use_mjpeg"> - <property name="text"> - <string/> - </property> - </widget> + <item row="10" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QSlider" name="chroma_key_strength_slider"> + <property name="minimum"> + <number>5</number> + </property> + <property name="maximum"> + <number>40</number> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="chroma_key_strength_label"> + <property name="focusPolicy"> + <enum>Qt::NoFocus</enum> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + <property name="buttonSymbols"> + <enum>QAbstractSpinBox::NoButtons</enum> + </property> + <property name="minimum"> + <double>0.500000000000000</double> + </property> + <property name="maximum"> + <double>4.000000000000000</double> + </property> + </widget> + </item> + </layout> </item> </layout> </widget> @@ -602,6 +659,26 @@ </property> </widget> </item> + <item row="2" column="1"> + <widget class="QLabel" name="threshold_value_display"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_14"> + <property name="text"> + <string>Value</string> + </property> + </widget> + </item> <item row="3" column="1"> <widget class="QDoubleSpinBox" name="mindiam_spin"> <property name="sizePolicy"> @@ -624,26 +701,6 @@ </property> </widget> </item> - <item row="2" column="1"> - <widget class="QLabel" name="threshold_value_display"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string/> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="label_14"> - <property name="text"> - <string>Value</string> - </property> - </widget> - </item> </layout> </widget> </item> @@ -1635,55 +1692,55 @@ Don't roll or change position.</string> <string>Status</string> </property> <layout class="QGridLayout" name="gridLayout_10"> - <item row="1" column="0"> - <widget class="QLabel" name="label_3"> + <item row="1" column="1"> + <widget class="QLabel" name="pointinfo_label"> <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> + <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> - <string>Extracted Points:</string> + <string/> </property> </widget> </item> - <item row="0" column="0"> - <widget class="QLabel" name="label_38"> + <item row="0" column="1"> + <widget class="QLabel" name="caminfo_label"> <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> + <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> - <string>Camera Info:</string> + <string/> </property> </widget> </item> - <item row="1" column="1"> - <widget class="QLabel" name="pointinfo_label"> + <item row="1" column="0"> + <widget class="QLabel" name="label_3"> <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> + <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> - <string/> + <string>Extracted Points:</string> </property> </widget> </item> - <item row="0" column="1"> - <widget class="QLabel" name="caminfo_label"> + <item row="0" column="0"> + <widget class="QLabel" name="label_38"> <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> + <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> - <string/> + <string>Camera Info:</string> </property> </widget> </item> @@ -1717,6 +1774,8 @@ Don't roll or change position.</string> <tabstop>init_phase_timeout</tabstop> <tabstop>camera_settings</tabstop> <tabstop>blob_color</tabstop> + <tabstop>chroma_key_strength_slider</tabstop> + <tabstop>chroma_key_overexposed</tabstop> <tabstop>auto_threshold</tabstop> <tabstop>threshold_slider</tabstop> <tabstop>mindiam_spin</tabstop> @@ -1743,10 +1802,6 @@ Don't roll or change position.</string> <tabstop>point_filter_slider</tabstop> <tabstop>point_filter_limit_slider</tabstop> <tabstop>point_filter_deadzone_slider</tabstop> - <tabstop>maxdiam_spin</tabstop> - <tabstop>mindiam_spin</tabstop> - <tabstop>auto_threshold</tabstop> - <tabstop>threshold_slider</tabstop> </tabstops> <resources> <include location="module/tracker_pt.qrc"/> diff --git a/tracker-pt/ftnoir_tracker_pt_dialog.cpp b/tracker-pt/ftnoir_tracker_pt_dialog.cpp index 160eb831..d67f79a7 100644 --- a/tracker-pt/ftnoir_tracker_pt_dialog.cpp +++ b/tracker-pt/ftnoir_tracker_pt_dialog.cpp @@ -110,6 +110,16 @@ TrackerDialog_PT::TrackerDialog_PT(const QString& module_name) : tie_setting(s.blob_color, ui.blob_color); + tie_setting(s.chroma_key_strength, ui.chroma_key_strength_slider); + connect(&s.chroma_key_strength, value_::value_changed<slider_value>(), ui.chroma_key_strength_label, + [this] { ui.chroma_key_strength_label->setValue(*s.chroma_key_strength); }); + ui.chroma_key_strength_label->setValue(*s.chroma_key_strength); + + tie_setting(s.chroma_key_overexposed, ui.chroma_key_overexposed); + connect(ui.blob_color, &QComboBox::currentTextChanged, this, &TrackerDialog_PT::chroma_key_controls_enable); + + chroma_key_controls_enable(""); + tie_setting(s.threshold_slider, ui.threshold_value_display, [this](const slider_value& val) { return threshold_display_text(int(val)); }); @@ -248,6 +258,20 @@ void TrackerDialog_PT::show_camera_settings() (void)video::show_dialog(s.camera_name); } +void TrackerDialog_PT::chroma_key_controls_enable(const QString&) +{ + bool enabled = false; + QVariant data = ui.blob_color->currentData(); + if (data.isValid()) + { + pt_color_type blob_color = pt_color_type(data.toInt()); + enabled = blob_color >= pt_color_red_chromakey && blob_color <= pt_color_magenta_chromakey; + } + ui.chroma_key_strength_slider->setEnabled(enabled); + ui.chroma_key_strength_label->setEnabled(enabled); + ui.chroma_key_overexposed->setEnabled(enabled); +} + void TrackerDialog_PT::trans_calib_step() { QMutexLocker l(&calibrator_mutex); diff --git a/tracker-pt/ftnoir_tracker_pt_dialog.h b/tracker-pt/ftnoir_tracker_pt_dialog.h index f4b0ff8c..79cd91bd 100644 --- a/tracker-pt/ftnoir_tracker_pt_dialog.h +++ b/tracker-pt/ftnoir_tracker_pt_dialog.h @@ -39,6 +39,8 @@ public slots: void poll_tracker_info_impl(); void set_camera_settings_available(const QString& camera_name); void show_camera_settings(); + void chroma_key_controls_enable(const QString&); + protected: QString threshold_display_text(int threshold_value); diff --git a/tracker-pt/lang/nl_NL.ts b/tracker-pt/lang/nl_NL.ts index 90383b97..fc44b0f1 100644 --- a/tracker-pt/lang/nl_NL.ts +++ b/tracker-pt/lang/nl_NL.ts @@ -304,6 +304,14 @@ Don't roll or change position.</source> <source>Filter</source> <translation type="unfinished"></translation> </message> + <message> + <source>Chroma key includes overexposed pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Chroma key strength</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>pt_impl::TrackerDialog_PT</name> diff --git a/tracker-pt/lang/ru_RU.ts b/tracker-pt/lang/ru_RU.ts index b7146449..7ff4657e 100644 --- a/tracker-pt/lang/ru_RU.ts +++ b/tracker-pt/lang/ru_RU.ts @@ -309,6 +309,14 @@ ROLL или X/Y-смещения.</translation> <source>Filter</source> <translation type="unfinished"></translation> </message> + <message> + <source>Chroma key includes overexposed pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Chroma key strength</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>pt_impl::TrackerDialog_PT</name> diff --git a/tracker-pt/lang/stub.ts b/tracker-pt/lang/stub.ts index 3d5e9ae7..3dbe208d 100644 --- a/tracker-pt/lang/stub.ts +++ b/tracker-pt/lang/stub.ts @@ -304,6 +304,14 @@ Don't roll or change position.</source> <source>Filter</source> <translation type="unfinished"></translation> </message> + <message> + <source>Chroma key includes overexposed pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Chroma key strength</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>pt_impl::TrackerDialog_PT</name> diff --git a/tracker-pt/lang/zh_CN.ts b/tracker-pt/lang/zh_CN.ts index d8aff4b5..3519d719 100644 --- a/tracker-pt/lang/zh_CN.ts +++ b/tracker-pt/lang/zh_CN.ts @@ -304,6 +304,14 @@ Don't roll or change position.</source> <source>Filter</source> <translation type="unfinished"></translation> </message> + <message> + <source>Chroma key includes overexposed pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Chroma key strength</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>pt_impl::TrackerDialog_PT</name> diff --git a/tracker-pt/module/point_extractor.cpp b/tracker-pt/module/point_extractor.cpp index 17819d78..3329fafc 100644 --- a/tracker-pt/module/point_extractor.cpp +++ b/tracker-pt/module/point_extractor.cpp @@ -11,6 +11,7 @@ #include "frame.hpp" #include "cv/numeric.hpp" #include "compat/math.hpp" +#include "compat/math-imports.hpp" #include <opencv2/imgproc.hpp> @@ -111,11 +112,31 @@ void PointExtractor::extract_single_channel(const cv::Mat& orig_frame, int idx, cv::mixChannels(&orig_frame, 1, &dest, 1, from_to, 1); } -void PointExtractor::filter_single_channel(const cv::Mat& orig_frame, float r, float g, float b, cv::Mat1b& dest) +void PointExtractor::filter_single_channel(const cv::Mat& orig_frame, float r, float g, float b, bool overexp, cv::Mat1b& dest) { ensure_channel_buffers(orig_frame); - cv::transform(orig_frame, dest, cv::Mat(cv::Matx13f(b, g, r))); + // just filter for colour or also include overexposed regions? + if (!overexp) + cv::transform(orig_frame, dest, cv::Mat(cv::Matx13f(b, g, r))); + else + { + for (int i = 0; i < orig_frame.rows; i++) + { + cv::Vec3b const* const __restrict orig_ptr = orig_frame.ptr<cv::Vec3b>(i); + uint8_t* const __restrict dest_ptr = dest.ptr(i); + for (int j = 0; j < orig_frame.cols; j++) + { + // get the intensity of the key color (i.e. +ve coefficients) + uchar blue = orig_ptr[j][0], green = orig_ptr[j][1], red = orig_ptr[j][2]; + float key = std::max(b, 0.0f) * blue + std::max(g, 0.0f) * green + std::max(r, 0.0f) * red; + // get the intensity of the non-key color (i.e. -ve coefficients) + float nonkey = std::max(-b, 0.0f) * blue + std::max(-g, 0.0f) * green + std::max(-r, 0.0f) * red; + // the result is key color minus non-key color inversely weighted by key colour intensity + dest_ptr[j] = std::max(0.0f, std::min(255.0f, key - (255.0f - key) / 255.0f * nonkey)); + } + } + } } void PointExtractor::color_to_grayscale(const cv::Mat& frame, cv::Mat1b& output) @@ -127,6 +148,7 @@ void PointExtractor::color_to_grayscale(const cv::Mat& frame, cv::Mat1b& output) return; } + const float half_chr_key_str = *s.chroma_key_strength * 0.5; switch (s.blob_color) { case pt_color_green_only: @@ -146,32 +168,32 @@ void PointExtractor::color_to_grayscale(const cv::Mat& frame, cv::Mat1b& output) } case pt_color_red_chromakey: { - filter_single_channel(frame, 1, -0.5, -0.5, output); + filter_single_channel(frame, 1, -half_chr_key_str, -half_chr_key_str, s.chroma_key_overexposed, output); break; } case pt_color_green_chromakey: { - filter_single_channel(frame, -0.5, 1, -0.5, output); + filter_single_channel(frame, -half_chr_key_str, 1, -half_chr_key_str, s.chroma_key_overexposed, output); break; } case pt_color_blue_chromakey: { - filter_single_channel(frame, -0.5, -0.5, 1, output); + filter_single_channel(frame, -half_chr_key_str, -half_chr_key_str, 1, s.chroma_key_overexposed, output); break; } case pt_color_cyan_chromakey: { - filter_single_channel(frame, -1, 0.5, 0.5, output); + filter_single_channel(frame, -*s.chroma_key_strength, 0.5, 0.5, s.chroma_key_overexposed, output); break; } case pt_color_yellow_chromakey: { - filter_single_channel(frame, 0.5, 0.5, -1, output); + filter_single_channel(frame, 0.5, 0.5, -*s.chroma_key_strength, s.chroma_key_overexposed, output); break; } case pt_color_magenta_chromakey: { - filter_single_channel(frame, 0.5, -1, 0.5, output); + filter_single_channel(frame, 0.5, -*s.chroma_key_strength, 0.5, s.chroma_key_overexposed, output); break; } case pt_color_hardware: diff --git a/tracker-pt/module/point_extractor.h b/tracker-pt/module/point_extractor.h index 3f7fb4ee..fbfdbb0b 100644 --- a/tracker-pt/module/point_extractor.h +++ b/tracker-pt/module/point_extractor.h @@ -51,7 +51,7 @@ private: void ensure_buffers(const cv::Mat& frame); void extract_single_channel(const cv::Mat& orig_frame, int idx, cv::Mat1b& dest); - void filter_single_channel(const cv::Mat& orig_frame, float r, float g, float b, cv::Mat1b& dest); + void filter_single_channel(const cv::Mat& orig_frame, float r, float g, float b, bool overexp, cv::Mat1b& dest); void color_to_grayscale(const cv::Mat& frame, cv::Mat1b& output); void threshold_image(const cv::Mat& frame_gray, cv::Mat1b& output); diff --git a/tracker-pt/pt-settings.hpp b/tracker-pt/pt-settings.hpp index 6f7a18d5..5d16d973 100644 --- a/tracker-pt/pt-settings.hpp +++ b/tracker-pt/pt-settings.hpp @@ -65,6 +65,8 @@ struct pt_settings final : options::opts value<bool> auto_threshold { b, "automatic-threshold", true }; value<pt_color_type> blob_color { b, "blob-color", pt_color_bt709 }; value<bool> use_mjpeg { b, "use-mjpeg", false }; + value<slider_value> chroma_key_strength{ b, "chroma-key-strength", { 1.0, 0.5, 4. } }; + value<bool> chroma_key_overexposed{ b, "chroma-key-overexposed", false }; value<slider_value> threshold_slider { b, "threshold-slider", { 128, 0, 255 } }; |