diff options
-rw-r--r-- | facetracknoir/facetracknoir.cpp | 6 | ||||
-rw-r--r-- | facetracknoir/facetracknoir.h | 2 | ||||
-rw-r--r-- | facetracknoir/facetracknoir.ui | 42 | ||||
-rw-r--r-- | facetracknoir/options.h | 12 | ||||
-rw-r--r-- | facetracknoir/tracker.cpp | 103 | ||||
-rw-r--r-- | facetracknoir/tracker.h | 6 | ||||
-rw-r--r-- | ftnoir_tracker_aruco/ftnoir_tracker_aruco.cpp | 13 | ||||
-rw-r--r-- | ftnoir_tracker_aruco/ftnoir_tracker_aruco.h | 2 |
8 files changed, 97 insertions, 89 deletions
diff --git a/facetracknoir/facetracknoir.cpp b/facetracknoir/facetracknoir.cpp index f689cb5f..73dae199 100644 --- a/facetracknoir/facetracknoir.cpp +++ b/facetracknoir/facetracknoir.cpp @@ -353,6 +353,12 @@ void FaceTrackNoIR::showHeadPose() if (mapping_widget) mapping_widget->update(); + + for (int i = 0; i < 6; i++) + { + mapped[i] = (int) mapped[i]; + raw[i] = (int) raw[i]; + } ui.lcdNumX->display(raw[TX]); ui.lcdNumY->display(raw[TY]); diff --git a/facetracknoir/facetracknoir.h b/facetracknoir/facetracknoir.h index d4c3a369..040bb170 100644 --- a/facetracknoir/facetracknoir.h +++ b/facetracknoir/facetracknoir.h @@ -91,6 +91,8 @@ public slots: void shortcutRecentered(); void shortcutToggled(); private: + // XXX move the shit outta the _widget_, establish a class + // for running tracker state, etc -sh 20141014 Mappings pose; Ui::OpentrackUI ui; QTimer timUpdateHeadPose; diff --git a/facetracknoir/facetracknoir.ui b/facetracknoir/facetracknoir.ui index ad968030..a201b643 100644 --- a/facetracknoir/facetracknoir.ui +++ b/facetracknoir/facetracknoir.ui @@ -95,7 +95,7 @@ <enum>QFrame::NoFrame</enum> </property> <property name="digitCount"> - <number>3</number> + <number>4</number> </property> <property name="segmentStyle"> <enum>QLCDNumber::Outline</enum> @@ -117,7 +117,7 @@ <enum>QFrame::NoFrame</enum> </property> <property name="digitCount"> - <number>3</number> + <number>4</number> </property> <property name="segmentStyle"> <enum>QLCDNumber::Outline</enum> @@ -165,7 +165,7 @@ <enum>QFrame::NoFrame</enum> </property> <property name="digitCount"> - <number>3</number> + <number>4</number> </property> <property name="segmentStyle"> <enum>QLCDNumber::Outline</enum> @@ -187,7 +187,7 @@ <enum>QFrame::NoFrame</enum> </property> <property name="digitCount"> - <number>3</number> + <number>4</number> </property> <property name="segmentStyle"> <enum>QLCDNumber::Outline</enum> @@ -247,7 +247,7 @@ <enum>QFrame::NoFrame</enum> </property> <property name="digitCount"> - <number>3</number> + <number>4</number> </property> <property name="segmentStyle"> <enum>QLCDNumber::Outline</enum> @@ -295,7 +295,7 @@ <enum>QFrame::NoFrame</enum> </property> <property name="digitCount"> - <number>3</number> + <number>4</number> </property> <property name="segmentStyle"> <enum>QLCDNumber::Outline</enum> @@ -341,14 +341,11 @@ <property name="frameShape"> <enum>QFrame::NoFrame</enum> </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> <property name="smallDecimalPoint"> <bool>true</bool> </property> <property name="digitCount"> - <number>3</number> + <number>4</number> </property> <property name="segmentStyle"> <enum>QLCDNumber::Flat</enum> @@ -369,14 +366,11 @@ <property name="frameShape"> <enum>QFrame::NoFrame</enum> </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> <property name="smallDecimalPoint"> <bool>true</bool> </property> <property name="digitCount"> - <number>3</number> + <number>4</number> </property> <property name="segmentStyle"> <enum>QLCDNumber::Flat</enum> @@ -413,14 +407,11 @@ <property name="frameShape"> <enum>QFrame::NoFrame</enum> </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> <property name="smallDecimalPoint"> <bool>true</bool> </property> <property name="digitCount"> - <number>3</number> + <number>4</number> </property> <property name="segmentStyle"> <enum>QLCDNumber::Flat</enum> @@ -463,14 +454,11 @@ <property name="frameShape"> <enum>QFrame::NoFrame</enum> </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> <property name="smallDecimalPoint"> <bool>true</bool> </property> <property name="digitCount"> - <number>3</number> + <number>4</number> </property> <property name="segmentStyle"> <enum>QLCDNumber::Flat</enum> @@ -529,14 +517,11 @@ <property name="frameShape"> <enum>QFrame::NoFrame</enum> </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> <property name="smallDecimalPoint"> <bool>true</bool> </property> <property name="digitCount"> - <number>3</number> + <number>4</number> </property> <property name="segmentStyle"> <enum>QLCDNumber::Flat</enum> @@ -573,14 +558,11 @@ <property name="frameShape"> <enum>QFrame::NoFrame</enum> </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> <property name="smallDecimalPoint"> <bool>true</bool> </property> <property name="digitCount"> - <number>3</number> + <number>4</number> </property> <property name="segmentStyle"> <enum>QLCDNumber::Flat</enum> diff --git a/facetracknoir/options.h b/facetracknoir/options.h index 7833ea41..d9667e4a 100644 --- a/facetracknoir/options.h +++ b/facetracknoir/options.h @@ -75,7 +75,7 @@ namespace options { // snapshot of qsettings group at given time class group { private: - map<string, QVariant> map; + map<string, QVariant> kvs; string name; static const QString ini_pathname() { @@ -93,7 +93,7 @@ namespace options { { auto tmp = k_.toUtf8(); string k(tmp); - map[k] = conf.value(k_); + kvs[k] = conf.value(k_); } conf.endGroup(); } @@ -104,7 +104,7 @@ namespace options { QSettings s(ini_pathname(), QSettings::IniFormat); auto q_name = QString::fromStdString(name); s.beginGroup(q_name); - for (auto& i : map) + for (auto& i : kvs) { auto k = QString::fromStdString(i.first); s.setValue(k, i.second); @@ -115,17 +115,17 @@ namespace options { template<typename t> t get(const string& k) { - return qcruft_to_t<t>(map[k]); + return qcruft_to_t<t>(kvs[k]); } void put(const string& s, const QVariant& d) { - map[s] = d; + kvs[s] = d; } bool contains(const string& s) { - return map.count(s) != 0; + return kvs.count(s) != 0; } }; diff --git a/facetracknoir/tracker.cpp b/facetracknoir/tracker.cpp index 09edd45b..0f299153 100644 --- a/facetracknoir/tracker.cpp +++ b/facetracknoir/tracker.cpp @@ -36,14 +36,13 @@ Tracker::~Tracker() wait(); } -void Tracker::get_curve(double pos, double& out, Mapping& axis) { +double Tracker::map(double pos, Mapping& axis) { bool altp = (pos < 0) && axis.opts.altp; axis.curve.setTrackingActive( !altp ); axis.curveAlt.setTrackingActive( altp ); auto& fc = altp ? axis.curveAlt : axis.curve; - out = (axis.opts.invert ? -1 : 1) * fc.getValue(pos); - - out += axis.opts.zero; + double invert = axis.opts.invert ? -1 : 1; + return invert * (fc.getValue(pos) + axis.opts.zero); } void Tracker::t_compensate(const double* input, double* output, bool rz) @@ -82,24 +81,14 @@ void Tracker::t_compensate(const double* input, double* output, bool rz) output[i] = ret(i); } -void Tracker::run() { - Pose pose_offset, unstopped_pose; - - double newpose[6] = {0}; - const int sleep_ms = 3; - -#if defined(_WIN32) - (void) timeBeginPeriod(1); -#endif +void Tracker::logic() +{ + Libraries->pTracker->GetHeadPoseData(newpose); + + Pose final_raw; - while (!should_quit) + if (enabledp) { - t.start(); - - Libraries->pTracker->GetHeadPoseData(newpose); - - Pose final_raw, filtered; - for (int i = 0; i < 6; i++) { auto& axis = m(i); @@ -109,37 +98,57 @@ void Tracker::run() { // not really raw, after axis remap -sh final_raw(i) = newpose[k]; } + unstopped_raw = final_raw; + } + + Pose filtered_pose; + + if (Libraries->pFilter) + Libraries->pFilter->FilterHeadPoseData(final_raw, filtered_pose); + else + filtered_pose = final_raw; + + if (centerp) + { + centerp = false; + raw_center = final_raw; + } + + Pose raw_centered = filtered_pose & raw_center; + + Pose mapped_pose_precomp; + + for (int i = 0; i < 6; i++) + mapped_pose_precomp(i) = map(raw_centered(i), m(i)); + + Pose mapped_pose; + + if (s.tcomp_p) + t_compensate(mapped_pose_precomp, mapped_pose, s.tcomp_tz); + else + mapped_pose = mapped_pose_precomp; - { - if (enabledp) - unstopped_pose = final_raw; - - if (Libraries->pFilter) - Libraries->pFilter->FilterHeadPoseData(unstopped_pose, filtered); - else - filtered = unstopped_pose; - - if (centerp) { - centerp = false; - pose_offset = filtered; - } - - filtered = filtered & pose_offset; - - for (int i = 0; i < 6; i++) - get_curve(filtered(i), filtered(i), m(i)); - } + Libraries->pProtocol->sendHeadposeToGame(mapped_pose); - if (s.tcomp_p) - t_compensate(filtered, filtered, s.tcomp_tz); + { + QMutexLocker foo(&mtx); + output_pose = mapped_pose; + raw_6dof = unstopped_raw; + } +} - Libraries->pProtocol->sendHeadposeToGame(filtered); +void Tracker::run() { + const int sleep_ms = 3; - { - QMutexLocker foo(&mtx); - output_pose = filtered; - raw_6dof = final_raw; - } +#if defined(_WIN32) + (void) timeBeginPeriod(1); +#endif + + while (!should_quit) + { + t.start(); + + logic(); double q = sleep_ms * 1000L; q -= t.elapsed(); diff --git a/facetracknoir/tracker.h b/facetracknoir/tracker.h index d65e1cf1..afb86802 100644 --- a/facetracknoir/tracker.h +++ b/facetracknoir/tracker.h @@ -23,12 +23,14 @@ private: // XXX can be const-cast when functionconfig const-correct -sh 20141004 Mappings& m; Timer t; - Pose output_pose, raw_6dof; + Pose output_pose, raw_6dof, raw_center, unstopped_raw; + double newpose[6]; std::atomic<bool> centerp; std::atomic<bool> enabledp; std::atomic<bool> should_quit; - static void get_curve(double pos, double& out, Mapping& axis); + double map(double pos, Mapping& axis); + void logic(); static void t_compensate(const double* input, double* output, bool rz); protected: void run() override; diff --git a/ftnoir_tracker_aruco/ftnoir_tracker_aruco.cpp b/ftnoir_tracker_aruco/ftnoir_tracker_aruco.cpp index fd8a8ce1..87c5315e 100644 --- a/ftnoir_tracker_aruco/ftnoir_tracker_aruco.cpp +++ b/ftnoir_tracker_aruco/ftnoir_tracker_aruco.cpp @@ -203,6 +203,12 @@ void Tracker::run() auto tm = cv::getTickCount(); cv::Mat grayscale; + { + std::vector<cv::Mat> tmp; + cv::split(color, tmp); + // red only, best on CCD, also artifacts on blue ps3eye + grayscale = tmp[2]; + } cv::cvtColor(color, grayscale, cv::COLOR_BGR2GRAY); const int scale = frame.cols > 480 ? 2 : 1; @@ -221,7 +227,7 @@ void Tracker::run() std::vector< aruco::Marker > markers; const double size_min = 0.04; - const double size_max = 0.38; + const double size_max = 0.28; bool roi_valid = false; @@ -229,6 +235,7 @@ void Tracker::run() { detector.setMinMaxSize(std::max(0.01, size_min * grayscale.cols / last_roi.width), std::min(1.0, size_max * grayscale.cols / last_roi.width)); + if (detector.detect(grayscale(last_roi), markers, cv::Mat(), cv::Mat(), -1, false), markers.size() == 1 && markers[0].size() == 4) { @@ -299,7 +306,7 @@ void Tracker::run() cv::Vec3d rvec, tvec; - cv::solvePnP(obj_points, m, intrinsics, dist_coeffs, rvec, tvec, false, cv::P3P); + cv::solvePnP(obj_points, m, intrinsics, dist_coeffs, rvec, tvec, false, cv::ITERATIVE); std::vector<cv::Point2f> roi_projection(4); @@ -324,7 +331,7 @@ void Tracker::run() { cv::Mat rvec_, tvec_; - cv::solvePnP(obj_points, m, intrinsics, dist_coeffs, rvec_, tvec_, false, cv::P3P); + cv::solvePnP(obj_points, m, intrinsics, dist_coeffs, rvec_, tvec_, false, cv::ITERATIVE); tvec = tvec_; } diff --git a/ftnoir_tracker_aruco/ftnoir_tracker_aruco.h b/ftnoir_tracker_aruco/ftnoir_tracker_aruco.h index 3d37dacd..090cf478 100644 --- a/ftnoir_tracker_aruco/ftnoir_tracker_aruco.h +++ b/ftnoir_tracker_aruco/ftnoir_tracker_aruco.h @@ -43,7 +43,7 @@ struct settings { class Tracker : protected QThread, public ITracker { Q_OBJECT - static constexpr double c_search_window = 2.2; + static constexpr double c_search_window = 2.65; public: Tracker(); ~Tracker() override; |