summaryrefslogtreecommitdiffhomepage
path: root/ftnoir_tracker_aruco
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2013-12-28 05:44:14 +0100
committerStanislaw Halik <sthalik@misaki.pl>2013-12-28 05:44:14 +0100
commit810293b5639f9a3df67c343866544c34eda84192 (patch)
tree3785ae6dfd2ee058890d353a5506b3036b36bec9 /ftnoir_tracker_aruco
parent0b376956dc68390f76ce3165a2572b9c902027a6 (diff)
implement optional aruco frame smoothing ewma scheme
Diffstat (limited to 'ftnoir_tracker_aruco')
-rw-r--r--ftnoir_tracker_aruco/aruco-trackercontrols.ui310
-rw-r--r--ftnoir_tracker_aruco/ftnoir_tracker_aruco.cpp53
-rw-r--r--ftnoir_tracker_aruco/ftnoir_tracker_aruco.h2
3 files changed, 233 insertions, 132 deletions
diff --git a/ftnoir_tracker_aruco/aruco-trackercontrols.ui b/ftnoir_tracker_aruco/aruco-trackercontrols.ui
index d4b64c23..340ed0ad 100644
--- a/ftnoir_tracker_aruco/aruco-trackercontrols.ui
+++ b/ftnoir_tracker_aruco/aruco-trackercontrols.ui
@@ -10,7 +10,7 @@
<x>0</x>
<y>0</y>
<width>704</width>
- <height>308</height>
+ <height>399</height>
</rect>
</property>
<property name="sizePolicy">
@@ -32,7 +32,106 @@
<property name="spacing">
<number>-1</number>
</property>
- <item row="7" column="1" rowspan="2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Horizontal FOV</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" rowspan="3" colspan="2">
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Enable axes</string>
+ </property>
+ <layout class="QFormLayout" name="formLayout">
+ <property name="horizontalSpacing">
+ <number>-1</number>
+ </property>
+ <property name="leftMargin">
+ <number>6</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>6</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QCheckBox" name="rx">
+ <property name="text">
+ <string>RX</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QCheckBox" name="tx">
+ <property name="text">
+ <string>TX</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QCheckBox" name="ry">
+ <property name="text">
+ <string>RY</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QCheckBox" name="ty">
+ <property name="text">
+ <string>TY</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QCheckBox" name="rz">
+ <property name="text">
+ <string>RZ</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QCheckBox" name="tz">
+ <property name="text">
+ <string>TZ</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Frames per second</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" colspan="2">
+ <widget class="QComboBox" name="cameraName"/>
+ </item>
+ <item row="0" column="1" colspan="2">
+ <widget class="QDoubleSpinBox" name="cameraFOV">
+ <property name="locale">
+ <locale language="English" country="UnitedStates"/>
+ </property>
+ <property name="minimum">
+ <double>35.000000000000000</double>
+ </property>
+ <property name="maximum">
+ <double>180.000000000000000</double>
+ </property>
+ <property name="value">
+ <double>52.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="1">
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Head centroid position</string>
@@ -124,79 +223,6 @@
</layout>
</widget>
</item>
- <item row="0" column="3" rowspan="3" colspan="2">
- <widget class="QGroupBox" name="groupBox">
- <property name="title">
- <string>Enable axes</string>
- </property>
- <layout class="QFormLayout" name="formLayout">
- <property name="horizontalSpacing">
- <number>-1</number>
- </property>
- <property name="leftMargin">
- <number>6</number>
- </property>
- <property name="topMargin">
- <number>0</number>
- </property>
- <property name="rightMargin">
- <number>6</number>
- </property>
- <property name="bottomMargin">
- <number>0</number>
- </property>
- <item row="0" column="0">
- <widget class="QCheckBox" name="rx">
- <property name="text">
- <string>RX</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QCheckBox" name="tx">
- <property name="text">
- <string>TX</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QCheckBox" name="ry">
- <property name="text">
- <string>RY</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QCheckBox" name="ty">
- <property name="text">
- <string>TY</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QCheckBox" name="rz">
- <property name="text">
- <string>RZ</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QCheckBox" name="tz">
- <property name="text">
- <string>TZ</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="6" column="0">
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>Resolution</string>
- </property>
- </widget>
- </item>
<item row="1" column="1" colspan="2">
<widget class="QComboBox" name="cameraFPS">
<item>
@@ -221,48 +247,14 @@
</item>
</widget>
</item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_2">
+ <item row="6" column="0">
+ <widget class="QLabel" name="label_4">
<property name="text">
- <string>Frames per second</string>
- </property>
- </widget>
- </item>
- <item row="6" column="1">
- <widget class="QComboBox" name="resolution">
- <item>
- <property name="text">
- <string>640x480</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>320x240</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>320x200</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Default (not recommended!)</string>
- </property>
- </item>
- </widget>
- </item>
- <item row="8" column="3" colspan="2">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ <string>Resolution</string>
</property>
</widget>
</item>
- <item row="2" column="1" colspan="2">
- <widget class="QComboBox" name="cameraName"/>
- </item>
- <item row="6" column="2" rowspan="2" colspan="3">
+ <item row="6" column="2" rowspan="3" colspan="3">
<widget class="QLabel" name="label_6">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
@@ -293,19 +285,34 @@
</property>
</widget>
</item>
- <item row="0" column="1" colspan="2">
- <widget class="QDoubleSpinBox" name="cameraFOV">
- <property name="locale">
- <locale language="English" country="UnitedStates"/>
- </property>
- <property name="minimum">
- <double>35.000000000000000</double>
- </property>
- <property name="maximum">
- <double>180.000000000000000</double>
- </property>
- <property name="value">
- <double>52.000000000000000</double>
+ <item row="6" column="1">
+ <widget class="QComboBox" name="resolution">
+ <item>
+ <property name="text">
+ <string>640x480</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>320x240</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>320x200</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Default (not recommended!)</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="9" column="4">
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
@@ -316,10 +323,54 @@
</property>
</widget>
</item>
- <item row="0" column="0">
- <widget class="QLabel" name="label">
+ <item row="7" column="1">
+ <widget class="QComboBox" name="ewma">
+ <item>
+ <property name="text">
+ <string>0</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>1</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>2</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>3</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>4</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>5</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>6</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>7</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="7" column="0">
+ <widget class="QLabel" name="label_10">
<property name="text">
- <string>Horizontal FOV</string>
+ <string>Frame EWMA</string>
</property>
</widget>
</item>
@@ -340,7 +391,6 @@
<tabstop>tx</tabstop>
<tabstop>ty</tabstop>
<tabstop>tz</tabstop>
- <tabstop>buttonBox</tabstop>
</tabstops>
<resources/>
<connections/>
diff --git a/ftnoir_tracker_aruco/ftnoir_tracker_aruco.cpp b/ftnoir_tracker_aruco/ftnoir_tracker_aruco.cpp
index 9a8c09d5..fa83955c 100644
--- a/ftnoir_tracker_aruco/ftnoir_tracker_aruco.cpp
+++ b/ftnoir_tracker_aruco/ftnoir_tracker_aruco.cpp
@@ -16,7 +16,7 @@
#include <opencv/highgui.h>
#include <vector>
#include <cstdio>
-#include <memory>
+#include <vector>
#if defined(_WIN32)
# define NO_DSHOW_STRSAFE
@@ -129,12 +129,14 @@ void Tracker::load_settings()
headpos[i] = iniFile.value(QString("headpos-%1").arg(i), 0).toDouble();
}
headpitch = iniFile.value("pitch", 0).toDouble();
+ N_hyst = iniFile.value("ewma", 0).toInt();
iniFile.endGroup();
}
Tracker::Tracker()
{
+ N_hyst = 0;
layout = nullptr;
stop = false;
videoWidget = NULL;
@@ -192,7 +194,7 @@ void Tracker::run()
cv::Mat color, color_, grayscale, rvec, tvec;
- const double stateful_coeff = 0.9;
+ const double stateful_coeff = 0.88;
if (!camera.isOpened())
{
@@ -209,6 +211,29 @@ void Tracker::run()
int fps = 0;
int last_fps = 0;
cv::Point2f last_centroid;
+
+ bool first_run = true;
+
+ std::vector<cv::Mat> lasts;
+
+ for (int i = 0; i < N_hyst; i++)
+ lasts.push_back(cv::Mat());
+
+ vector<float> weights;
+ {
+ const float a = 0.32;
+ float sum = 0;
+ float k = 1;
+ for (int i = 0; i < N_hyst; i++)
+ {
+ sum += k;
+ weights.push_back(k);
+ k *= 1./(a*N_hyst);
+ }
+ for (int i = 0; i < N_hyst; i++)
+ qDebug() << i << "w" << (weights[i] /= sum);
+ }
+
while (!stop)
{
if (!camera.read(color_))
@@ -217,6 +242,28 @@ void Tracker::run()
color_.copyTo(color);
cv::cvtColor(color, grayscale, cv::COLOR_BGR2GRAY);
+ if (first_run)
+ {
+ first_run = false;
+ for (int i = 0; i < N_hyst; i++)
+ lasts[i] = grayscale;
+ }
+ if (N_hyst > 0)
+ {
+ cv::Mat hyst(grayscale.rows, grayscale.cols, CV_32F);
+ hyst.setTo(0);
+ for (int i = 0; i < N_hyst-1; i++)
+ lasts[i] = lasts[i+1];
+ lasts[N_hyst-1] = grayscale;
+ for (int i = 0; i < N_hyst; i++)
+ for (int y = 0; y < grayscale.rows; y++)
+ for (int x = 0; x < grayscale.cols; x++)
+ hyst.at<float>(y, x) += (float) lasts[i].at<unsigned char>(y, x) * weights[i];
+ hyst.convertTo(grayscale, CV_8U);
+ }
+
+ cv::cvtColor(grayscale, color, cv::COLOR_GRAY2BGR);
+
const int scale = frame.cols > 480 ? 2 : 1;
detector.setThresholdParams(scale > 1 ? 11 : 7, 4);
@@ -543,6 +590,7 @@ void TrackerControls::loadSettings()
}
ui.pitch_deg->setValue(iniFile.value("pitch", 0).toDouble());
+ ui.ewma->setCurrentIndex(iniFile.value("ewma", 0).toInt());
iniFile.endGroup();
settingsDirty = false;
@@ -583,6 +631,7 @@ void TrackerControls::save()
iniFile.setValue("enable-tz", ui.tz->checkState() != Qt::Unchecked ? true : false);
iniFile.setValue("resolution", ui.resolution->currentIndex());
iniFile.setValue("pitch", ui.pitch_deg->value());
+ iniFile.setValue("ewma", ui.ewma->currentIndex());
QDoubleSpinBox* headpos[] = {
ui.cx,
diff --git a/ftnoir_tracker_aruco/ftnoir_tracker_aruco.h b/ftnoir_tracker_aruco/ftnoir_tracker_aruco.h
index be2ad3d7..249c8829 100644
--- a/ftnoir_tracker_aruco/ftnoir_tracker_aruco.h
+++ b/ftnoir_tracker_aruco/ftnoir_tracker_aruco.h
@@ -42,6 +42,8 @@ private:
cv::Mat frame;
double headpos[3], headpitch;
cv::VideoCapture camera;
+ int N_hyst;
+ cv::Mat lasts;
};
// Widget that has controls for FTNoIR protocol client-settings.