Fix field_to_target population when N training images > 1
We were populating the field_to_target in the ImageMatchResult message
based on the wrong index.
Change-Id: Iff3c3c7dc96d83327b1d6f697d695025c44d7695
Signed-off-by: James Kuszmaul <jabukuszmaul@gmail.com>
diff --git a/y2020/vision/camera_reader.cc b/y2020/vision/camera_reader.cc
index f5b0612..66c76dd 100644
--- a/y2020/vision/camera_reader.cc
+++ b/y2020/vision/camera_reader.cc
@@ -82,6 +82,7 @@
const std::vector<cv::Mat> &field_camera_list,
const std::vector<cv::Point2f> &target_point_vector,
const std::vector<float> &target_radius_vector,
+ const std::vector<int> &training_image_indices,
aos::Sender<sift::ImageMatchResult> *result_sender,
bool send_details);
@@ -218,6 +219,7 @@
const std::vector<cv::Mat> &field_camera_list,
const std::vector<cv::Point2f> &target_point_vector,
const std::vector<float> &target_radius_vector,
+ const std::vector<int> &training_image_indices,
aos::Sender<sift::ImageMatchResult> *result_sender, bool send_details) {
auto builder = result_sender->MakeBuilder();
const auto camera_calibration_offset =
@@ -252,8 +254,8 @@
sift::CreateTransformationMatrix(*builder.fbb(), fc_data_offset);
const flatbuffers::Offset<sift::TransformationMatrix>
- field_to_target_offset =
- aos::RecursiveCopyFlatBuffer(FieldToTarget(i), builder.fbb());
+ field_to_target_offset = aos::RecursiveCopyFlatBuffer(
+ FieldToTarget(training_image_indices[i]), builder.fbb());
sift::CameraPose::Builder pose_builder(*builder.fbb());
pose_builder.add_camera_to_target(transform_offset);
@@ -355,12 +357,13 @@
// Build list of target point and radius for each good match
std::vector<cv::Point2f> target_point_vector;
std::vector<float> target_radius_vector;
+ std::vector<int> training_image_indices;
// Iterate through matches for each training image
for (size_t i = 0; i < per_image_matches.size(); ++i) {
const PerImageMatches &per_image = per_image_matches[i];
- VLOG(2) << "Number of matches to start: " << per_image_matches.size()
+ VLOG(2) << "Number of matches to start: " << per_image.matches.size()
<< "\n";
// If we don't have enough matches to start, skip this set of matches
if (per_image.matches.size() < kMinimumMatchCount) {
@@ -494,6 +497,8 @@
const_cast<void *>(static_cast<const void *>(
FieldToTarget(i)->data()->data())));
+ training_image_indices.push_back(i);
+
const cv::Mat R_field_target =
H_field_target(cv::Range(0, 3), cv::Range(0, 3));
const cv::Mat T_field_target =
@@ -532,11 +537,11 @@
SendImageMatchResult(image, keypoints, descriptors, all_good_matches,
camera_target_list, field_camera_list,
target_point_vector, target_radius_vector,
- &detailed_result_sender_, true);
+ training_image_indices, &detailed_result_sender_, true);
SendImageMatchResult(image, keypoints, descriptors, all_good_matches,
camera_target_list, field_camera_list,
target_point_vector, target_radius_vector,
- &result_sender_, false);
+ training_image_indices, &result_sender_, false);
}
void CameraReader::ReadImage() {