summaryrefslogtreecommitdiffhomepage
path: root/tracker-pt/pt-api.hpp
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2018-01-12 19:40:22 +0100
committerStanislaw Halik <sthalik@misaki.pl>2018-01-12 19:40:22 +0100
commit537a88e522314753149e1ea7921489e58043b40c (patch)
treea62ac59a546c8b0ee8adeee3bd2aa255d7e4570e /tracker-pt/pt-api.hpp
parent11d8e48e4370c9201f8258b418aadc7a4290dba1 (diff)
tracker/pt: isolate point extractor and image type
Issue: #718
Diffstat (limited to 'tracker-pt/pt-api.hpp')
-rw-r--r--tracker-pt/pt-api.hpp46
1 files changed, 43 insertions, 3 deletions
diff --git a/tracker-pt/pt-api.hpp b/tracker-pt/pt-api.hpp
index 79a47526..833a640e 100644
--- a/tracker-pt/pt-api.hpp
+++ b/tracker-pt/pt-api.hpp
@@ -5,10 +5,14 @@
#include "cv/numeric.hpp"
#include "options/options.hpp"
+#include <tuple>
+#include <type_traits>
#include <memory>
#include <opencv2/core.hpp>
+#include <QImage>
+
struct OTR_PT_EXPORT pt_camera_info final
{
pt_camera_info();
@@ -34,6 +38,40 @@ enum pt_color_type
pt_color_blue_only = 6,
};
+struct OTR_PT_EXPORT pt_frame
+{
+ pt_frame();
+ virtual ~pt_frame();
+
+ template<typename t>
+ t* as() &
+ {
+ using u = std::decay_t<t>;
+ static_assert(std::is_convertible_v<u*, pt_frame*>, "must be derived from pt_image");
+
+ return static_cast<t*>(this);
+ }
+
+ template<typename t>
+ t const* as_const() const&
+ {
+ return const_cast<pt_frame*>(this)->as<const t>();
+ }
+};
+
+struct OTR_PT_EXPORT pt_pixel_pos_mixin
+{
+ static std::tuple<double, double> to_pixel_pos(double x, double y, int w, int h);
+ static std::tuple<double, double> to_screen_pos(double px, double py, int w, int h);
+};
+
+struct OTR_PT_EXPORT pt_preview : pt_frame, pt_pixel_pos_mixin
+{
+ virtual pt_preview& operator=(const pt_frame&) = 0;
+ virtual QImage get_bitmap() = 0;
+ virtual void draw_head_center(double x, double y) = 0;
+};
+
struct OTR_PT_EXPORT pt_camera
{
using result = std::tuple<bool, pt_camera_info>;
@@ -43,7 +81,7 @@ struct OTR_PT_EXPORT pt_camera
virtual warn_result_unused pt_camera_open_status start(int idx, int fps, int res_x, int res_y) = 0;
virtual void stop() = 0;
- virtual warn_result_unused result get_frame(cv::Mat& frame) = 0;
+ virtual warn_result_unused result get_frame(pt_frame& frame) = 0;
virtual warn_result_unused result get_info() const = 0;
virtual pt_camera_info get_desired() const = 0;
@@ -57,13 +95,13 @@ struct OTR_PT_EXPORT pt_camera
virtual void show_camera_settings() = 0;
};
-struct OTR_PT_EXPORT pt_point_extractor
+struct OTR_PT_EXPORT pt_point_extractor : pt_pixel_pos_mixin
{
using vec2 = types::vec2;
pt_point_extractor();
virtual ~pt_point_extractor();
- virtual void extract_points(const cv::Mat& frame, cv::Mat& preview_frame, std::vector<vec2>& points) = 0;
+ virtual void extract_points(const pt_frame& image, pt_preview& preview_frame, std::vector<vec2>& points) = 0;
static double threshold_radius_value(int w, int h, int threshold);
};
@@ -115,5 +153,7 @@ struct OTR_PT_EXPORT pt_runtime_traits
virtual std::unique_ptr<pt_camera> make_camera() const = 0;
virtual std::unique_ptr<pt_point_extractor> make_point_extractor() const = 0;
+ virtual std::unique_ptr<pt_frame> make_frame() const = 0;
+ virtual std::unique_ptr<pt_preview> make_preview(int w, int h) const = 0;
virtual QString get_module_name() const = 0;
};