summaryrefslogtreecommitdiffhomepage
path: root/facetracknoir
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2015-06-18 08:45:52 +0200
committerStanislaw Halik <sthalik@misaki.pl>2015-06-18 08:45:52 +0200
commit47a512da1e98b88cd96fc761c567cef4eadd376c (patch)
tree5e1562b547dcf0f7ee3aa8fb9a6f387ce665b204 /facetracknoir
parent33287155bdc7e4beefb45ceef0aaaeb4ecb742a7 (diff)
flush
It crashes after drawing a frame for now.
Diffstat (limited to 'facetracknoir')
-rw-r--r--facetracknoir/options-dialog.cpp123
-rw-r--r--facetracknoir/options-dialog.hpp23
-rw-r--r--facetracknoir/settings.ui514
-rw-r--r--facetracknoir/trans_calib.cpp44
-rw-r--r--facetracknoir/trans_calib.h39
-rw-r--r--facetracknoir/ui.cpp59
-rw-r--r--facetracknoir/ui.h12
7 files changed, 628 insertions, 186 deletions
diff --git a/facetracknoir/options-dialog.cpp b/facetracknoir/options-dialog.cpp
index 9afeba7c..08c92ee8 100644
--- a/facetracknoir/options-dialog.cpp
+++ b/facetracknoir/options-dialog.cpp
@@ -1,6 +1,7 @@
#include "options-dialog.hpp"
+#include "ftnoir_tracker_pt/camera.h"
-OptionsDialog::OptionsDialog()
+OptionsDialog::OptionsDialog(State& state) : state(state), trans_calib_running(false)
{
ui.setupUi( this );
@@ -67,6 +68,16 @@ OptionsDialog::OptionsDialog()
tie_setting(pt.fov, ui.camera_fov);
tie_setting(pt.is_cap, ui.model_cap);
+
+ tie_setting(acc.rot_threshold, ui.rotation_slider);
+ tie_setting(acc.trans_threshold, ui.translation_slider);
+ tie_setting(acc.ewma, ui.ewma_slider);
+ tie_setting(acc.rot_deadzone, ui.rot_dz_slider);
+ tie_setting(acc.trans_deadzone, ui.trans_dz_slider);
+
+ connect(&timer,SIGNAL(timeout()), this,SLOT(poll_tracker_info()));
+ connect( ui.tcalib_button,SIGNAL(toggled(bool)), this,SLOT(startstop_trans_calib(bool)) );
+ timer.start(100);
}
void OptionsDialog::doOK() {
@@ -85,3 +96,113 @@ void OptionsDialog::doCancel() {
ui.game_detector->revert();
close();
}
+
+void OptionsDialog::startstop_trans_calib(bool start)
+{
+ auto tracker = get_pt();
+ if (!tracker)
+ {
+ ui.tcalib_button->setChecked(false);
+ return;
+ }
+
+ if (start)
+ {
+ qDebug()<<"TrackerDialog:: Starting translation calibration";
+ trans_calib.reset();
+ trans_calib_running = true;
+ pt.t_MH_x = 0;
+ pt.t_MH_y = 0;
+ pt.t_MH_z = 0;
+ }
+ else
+ {
+ qDebug()<<"TrackerDialog:: Stopping translation calibration";
+ trans_calib_running = false;
+ {
+ auto tmp = trans_calib.get_estimate();
+ pt.t_MH_x = tmp[0];
+ pt.t_MH_y = tmp[1];
+ pt.t_MH_z = tmp[2];
+ }
+ }
+}
+
+void OptionsDialog::poll_tracker_info()
+{
+ auto tracker = get_pt();
+ if (tracker)
+ {
+ QString to_print;
+
+ // display caminfo
+ CamInfo info;
+ tracker->get_cam_info(&info);
+ to_print = QString::number(info.res_x)+"x"+QString::number(info.res_y)+" @ "+QString::number(info.fps)+" FPS";
+ ui.caminfo_label->setText(to_print);
+
+ // display pointinfo
+ int n_points = tracker->get_n_points();
+ to_print = QString::number(n_points);
+ if (n_points == 3)
+ to_print += " OK!";
+ else
+ to_print += " BAD!";
+ ui.pointinfo_label->setText(to_print);
+
+ // update calibration
+ if (trans_calib_running) trans_calib_step();
+ }
+ else
+ {
+ QString to_print = "Tracker offline";
+ ui.caminfo_label->setText(to_print);
+ ui.pointinfo_label->setText(to_print);
+ }
+}
+
+void OptionsDialog::trans_calib_step()
+{
+ auto tracker = get_pt();
+ if (tracker)
+ {
+ Affine X_CM = tracker->pose();
+ trans_calib.update(X_CM.R, X_CM.t);
+ }
+}
+
+Tracker_PT* OptionsDialog::get_pt()
+{
+ auto work = state.work.get();
+ if (!work)
+ return nullptr;
+ auto ptr = work->libs.pTracker;
+ if (ptr)
+ return static_cast<Tracker_PT*>(ptr.get());
+ return nullptr;
+}
+
+void OptionsDialog::update_rot_display(int value)
+{
+ ui.rot_gain->setText(QString::number((value + 1) * 10 / 100.) + "°");
+}
+
+void OptionsDialog::update_trans_display(int value)
+{
+ ui.trans_gain->setText(QString::number((value + 1) * 5 / 100.) + "mm");
+}
+
+void OptionsDialog::update_ewma_display(int value)
+{
+ ui.ewma_label->setText(QString::number(value * 2) + "ms");
+}
+
+void OptionsDialog::update_rot_dz_display(int value)
+{
+ ui.rot_dz->setText(QString::number(value * 2 / 100.) + "°");
+}
+
+void OptionsDialog::update_trans_dz_display(int value)
+{
+ ui.trans_dz->setText(QString::number(value * 1 / 100.) + "mm");
+}
diff --git a/facetracknoir/options-dialog.hpp b/facetracknoir/options-dialog.hpp
index 33ae1810..6f752a08 100644
--- a/facetracknoir/options-dialog.hpp
+++ b/facetracknoir/options-dialog.hpp
@@ -2,9 +2,14 @@
#include <QObject>
#include <QWidget>
+#include <QTimer>
#include "ui_settings.h"
+#include "opentrack/state.hpp"
#include "opentrack/shortcuts.h"
#include "ftnoir_tracker_pt/ftnoir_tracker_pt_settings.h"
+#include "facetracknoir/trans_calib.h"
+#include "ftnoir_tracker_pt/ftnoir_tracker_pt.h"
+#include "ftnoir_filter_accela/ftnoir_filter_accela.h"
class OptionsDialog: public QWidget
{
@@ -12,12 +17,28 @@ class OptionsDialog: public QWidget
signals:
void reload();
public:
- OptionsDialog();
+ OptionsDialog(State &state);
private:
Ui::UI_Settings ui;
Shortcuts::settings s;
settings_pt pt;
+ settings_accela acc;
+ QTimer timer;
+ State& state;
+ TranslationCalibrator trans_calib;
+ bool trans_calib_running;
+
+ Tracker_PT* get_pt();
+
+ void update_ewma_display(int value);
+ void update_rot_display(int value);
+ void update_trans_display(int value);
+ void update_rot_dz_display(int value);
+ void update_trans_dz_display(int value);
private slots:
void doOK();
void doCancel();
+ void startstop_trans_calib(bool start);
+ void poll_tracker_info();
+ void trans_calib_step();
};
diff --git a/facetracknoir/settings.ui b/facetracknoir/settings.ui
index 240ed522..5c6c7f32 100644
--- a/facetracknoir/settings.ui
+++ b/facetracknoir/settings.ui
@@ -296,8 +296,135 @@
<attribute name="title">
<string>Camera</string>
</attribute>
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <item>
+ <layout class="QGridLayout" name="gridLayout_9">
+ <item row="4" column="0">
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="0">
+ <widget class="QGroupBox" name="groupBox_6">
+ <property name="title">
+ <string>Point extraction</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QFrame" name="frame_2">
+ <property name="frameShape">
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_10">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Threshold</string>
+ </property>
+ <property name="buddy">
+ <cstring>threshold_slider</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QSlider" name="threshold_slider">
+ <property name="toolTip">
+ <string>Intensity threshold for point extraction</string>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ <property name="pageStep">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>127</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksBothSides</enum>
+ </property>
+ <property name="tickInterval">
+ <number>25</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="frame">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_29">
+ <property name="text">
+ <string>Min size</string>
+ </property>
+ <property name="buddy">
+ <cstring>mindiam_spin</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QSpinBox" name="mindiam_spin">
+ <property name="toolTip">
+ <string>Minimum point diameter</string>
+ </property>
+ <property name="suffix">
+ <string> px</string>
+ </property>
+ <property name="maximum">
+ <number>1024</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLabel" name="label_22">
+ <property name="text">
+ <string>Max size</string>
+ </property>
+ <property name="buddy">
+ <cstring>maxdiam_spin</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="QSpinBox" name="maxdiam_spin">
+ <property name="toolTip">
+ <string>Maximum point diameter</string>
+ </property>
+ <property name="suffix">
+ <string> px</string>
+ </property>
+ <property name="maximum">
+ <number>1024</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="0">
<widget class="QGroupBox" name="groupBox_5">
<property name="title">
<string>Camera offset</string>
@@ -403,7 +530,7 @@
</layout>
</widget>
</item>
- <item>
+ <item row="1" column="0">
<widget class="QGroupBox" name="groupBox_9">
<property name="title">
<string>Device</string>
@@ -464,133 +591,29 @@
</layout>
</widget>
</item>
- <item>
- <widget class="QGroupBox" name="groupBox_6">
+ <item row="3" column="0">
+ <widget class="QGroupBox" name="groupBox_11">
<property name="title">
- <string>Point extraction</string>
+ <string>Status</string>
</property>
- <layout class="QVBoxLayout" name="verticalLayout_3">
+ <layout class="QHBoxLayout" name="horizontalLayout">
<item>
- <widget class="QFrame" name="frame_2">
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
+ <widget class="QLabel" name="caminfo_label">
+ <property name="text">
+ <string>Not running</string>
</property>
- <layout class="QGridLayout" name="gridLayout_10">
- <item row="0" column="0">
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Threshold</string>
- </property>
- <property name="buddy">
- <cstring>threshold_slider</cstring>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QSlider" name="threshold_slider">
- <property name="toolTip">
- <string>Intensity threshold for point extraction</string>
- </property>
- <property name="maximum">
- <number>255</number>
- </property>
- <property name="pageStep">
- <number>1</number>
- </property>
- <property name="value">
- <number>127</number>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="tickPosition">
- <enum>QSlider::TicksBothSides</enum>
- </property>
- <property name="tickInterval">
- <number>25</number>
- </property>
- </widget>
- </item>
- </layout>
</widget>
</item>
<item>
- <widget class="QFrame" name="frame">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
+ <widget class="QLabel" name="pointinfo_label">
+ <property name="text">
+ <string/>
</property>
- <layout class="QGridLayout" name="gridLayout_3">
- <item row="0" column="0">
- <widget class="QLabel" name="label_29">
- <property name="text">
- <string>Min size</string>
- </property>
- <property name="buddy">
- <cstring>mindiam_spin</cstring>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QSpinBox" name="mindiam_spin">
- <property name="toolTip">
- <string>Minimum point diameter</string>
- </property>
- <property name="suffix">
- <string> px</string>
- </property>
- <property name="maximum">
- <number>1024</number>
- </property>
- </widget>
- </item>
- <item row="0" column="2">
- <widget class="QLabel" name="label_22">
- <property name="text">
- <string>Max size</string>
- </property>
- <property name="buddy">
- <cstring>maxdiam_spin</cstring>
- </property>
- </widget>
- </item>
- <item row="0" column="3">
- <widget class="QSpinBox" name="maxdiam_spin">
- <property name="toolTip">
- <string>Maximum point diameter</string>
- </property>
- <property name="suffix">
- <string> px</string>
- </property>
- <property name="maximum">
- <number>1024</number>
- </property>
- </widget>
- </item>
- </layout>
</widget>
</item>
</layout>
</widget>
</item>
- <item>
- <spacer name="verticalSpacer_2">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
</layout>
</widget>
<widget class="QWidget" name="tab_2">
@@ -684,7 +707,7 @@
</sizepolicy>
</property>
<property name="title">
- <string>Model position</string>
+ <string>Model position calibration</string>
</property>
<layout class="QGridLayout" name="gridLayout_11">
<item row="0" column="0">
@@ -1299,6 +1322,261 @@
</item>
</layout>
</widget>
+ <widget class="QWidget" name="tab_6">
+ <attribute name="title">
+ <string>Filter</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout_15">
+ <item row="0" column="0">
+ <widget class="QFrame" name="frame_4">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_14">
+ <item row="1" column="3">
+ <widget class="QSlider" name="rotation_slider">
+ <property name="maximum">
+ <number>99</number>
+ </property>
+ <property name="pageStep">
+ <number>5</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksAbove</enum>
+ </property>
+ <property name="tickInterval">
+ <number>25</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="lblSensYaw_6">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">color:#0;
+background:none;</string>
+ </property>
+ <property name="text">
+ <string>Rotation sensitivity</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_6">
+ <property name="text">
+ <string>Smoothing</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="ewma_label">
+ <property name="minimumSize">
+ <size>
+ <width>48</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>0 ms</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="rot_gain">
+ <property name="text">
+ <string>0°</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="QSlider" name="ewma_slider">
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ <property name="singleStep">
+ <number>10</number>
+ </property>
+ <property name="pageStep">
+ <number>25</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksAbove</enum>
+ </property>
+ <property name="tickInterval">
+ <number>25</number>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0">
+ <widget class="QLabel" name="label_27">
+ <property name="text">
+ <string>Translation deadzone</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_28">
+ <property name="text">
+ <string>Rotation deadzone</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="3">
+ <widget class="QSlider" name="rot_dz_slider">
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QLabel" name="rot_dz">
+ <property name="text">
+ <string>0°</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="3">
+ <widget class="QSlider" name="trans_dz_slider">
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <widget class="QLabel" name="trans_dz">
+ <property name="text">
+ <string>0mm</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="label_30">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Translation sensitivity</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="QLabel" name="trans_gain">
+ <property name="text">
+ <string>0mm</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="3">
+ <widget class="QSlider" name="translation_slider">
+ <property name="maximum">
+ <number>99</number>
+ </property>
+ <property name="pageStep">
+ <number>5</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksAbove</enum>
+ </property>
+ <property name="tickInterval">
+ <number>25</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QGroupBox" name="groupBox_12">
+ <property name="title">
+ <string>GroupBox</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_13">
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_26">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>7</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;justify&quot;&gt;&lt;br/&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Accela by &lt;/span&gt;&lt;a href=&quot;https://github.com/sthalik&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0057ae;&quot;&gt;Stanisław Halik&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;&lt;br/&gt;Thanks to &lt;/span&gt;&lt;a href=&quot;https://github.com/dbaarda&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0057ae;&quot;&gt;Donovan Baarda&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align=&quot;right&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;2012-2015&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;right&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::RichText</enum>
+ </property>
+ <property name="scaledContents">
+ <bool>false</bool>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="indent">
+ <number>0</number>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Visit &lt;a href=&quot;https://github.com/opentrack/opentrack/wiki/Accela-in-opentrack-2.3&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;our wiki&lt;/span&gt;&lt;/a&gt; for description of the settings.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
<widget class="QWidget" name="tab_5">
<attribute name="title">
<string>Game detection</string>
diff --git a/facetracknoir/trans_calib.cpp b/facetracknoir/trans_calib.cpp
new file mode 100644
index 00000000..2994eb48
--- /dev/null
+++ b/facetracknoir/trans_calib.cpp
@@ -0,0 +1,44 @@
+/* Copyright (c) 2012 Patrick Ruoff
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ */
+
+#include "trans_calib.h"
+
+using namespace cv;
+
+//-----------------------------------------------------------------------------
+TranslationCalibrator::TranslationCalibrator()
+{
+ reset();
+}
+
+void TranslationCalibrator::reset()
+{
+ P = Matx66f::zeros();
+ y = Vec6f(0,0,0, 0,0,0);
+}
+
+void TranslationCalibrator::update(const Matx33f& R_CM_k, const Vec3f& t_CM_k)
+{
+ Matx<float, 6,3> H_k_T = Matx<float, 6,3>::zeros();
+ for (int i=0; i<3; ++i) {
+ for (int j=0; j<3; ++j) {
+ H_k_T(i,j) = R_CM_k(j,i);
+ }
+ }
+ for (int i=0; i<3; ++i)
+ {
+ H_k_T(3+i,i) = 1.0;
+ }
+ P += H_k_T * H_k_T.t();
+ y += H_k_T * t_CM_k;
+}
+
+Vec3f TranslationCalibrator::get_estimate()
+{
+ Vec6f x = P.inv() * y;
+ return Vec3f(-x[0], -x[1], -x[2]);
+}
diff --git a/facetracknoir/trans_calib.h b/facetracknoir/trans_calib.h
new file mode 100644
index 00000000..c2c02b38
--- /dev/null
+++ b/facetracknoir/trans_calib.h
@@ -0,0 +1,39 @@
+/* Copyright (c) 2012 Patrick Ruoff
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ */
+
+#ifndef TRANSCALIB_H
+#define TRANSCALIB_H
+
+#include <opencv2/core/core.hpp>
+
+//-----------------------------------------------------------------------------
+// Calibrates the translation from head to model = t_MH
+// by recursive least squares /
+// kalman filter in information form with identity noise covariance
+// measurement equation when head position = t_CH is fixed:
+// (R_CM_k , Id)*(-t_MH, t_CH) = t_CM_k
+
+class TranslationCalibrator
+{
+public:
+ TranslationCalibrator();
+
+ // reset the calibration process
+ void reset();
+
+ // update the current estimate
+ void update(const cv::Matx33f& R_CM_k, const cv::Vec3f& t_CM_k);
+
+ // get the current estimate for t_MH
+ cv::Vec3f get_estimate();
+
+private:
+ cv::Matx66f P; // normalized precision matrix = inverse covariance
+ cv::Vec6f y; // P*(-t_MH, t_CH)
+};
+
+#endif //TRANSCALIB_H
diff --git a/facetracknoir/ui.cpp b/facetracknoir/ui.cpp
index d1d43a24..7e0a78cc 100644
--- a/facetracknoir/ui.cpp
+++ b/facetracknoir/ui.cpp
@@ -24,6 +24,8 @@
#include "ui.h"
#include "opentrack/tracker.h"
#include "opentrack/options.hpp"
+#include "ftnoir_tracker_pt/ftnoir_tracker_pt.h"
+#include "ftnoir_filter_accela/ftnoir_filter_accela.h"
#include <QFileDialog>
#include <QFileInfo>
@@ -208,7 +210,8 @@ void MainWindow::startTracker() {
// tracker dtor needs run first
work = nullptr;
- libs = SelectedLibraries(ui.video_frame, current_tracker(), current_protocol(), current_filter());
+ libs = SelectedLibraries(ui.video_frame, std::make_shared<Tracker_PT>(), current_protocol(), std::make_shared<FTNoIR_Filter>());
+
work = std::make_shared<Work>(s, pose, libs, this, winId());
{
@@ -225,12 +228,6 @@ void MainWindow::startTracker() {
return;
}
- if (pTrackerDialog)
- pTrackerDialog->register_tracker(libs.pTracker.get());
-
- if (pFilterDialog)
- pFilterDialog->register_filter(libs.pFilter.get());
-
if (pProtocolDialog)
pProtocolDialog->register_protocol(libs.pProtocol.get());
@@ -248,24 +245,12 @@ void MainWindow::stopTracker( ) {
pose_update_timer.stop();
ui.pose_display->rotateBy(0, 0, 0, 0, 0, 0);
- if (pTrackerDialog)
- {
- pTrackerDialog->unregister_tracker();
- pTrackerDialog = nullptr;
- }
-
if (pProtocolDialog)
{
pProtocolDialog->unregister_protocol();
pProtocolDialog = nullptr;
}
- if (pFilterDialog)
- {
- pFilterDialog->unregister_filter();
- pFilterDialog = nullptr;
- }
-
work = nullptr;
libs = SelectedLibraries();
@@ -338,24 +323,6 @@ mem<t> mk_dialog(mem<dylib> lib)
return nullptr;
}
-void MainWindow::showTrackerSettings()
-{
- if (pTrackerDialog && pTrackerDialog->isVisible())
- {
- pTrackerDialog->show();
- pTrackerDialog->raise();
- }
- else
- {
- auto dialog = mk_dialog<ITrackerDialog>(current_tracker());
- pTrackerDialog = dialog;
- if (libs.pTracker != nullptr)
- dialog->register_tracker(libs.pTracker.get());
- dialog->show();
- dialog->raise();
- }
-}
-
void MainWindow::showProtocolSettings() {
if (pProtocolDialog && pProtocolDialog->isVisible())
{
@@ -372,22 +339,6 @@ void MainWindow::showProtocolSettings() {
}
}
-void MainWindow::showFilterSettings() {
- if (pFilterDialog && pFilterDialog->isVisible())
- {
- pFilterDialog->show();
- pFilterDialog->raise();
- } else
- {
- auto dialog = mk_dialog<IFilterDialog>(current_filter());
- pFilterDialog = dialog;
- if (libs.pFilter != nullptr)
- dialog->register_filter(libs.pFilter.get());
- dialog->show();
- dialog->raise();
- }
-}
-
void MainWindow::showKeyboardShortcuts() {
if (shortcuts_widget && shortcuts_widget->isVisible())
{
@@ -396,7 +347,7 @@ void MainWindow::showKeyboardShortcuts() {
}
else
{
- shortcuts_widget = std::make_shared<OptionsDialog>();
+ shortcuts_widget = std::make_shared<OptionsDialog>(static_cast<State&>(*this));
shortcuts_widget->setWindowFlags(Qt::Dialog);
connect(shortcuts_widget.get(), SIGNAL(reload()), this, SLOT(bindKeyboardShortcuts()));
shortcuts_widget->show();
diff --git a/facetracknoir/ui.h b/facetracknoir/ui.h
index 10f5c814..1a4ce5cb 100644
--- a/facetracknoir/ui.h
+++ b/facetracknoir/ui.h
@@ -71,23 +71,13 @@ class MainWindow : public QMainWindow, private State
mem<MapWidget> mapping_widget;
QShortcut kbd_quit;
QPixmap no_feed_pixmap;
- mem<IFilterDialog> pFilterDialog;
mem<IProtocolDialog> pProtocolDialog;
- mem<ITrackerDialog> pTrackerDialog;
process_detector_worker det;
- mem<dylib> current_tracker()
- {
- return modules.trackers().value(0, nullptr);
- }
mem<dylib> current_protocol()
{
return modules.protocols().value(ui.iconcomboProtocol->currentIndex(), nullptr);
}
- mem<dylib> current_filter()
- {
- return modules.filters().value(0, nullptr);
- }
void changeEvent(QEvent* e) override;
@@ -109,9 +99,7 @@ private slots:
void exit();
void profileSelected(int index);
- void showTrackerSettings();
void showProtocolSettings();
- void showFilterSettings();
void showKeyboardShortcuts();
void showCurveConfiguration();
void showHeadPose();