#pragma once #include #include #include #include #include #include "camera.hpp" // ================================================================================================= class CameraInternal { public: CameraInternal(const Camera &cam); Camera cam; cv::Mat K; cv::Mat DC; cv::Mat R; cv::Mat T; cv::Mat P; void update_projection_matrix(); }; // ================================================================================================= class TriangulatorInternal { public: TriangulatorInternal(double min_score); std::vector>> triangulate_poses( const std::vector>>> &poses_2d, const std::vector &cameras, const std::array, 2> &roomparams, const std::vector &joint_names); void reset(); private: double min_score; const std::vector core_joints = { "shoulder_left", "shoulder_right", "hip_left", "hip_right", "elbow_left", "elbow_right", "knee_left", "knee_right", "wrist_left", "wrist_right", "ankle_left", "ankle_right", }; std::vector last_poses_3d; void undistort_points(cv::Mat &points, CameraInternal &icam); void undistort_poses(std::vector &poses, CameraInternal &icam); std::tuple, std::vector> project_poses( const std::vector &bodies3D, const CameraInternal &icam, bool calc_dists); cv::Mat score_projection( const cv::Mat &pose1, const cv::Mat &repro1, const cv::Mat &dists1, const cv::Mat &mask, double iscale); std::pair triangulate_and_score( const cv::Mat &pose1, const cv::Mat &pose2, const CameraInternal &cam1, const CameraInternal &cam2, const std::array, 2> &roomparams); std::vector>> calc_grouping( const std::vector, std::pair>> &all_pairs, const std::vector> &all_scored_poses, double min_score); cv::Mat merge_group(const std::vector &poses_3d, double min_score); };