diff options
-rw-r--r-- | tracker-aruco/aruco-trackercontrols.ui | 93 | ||||
-rw-r--r-- | tracker-aruco/ftnoir_tracker_aruco.cpp | 75 | ||||
-rw-r--r-- | tracker-aruco/ftnoir_tracker_aruco.h | 39 |
3 files changed, 149 insertions, 58 deletions
diff --git a/tracker-aruco/aruco-trackercontrols.ui b/tracker-aruco/aruco-trackercontrols.ui index 8e6b30a6..0d70d9ed 100644 --- a/tracker-aruco/aruco-trackercontrols.ui +++ b/tracker-aruco/aruco-trackercontrols.ui @@ -10,7 +10,7 @@ <x>0</x> <y>0</y> <width>453</width> - <height>218</height> + <height>246</height> </rect> </property> <property name="windowTitle"> @@ -81,6 +81,31 @@ </property> </widget> </item> + <item row="3" column="1"> + <widget class="QComboBox" name="resolution"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <item> + <property name="text"> + <string>640x480</string> + </property> + </item> + <item> + <property name="text"> + <string>320x240</string> + </property> + </item> + <item> + <property name="text"> + <string>Default (not recommended!)</string> + </property> + </item> + </widget> + </item> <item row="1" column="1"> <widget class="QComboBox" name="cameraFPS"> <property name="sizePolicy"> @@ -140,32 +165,28 @@ </property> </widget> </item> - <item row="3" column="1"> - <widget class="QComboBox" name="resolution"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <item row="2" column="0"> + <widget class="QLabel" name="label_10"> + <property name="text"> + <string>Camera name</string> </property> - <item> - <property name="text"> - <string>640x480</string> - </property> - </item> - <item> - <property name="text"> - <string>320x240</string> - </property> - </item> - <item> - <property name="text"> - <string>Default (not recommended!)</string> - </property> - </item> </widget> </item> - <item row="4" column="1"> + <item row="1" column="0"> + <widget class="QLabel" name="label_12"> + <property name="text"> + <string>Frames per second</string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="label_11"> + <property name="text"> + <string>Resolution</string> + </property> + </widget> + </item> + <item row="5" column="1"> <widget class="QPushButton" name="camera_settings"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> @@ -178,24 +199,20 @@ </property> </widget> </item> - <item row="1" column="0"> - <widget class="QLabel" name="label_12"> + <item row="4" column="0"> + <widget class="QLabel" name="label"> <property name="text"> - <string>Frames per second</string> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="label_10"> - <property name="text"> - <string>Camera name</string> + <string>Model rotation</string> </property> </widget> </item> - <item row="3" column="0"> - <widget class="QLabel" name="label_11"> - <property name="text"> - <string>Resolution</string> + <item row="4" column="1"> + <widget class="QComboBox" name="model_rotation"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> </property> </widget> </item> diff --git a/tracker-aruco/ftnoir_tracker_aruco.cpp b/tracker-aruco/ftnoir_tracker_aruco.cpp index 15955692..53907808 100644 --- a/tracker-aruco/ftnoir_tracker_aruco.cpp +++ b/tracker-aruco/ftnoir_tracker_aruco.cpp @@ -24,36 +24,31 @@ #include <algorithm> #include <iterator> -struct resolution_tuple -{ - int width; - int height; -}; +constexpr double aruco_tracker::timeout; +constexpr double aruco_tracker::timeout_backoff_c; +constexpr const int aruco_tracker::adaptive_sizes[]; -static constexpr const resolution_tuple resolution_choices[] = -{ - { 640, 480 }, - { 320, 240 }, - { 0, 0 } -}; +constexpr const aruco_tracker::resolution_tuple aruco_tracker::resolution_choices[]; constexpr const double aruco_tracker::RC; constexpr const float aruco_tracker::size_min; constexpr const float aruco_tracker::size_max; aruco_tracker::aruco_tracker() : + pose{0,0,0, 0,0,0}, fps(0), + no_detection_timeout(0), obj_points(4), intrinsics(cv::Matx33d::eye()), rmat(cv::Matx33d::eye()), roi_points(4), last_roi(65535, 65535, 0, 0), - stop(false) + adaptive_size_pos(0), + stop(false), + use_otsu(false) { // param 2 ignored for Otsu thresholding. it's required to use our fork of Aruco. - detector.setThresholdParams(7, -1); - detector.setDesiredSpeed(3); - detector._thresMethod = aruco::MarkerDetector::FIXED_THRES; + set_detector_params(); } aruco_tracker::~aruco_tracker() @@ -75,8 +70,6 @@ void aruco_tracker::start_tracker(QFrame* videoframe) videoframe->setLayout(layout.data()); videoWidget->show(); start(); - for (int i = 0; i < 6; i++) - pose[i] = 0; } void aruco_tracker::getRT(cv::Matx33d& r_, cv::Vec3d& t_) @@ -323,6 +316,35 @@ void aruco_tracker::set_roi_from_projection() clamp_last_roi(); } +void aruco_tracker::set_detector_params() +{ + detector.setDesiredSpeed(3); + detector.setThresholdParams(adaptive_sizes[adaptive_size_pos], adaptive_thres); + if (use_otsu) + detector._thresMethod = aruco::MarkerDetector::FIXED_THRES; + else + detector._thresMethod = aruco::MarkerDetector::ADPT_THRES; +} + +void aruco_tracker::cycle_detection_params() +{ + if (!use_otsu) + use_otsu = true; + else + { + use_otsu = false; + + adaptive_size_pos++; + adaptive_size_pos %= sizeof(adaptive_sizes)/sizeof(*adaptive_sizes); + } + + set_detector_params(); + + qDebug() << "aruco: switched thresholding params" + << "otsu:" << use_otsu + << "size:" << adaptive_sizes[adaptive_size_pos]; +} + void aruco_tracker::run() { cv::setNumThreads(0); @@ -336,6 +358,7 @@ void aruco_tracker::run() return; fps_timer.start(); + last_detection_timer.start(); while (!stop) { @@ -365,15 +388,33 @@ void aruco_tracker::run() if (!cv::solvePnP(obj_points, markers[0], intrinsics, cv::noArray(), rvec, tvec, false, cv::SOLVEPNP_ITERATIVE)) goto fail; + { + const double dt = last_detection_timer.elapsed_seconds(); + last_detection_timer.start(); + no_detection_timeout -= dt * timeout_backoff_c; + no_detection_timeout = std::max(0., no_detection_timeout); + } + set_last_roi(); draw_centroid(); set_rmat(); } else + { fail: // no marker found, reset search region last_roi = cv::Rect(65535, 65535, 0, 0); + const double dt = last_detection_timer.elapsed_seconds(); + last_detection_timer.start(); + no_detection_timeout += dt; + if (no_detection_timeout > timeout) + { + no_detection_timeout = 0; + cycle_detection_params(); + } + } + draw_ar(ok); if (frame.rows > 0) diff --git a/tracker-aruco/ftnoir_tracker_aruco.h b/tracker-aruco/ftnoir_tracker_aruco.h index aa3c59f7..6e7db3f6 100644 --- a/tracker-aruco/ftnoir_tracker_aruco.h +++ b/tracker-aruco/ftnoir_tracker_aruco.h @@ -28,6 +28,7 @@ #include <opencv2/core.hpp> #include <opencv2/videoio.hpp> + using namespace options; struct settings : opts { @@ -83,6 +84,10 @@ private: void set_last_roi(); void set_rmat(); void set_roi_from_projection(); + void set_detector_params(); + void cycle_detection_params(); + + cv::Point3f rotate_model(float x, float y, settings::rot mode); cv::VideoCapture camera; QMutex camera_mtx; @@ -90,7 +95,7 @@ private: qshared<cv_video_widget> videoWidget; qshared<QHBoxLayout> layout; settings s; - double pose[6], fps; + double pose[6], fps, no_detection_timeout; cv::Mat frame, grayscale, color; cv::Matx33d r; std::vector<cv::Point3f> obj_points; @@ -105,9 +110,37 @@ private: cv::Vec3d euler; std::vector<cv::Point3f> roi_points; cv::Rect last_roi; - Timer fps_timer; - + Timer fps_timer, last_detection_timer; + unsigned adaptive_size_pos; volatile bool stop; + bool use_otsu; + + struct resolution_tuple + { + int width; + int height; + }; + + static constexpr const int adaptive_sizes[] = + { + 7, + 9, + //11, + 13, + //5, + }; + + static constexpr int adaptive_thres = 6; + + static constexpr const resolution_tuple resolution_choices[] = + { + { 640, 480 }, + { 320, 240 }, + { 0, 0 } + }; + + static constexpr double timeout = 1; + static constexpr double timeout_backoff_c = 4./11; static constexpr const float size_min = 0.05; static constexpr const float size_max = 0.3; |