#pragma once #include #include #include #include "camera.hpp" // ================================================================================================= class CameraInternal { public: CameraInternal(const Camera &cam); Camera cam; std::array, 3> invK; std::array, 3> invR; std::array center; static std::array, 3> transpose3x3( const std::array, 3> &M); static std::array, 3> invert3x3( const std::array, 3> &M); static void undistort_point_pinhole(std::array &p, const std::vector &k); static void undistort_point_fisheye(std::array &p, const std::vector &k); std::array, 3> calc_optimal_camera_matrix_fisheye( float balance, std::pair new_size); std::array, 3> calc_optimal_camera_matrix_pinhole( float alpha, std::pair new_size); }; // ================================================================================================= class TriangulatorInternal { public: TriangulatorInternal(float min_match_score, size_t min_group_size); 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(); void print_stats(); private: float min_match_score; float min_group_size; 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", }; const std::vector> core_limbs = { {"knee_left", "ankle_left"}, {"hip_left", "knee_left"}, {"hip_right", "knee_right"}, {"knee_right", "ankle_right"}, {"elbow_left", "wrist_left"}, {"elbow_right", "wrist_right"}, {"shoulder_left", "elbow_left"}, {"shoulder_right", "elbow_right"}, }; std::vector>> last_poses_3d; void undistort_poses( std::vector>> &poses_2d, CameraInternal &icam); std::tuple>>, std::vector>> project_poses( const std::vector>> &poses_3d, const CameraInternal &icam, bool calc_dists); float calc_pose_score( const std::vector> &pose1, const std::vector> &pose2, const std::vector &dist1, const CameraInternal &icam); std::vector score_projection( const std::vector> &pose, const std::vector> &repro, const std::vector &dists, const std::vector &mask, float iscale); std::pair>, float> triangulate_and_score( const std::vector> &pose1, const std::vector> &pose2, const CameraInternal &cam1, const CameraInternal &cam2, const std::array, 2> &roomparams, const std::vector> &core_limbs_idx); std::vector, std::vector>, std::vector>> calc_grouping( const std::vector, std::pair>> &all_pairs, const std::vector>, float>> &all_scored_poses, float min_score); std::vector> merge_group( const std::vector>> &poses_3d, float min_score); void add_extra_joints( std::vector>> &poses, const std::vector &joint_names); void filter_poses( std::vector>> &poses, const std::array, 2> &roomparams, const std::vector &core_joint_idx, const std::vector> &core_limbs_idx); void add_missing_joints( std::vector>> &poses, const std::vector &joint_names); // Statistics double num_calls = 0; double total_time = 0; double init_time = 0; double undistort_time = 0; double project_time = 0; double match_time = 0; double pairs_time = 0; double pair_scoring_time = 0; double grouping_time = 0; double full_time = 0; double merge_time = 0; double post_time = 0; double convert_time = 0; };