/* Copyright (c) 2012 Patrick Ruoff * Copyright (c) 2014-2016 Stanislaw Halik * * 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. */ #pragma once #include "api/plugin-api.hpp" #include "pt-api.hpp" #include "cv/numeric.hpp" #include "video/video-widget.hpp" #include #include #include #include #include #include #include namespace pt_impl { class EasyTrackerDialog; using namespace numeric_types; struct EasyTracker : QThread, ITracker { friend class EasyTrackerDialog; template using pointer = pt_pointer; explicit EasyTracker(pointer const& pt_runtime_traits); ~EasyTracker() override; module_status start_tracker(QFrame* parent_window) override; void data(double* data) override; bool center() override; int get_n_points(); [[nodiscard]] bool get_cam_info(pt_camera_info& info); private: void run() override; bool maybe_reopen_camera(); void set_fov(int value); pointer traits; QMutex camera_mtx; pt_settings s; std::unique_ptr layout; std::vector points; std::vector iImagePoints; int preview_width = 320, preview_height = 240; pointer point_extractor; pointer camera; pointer widget; pointer frame; pointer preview_frame; std::atomic point_count { 0 }; std::atomic ever_success = false; mutable QMutex center_lock, data_lock; // Translation solutions std::vector iTranslations; // Rotation solutions std::vector iRotations; // Angle solutions, pitch, yaw, roll, in this order std::vector iAngles; // The index of our best solution in the above arrays int iBestSolutionIndex = -1; // Best translation cv::Vec3d iBestTranslation; // Best angles cv::Vec3d iBestAngles; }; } // ns pt_impl using Tracker_PT = pt_impl::EasyTracker;