diff options
Diffstat (limited to 'tracker-wii')
-rw-r--r-- | tracker-wii/CMakeLists.txt | 5 | ||||
-rw-r--r-- | tracker-wii/lang/de_DE.ts | 11 | ||||
-rw-r--r-- | tracker-wii/lang/zh_CN.ts | 2 | ||||
-rw-r--r-- | tracker-wii/wii_camera.cpp | 66 | ||||
-rw-r--r-- | tracker-wii/wii_camera.h | 40 | ||||
-rw-r--r-- | tracker-wii/wii_frame.cpp | 7 | ||||
-rw-r--r-- | tracker-wii/wii_frame.hpp | 4 | ||||
-rw-r--r-- | tracker-wii/wii_module.cpp | 6 | ||||
-rw-r--r-- | tracker-wii/wii_point_extractor.cpp | 74 | ||||
-rw-r--r-- | tracker-wii/wii_point_extractor.h | 8 | ||||
-rw-r--r-- | tracker-wii/wiiyourself/lang/zh_CN.ts | 2 |
11 files changed, 125 insertions, 100 deletions
diff --git a/tracker-wii/CMakeLists.txt b/tracker-wii/CMakeLists.txt index 00cc2f9f..fb840385 100644 --- a/tracker-wii/CMakeLists.txt +++ b/tracker-wii/CMakeLists.txt @@ -2,9 +2,12 @@ if(WIN32) include(opentrack-opencv) find_package(OpenCV QUIET) if(OpenCV_FOUND) + foreach(k core imgproc) + otr_install_lib("opencv_${k}" "${opentrack-libexec}") + endforeach() add_subdirectory(wiiyourself) otr_module(tracker-wii) - target_link_libraries(${self} opentrack-tracker-pt-base opentrack-wiiyourself bthprops) + target_link_libraries(${self} opencv_imgproc opentrack-tracker-pt-base opentrack-wiiyourself bthprops) if(MINGW32) target_link_libraries(${self} hid) endif() diff --git a/tracker-wii/lang/de_DE.ts b/tracker-wii/lang/de_DE.ts new file mode 100644 index 00000000..fe05cb8e --- /dev/null +++ b/tracker-wii/lang/de_DE.ts @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="de_DE"> +<context> + <name>wii_metadata_pt</name> + <message> + <source>WiiPointTracker 1.1</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/tracker-wii/lang/zh_CN.ts b/tracker-wii/lang/zh_CN.ts index d67c57ad..6959d95b 100644 --- a/tracker-wii/lang/zh_CN.ts +++ b/tracker-wii/lang/zh_CN.ts @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> -<TS version="2.1"> +<TS version="2.1" language="zh_CN"> <context> <name>wii_metadata_pt</name> <message> diff --git a/tracker-wii/wii_camera.cpp b/tracker-wii/wii_camera.cpp index 973d7fab..bec47651 100644 --- a/tracker-wii/wii_camera.cpp +++ b/tracker-wii/wii_camera.cpp @@ -15,11 +15,9 @@ #include "wii_camera.h" #include "wii_frame.hpp" -#include "compat/sleep.hpp" #include "compat/math-imports.hpp" #include <opencv2/imgproc.hpp> - #include <bluetoothapis.h> using namespace pt_module; @@ -35,83 +33,80 @@ WIICamera::WIICamera(const QString& module_name) : s { module_name } WIICamera::~WIICamera() { - // XXX why is this commented out? -sh 20190414 - //stop(); + stop(); } QString WIICamera::get_desired_name() const { - return desired_name; + return QStringLiteral("Wii"); } QString WIICamera::get_active_name() const { - return active_name; + return get_desired_name(); } void WIICamera::show_camera_settings() { - } WIICamera::result WIICamera::get_info() const { - if (cam_info.res_x == 0 || cam_info.res_y == 0) - return result(false, pt_camera_info()); - return result(true, cam_info); + if (cam_info.res_x == 0 || cam_info.res_y == 0) + return result(false, pt_camera_info()); + return result(true, cam_info); } WIICamera::result WIICamera::get_frame(pt_frame& frame_) { - cv::Mat& frame = frame_.as<WIIFrame>()->mat; + cv::Mat& frame = frame_.as<WIIFrame>()->mat; struct wii_info& wii = frame_.as<WIIFrame>()->wii; + const wii_camera_status new_frame = get_frame(frame); - const wii_camera_status new_frame = get_frame(frame); //create a fake blank frame - frame = cv::Mat(cam_info.res_x, cam_info.res_y, CV_8UC3, cv::Scalar(0, 0, 0)); + frame.create(cam_info.res_x, cam_info.res_y, CV_8UC3); + frame.setTo({0}); wii.status = new_frame; - switch (new_frame) - { + switch (new_frame) + { case wii_cam_data_change: - get_status(wii); - get_points(wii); + get_status(wii); + get_points(wii); break; case wii_cam_data_no_change: return result(false, cam_info); - default: - break; + default: + break; } return result(true, cam_info); } -bool WIICamera::start(const QString&, int, int, int) +bool WIICamera::start(const pt_settings&) { + if (m_pDev) + return true; m_pDev = std::make_unique<wiimote>(); m_pDev->ChangedCallback = on_state_change; m_pDev->CallbackTriggerFlags = (state_change_flags)(CONNECTED | EXTENSION_CHANGED | MOTIONPLUS_CHANGED); - return true; + return true; } void WIICamera::stop() { - desired_name = QString(); - active_name = QString(); - cam_info = pt_camera_info(); - cam_desired = pt_camera_info(); - onExit = true; - - if (m_pDev) - { - m_pDev->ChangedCallback = nullptr; - m_pDev->Disconnect(); - m_pDev = nullptr; - } - - Beep(1000, 200); + if (!m_pDev) + return; + + cam_info = {}; + cam_desired = {}; + pitch_ = 0; roll_ = 0; + + m_pDev->ChangedCallback = nullptr; + m_pDev->Disconnect(); + m_pDev = nullptr; } #ifdef __MINGW32__ @@ -149,7 +144,6 @@ wii_camera_status WIICamera::pair() while (ibtidx < max_devices && BluetoothFindNextRadio(&bt_param, hbtlist + ibtidx)); BluetoothFindRadioClose(hbt); - int i; bool error = false; for (i = 0; i < ibtidx; i++) diff --git a/tracker-wii/wii_camera.h b/tracker-wii/wii_camera.h index 3d0ad1aa..3a7993aa 100644 --- a/tracker-wii/wii_camera.h +++ b/tracker-wii/wii_camera.h @@ -27,47 +27,39 @@ namespace pt_module { struct WIICamera final : pt_camera { - WIICamera(const QString& module_name); - ~WIICamera() override; + WIICamera(const QString& module_name); + ~WIICamera() override; - bool start(const QString& name, int fps, int res_x, int res_y) override; - void stop() override; + bool start(const pt_settings&) override; + void stop() override; - result get_frame(pt_frame& Frame) override; - result get_info() const override; + result get_frame(pt_frame& Frame) override; + result get_info() const override; - pt_camera_info get_desired() const override { return cam_desired; } - QString get_desired_name() const override; - QString get_active_name() const override; + pt_camera_info get_desired() const override { return cam_desired; } + QString get_desired_name() const override; + QString get_active_name() const override; - void set_fov(f x) override { (void) x; } - void show_camera_settings() override; + void set_fov(f x) override { (void) x; } + void show_camera_settings() override; private: std::unique_ptr<wiimote> m_pDev; static void on_state_change(wiimote &remote, state_change_flags changed, const wiimote_state &new_state); - bool onExit = false; wii_camera_status pair(); wii_camera_status get_frame(cv::Mat& Frame); bool get_points(struct wii_info& wii); void get_status(struct wii_info& wii); - double dt_mean = 0; + pt_camera_info cam_info; + pt_camera_info cam_desired; + int pitch_ = 0, roll_ = 0; + pt_settings s; - Timer t; - - pt_camera_info cam_info; - pt_camera_info cam_desired; - QString desired_name, active_name; - - pt_settings s; - - int pitch_ = 0, roll_ = 0; - - static constexpr inline double dt_eps = 1./384; + static constexpr inline double dt_eps = 1./384; }; } // ns pt_module diff --git a/tracker-wii/wii_frame.cpp b/tracker-wii/wii_frame.cpp index 8f18f4b8..fcde5235 100644 --- a/tracker-wii/wii_frame.cpp +++ b/tracker-wii/wii_frame.cpp @@ -17,7 +17,7 @@ using namespace pt_module; -WIIPreview& WIIPreview::operator=(const pt_frame& frame_) +void WIIPreview::set_last_frame(const pt_frame& frame_) { const struct wii_info& wii = frame_.as_const<WIIFrame>()->wii; const cv::Mat& frame = frame_.as_const<const WIIFrame>()->mat; @@ -25,18 +25,13 @@ WIIPreview& WIIPreview::operator=(const pt_frame& frame_) status = wii.status; if (frame.channels() != 3) - { eval_once(qDebug() << "tracker/pt: camera frame depth: 3 !=" << frame.channels()); - return *this; - } const bool need_resize = frame.cols != frame_out.cols || frame.rows != frame_out.rows; if (need_resize) cv::resize(frame, frame_copy, cv::Size(frame_out.cols, frame_out.rows), 0, 0, cv::INTER_NEAREST); else frame.copyTo(frame_copy); - - return *this; } WIIPreview::WIIPreview(int w, int h) diff --git a/tracker-wii/wii_frame.hpp b/tracker-wii/wii_frame.hpp index 5d6dd199..bbb0c469 100644 --- a/tracker-wii/wii_frame.hpp +++ b/tracker-wii/wii_frame.hpp @@ -47,7 +47,7 @@ struct WIIPreview final : pt_preview { WIIPreview(int w, int h); - WIIPreview& operator=(const pt_frame& frame) override; + void set_last_frame(const pt_frame& frame) override; QImage get_bitmap() override; void draw_head_center(f x, f y) override; @@ -58,7 +58,7 @@ private: static void ensure_size(cv::Mat& frame, int w, int h, int type); cv::Mat frame_copy, frame_out; - wii_camera_status status; + wii_camera_status status = wii_cam_wait_for_connect; }; } // ns pt_module diff --git a/tracker-wii/wii_module.cpp b/tracker-wii/wii_module.cpp index 0358004f..b384078c 100644 --- a/tracker-wii/wii_module.cpp +++ b/tracker-wii/wii_module.cpp @@ -15,6 +15,8 @@ #include "pt-api.hpp" +#include "compat/linkage-macros.hpp" + #include <memory> static const QString module_name = "tracker-wii-pt"; @@ -62,8 +64,10 @@ struct wii_dialog_pt : TrackerDialog_PT wii_dialog_pt(); }; -struct wii_metadata_pt : Metadata +struct OTR_GENERIC_EXPORT wii_metadata_pt : Metadata { + Q_OBJECT + QString name() { return tr("WiiPointTracker 1.1"); } QIcon icon() { return QIcon(":/Resources/wii.png"); } }; diff --git a/tracker-wii/wii_point_extractor.cpp b/tracker-wii/wii_point_extractor.cpp index 393dc1c9..4f1f92b9 100644 --- a/tracker-wii/wii_point_extractor.cpp +++ b/tracker-wii/wii_point_extractor.cpp @@ -27,7 +27,6 @@ using namespace pt_module; WIIPointExtractor::WIIPointExtractor(const QString& module_name) : s(module_name) { - } //define a temp draw function @@ -35,8 +34,8 @@ void WIIPointExtractor::draw_point(cv::Mat& preview_frame, const vec2& p, const { static constexpr int len = 9; - cv::Point p2(iround(p[0] * preview_frame.cols + preview_frame.cols / 2.f), - iround(-p[1] * preview_frame.cols + preview_frame.rows / 2.f)); + cv::Point p2(iround(p[0] * preview_frame.cols + preview_frame.cols / 2.f), + iround(-p[1] * preview_frame.cols + preview_frame.rows / 2.f)); cv::line(preview_frame, cv::Point(p2.x - len, p2.y), @@ -48,18 +47,15 @@ void WIIPointExtractor::draw_point(cv::Mat& preview_frame, const vec2& p, const cv::Point(p2.x, p2.y + len), color, thickness); -}; +} -bool WIIPointExtractor::draw_points(cv::Mat& preview_frame, const struct wii_info& wii, std::vector<vec2>& points) +void WIIPointExtractor::draw_points(cv::Mat& preview_frame, const struct wii_info& wii) { constexpr int W = 1024; constexpr int H = 768; - points.reserve(4); - points.clear(); - for (unsigned index = 0; index < 4; index++) // NOLINT(modernize-loop-convert) + for (const wii_info_points& dot : wii.Points) { - const struct wii_info_points &dot = wii.Points[index]; if (dot.bvis) { //qDebug() << "wii:" << dot.RawX << "+" << dot.RawY; //anti-clockwise rotate the 2D point @@ -70,24 +66,19 @@ bool WIIPointExtractor::draw_points(cv::Mat& preview_frame, const struct wii_inf //vec2 dt((2.0f*RX - W) / W, -(2.0f*RY - H ) / W); vec2 dt; std::tie(dt[0], dt[1]) = to_screen_pos(RX, RY, W, H); - - points.push_back(dt); - draw_point(preview_frame, dt, cv::Scalar(0, 255, 0), clamp(dot.isize, 1, 32)); + draw_point(preview_frame, dt, cv::Scalar(0, 255, 0), std::clamp(dot.isize, 1, 32)); } } - const bool success = points.size() >= PointModel::N_POINTS; - - return success; } void WIIPointExtractor::draw_bg(cv::Mat& preview_frame, const struct wii_info& wii) { //draw battery status - cv::line(preview_frame, - cv::Point(0, 0), - cv::Point(preview_frame.cols*wii.BatteryPercent / 100, 0), - (wii.bBatteryDrained ? cv::Scalar(255, 0, 0) : cv::Scalar(0, 140, 0)), - 2); + cv::line(preview_frame, + cv::Point(0, 0), + cv::Point(preview_frame.cols*wii.BatteryPercent / 100, 0), + (wii.bBatteryDrained ? cv::Scalar(255, 0, 0) : cv::Scalar(0, 140, 0)), + 2); //draw horizon int pdelta = iround(preview_frame.rows / 4.f * tan(wii.Pitch * pi / 180.f)); @@ -100,15 +91,46 @@ void WIIPointExtractor::draw_bg(cv::Mat& preview_frame, const struct wii_info& w 1); } -void WIIPointExtractor::extract_points(const pt_frame& frame_, pt_preview& preview_frame_, std::vector<vec2>& points) +void WIIPointExtractor::extract_points(const pt_frame& frame_, + pt_preview& preview_frame_, + bool preview_visible, + std::vector<vec2>& points) { const struct wii_info& wii = frame_.as_const<WIIFrame>()->wii; cv::Mat& preview_frame = *preview_frame_.as<WIIPreview>(); - if (wii.status == wii_cam_data_change) - { - draw_bg(preview_frame, wii); - draw_points(preview_frame, wii, points); - } + map_points(wii, points); + if (preview_visible && wii.status == wii_cam_data_change) + { + draw_bg(preview_frame, wii); + draw_points(preview_frame, wii); + } } +bool WIIPointExtractor::map_points(const struct wii_info& wii, std::vector<vec2>& points) +{ + constexpr int W = 1024; + constexpr int H = 768; + points.reserve(4); + points.clear(); + + for (unsigned index = 0; index < 4; index++) // NOLINT(modernize-loop-convert) + { + const struct wii_info_points &dot = wii.Points[index]; + if (dot.bvis) { + //qDebug() << "wii:" << dot.RawX << "+" << dot.RawY; + //anti-clockwise rotate the 2D point + const float RX = W - dot.ux; + const float RY = H - dot.uy; + //vec2 dt((dot.RawX - W / 2.0f) / W, -(dot.RawY - H / 2.0f) / W); + //vec2 dt((RX - W / 2.0f) / W, -(RY - H / 2.0f) / W); + //vec2 dt((2.0f*RX - W) / W, -(2.0f*RY - H ) / W); + vec2 dt; + std::tie(dt[0], dt[1]) = to_screen_pos(RX, RY, W, H); + + points.push_back(dt); + } + } + + return points.size() >= PointModel::N_POINTS; +} diff --git a/tracker-wii/wii_point_extractor.h b/tracker-wii/wii_point_extractor.h index 4208f1b2..b8b25b1a 100644 --- a/tracker-wii/wii_point_extractor.h +++ b/tracker-wii/wii_point_extractor.h @@ -23,14 +23,18 @@ class WIIPointExtractor final : public pt_point_extractor public: // extracts points from frame and draws some processing info into frame, if draw_output is set // dt: time since last call in seconds - void extract_points(const pt_frame& frame, pt_preview& preview_frame, std::vector<vec2>& points) override; + void extract_points(const pt_frame& frame, + pt_preview& preview_frame, + bool preview_visible, + std::vector<vec2>& points) override; WIIPointExtractor(const QString& module_name); private: pt_settings s; static void draw_point(cv::Mat& preview_frame, const vec2& p, const cv::Scalar& color, int thickness = 1); - static bool draw_points(cv::Mat& preview_frame, const struct wii_info& wii, std::vector<vec2>& points); + static void draw_points(cv::Mat& preview_frame, const struct wii_info& wii); static void draw_bg(cv::Mat& preview_frame, const struct wii_info& wii); + static bool map_points(const struct wii_info& wii, std::vector<vec2>& points); }; } // ns impl diff --git a/tracker-wii/wiiyourself/lang/zh_CN.ts b/tracker-wii/wiiyourself/lang/zh_CN.ts index 6401616d..e5ca8aa9 100644 --- a/tracker-wii/wiiyourself/lang/zh_CN.ts +++ b/tracker-wii/wiiyourself/lang/zh_CN.ts @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> -<TS version="2.1"> +<TS version="2.1" language="zh_CN"> </TS> |