milind-u | 9219598 | 2022-01-22 20:29:31 -0800 | [diff] [blame] | 1 | #include "y2022/vision/target_estimator.h" |
| 2 | |
| 3 | namespace y2022::vision { |
| 4 | |
Henry Speiser | e45e7a2 | 2022-02-04 23:17:01 -0800 | [diff] [blame] | 5 | void TargetEstimator::EstimateTargetLocation(cv::Point2i centroid, |
| 6 | const cv::Mat &intrinsics, |
| 7 | const cv::Mat &extrinsics, |
| 8 | TargetEstimate::Builder *builder) { |
milind-u | 9219598 | 2022-01-22 20:29:31 -0800 | [diff] [blame] | 9 | 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 Speiser | e45e7a2 | 2022-02-04 23:17:01 -0800 | [diff] [blame] | 16 | std::atan(static_cast<double>(-(centroid.y - offset.y)) / |
milind-u | 9219598 | 2022-01-22 20:29:31 -0800 | [diff] [blame] | 17 | 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 Speiser | e45e7a2 | 2022-02-04 23:17:01 -0800 | [diff] [blame] | 22 | double angle_to_target = |
| 23 | std::atan2(static_cast<double>(centroid.x - offset.x), |
milind-u | 9219598 | 2022-01-22 20:29:31 -0800 | [diff] [blame] | 24 | static_cast<double>(focal_length.x)); |
Henry Speiser | e45e7a2 | 2022-02-04 23:17:01 -0800 | [diff] [blame] | 25 | double distance = (depth / std::cos(angle_to_target)) + kUpperHubRadius; |
milind-u | 9219598 | 2022-01-22 20:29:31 -0800 | [diff] [blame] | 26 | |
Henry Speiser | e45e7a2 | 2022-02-04 23:17:01 -0800 | [diff] [blame] | 27 | builder->add_angle_to_target(angle_to_target); |
| 28 | builder->add_distance(distance); |
milind-u | 9219598 | 2022-01-22 20:29:31 -0800 | [diff] [blame] | 29 | } |
| 30 | |
| 31 | } // namespace y2022::vision |