blob: 1ac3d55802b8dad12724351dc45b7e6b1ba3eda8 [file] [log] [blame]
milind-u92195982022-01-22 20:29:31 -08001#include "y2022/vision/target_estimator.h"
2
3namespace y2022::vision {
4
Henry Speisere45e7a22022-02-04 23:17:01 -08005void TargetEstimator::EstimateTargetLocation(cv::Point2i centroid,
6 const cv::Mat &intrinsics,
7 const cv::Mat &extrinsics,
8 TargetEstimate::Builder *builder) {
milind-u92195982022-01-22 20:29:31 -08009 const cv::Point2d focal_length(intrinsics.at<double>(0, 0),
10 intrinsics.at<double>(1, 1));
11 const cv::Point2d offset(intrinsics.at<double>(0, 2),
12 intrinsics.at<double>(1, 2));
13
14 // Blob pitch in camera reference frame
15 const double blob_pitch =
Henry Speisere45e7a22022-02-04 23:17:01 -080016 std::atan(static_cast<double>(-(centroid.y - offset.y)) /
milind-u92195982022-01-22 20:29:31 -080017 static_cast<double>(focal_length.y));
18 const double camera_height = extrinsics.at<double>(2, 3);
19 // Depth from camera to blob
20 const double depth = (kTapeHeight - camera_height) / std::tan(blob_pitch);
21
Henry Speisere45e7a22022-02-04 23:17:01 -080022 double angle_to_target =
23 std::atan2(static_cast<double>(centroid.x - offset.x),
milind-u92195982022-01-22 20:29:31 -080024 static_cast<double>(focal_length.x));
Henry Speisere45e7a22022-02-04 23:17:01 -080025 double distance = (depth / std::cos(angle_to_target)) + kUpperHubRadius;
milind-u92195982022-01-22 20:29:31 -080026
Henry Speisere45e7a22022-02-04 23:17:01 -080027 builder->add_angle_to_target(angle_to_target);
28 builder->add_distance(distance);
milind-u92195982022-01-22 20:29:31 -080029}
30
31} // namespace y2022::vision