@@ -69,17 +69,20 @@ MapClosures::MapClosures(const Config &config) : config_(config) {
6969
7070void MapClosures::MatchAndAddToDatabase (const int id,
7171 const std::vector<Eigen::Vector3d> &local_map) {
72- Eigen::Matrix4d T_ground = AlignToLocalGround (local_map, ground_alignment_resolution);
72+ const Eigen::Matrix4d & T_ground = AlignToLocalGround (local_map, ground_alignment_resolution);
7373 DensityMap density_map = GenerateDensityMap (local_map, T_ground, config_.density_map_resolution ,
7474 config_.density_threshold );
7575 cv::Mat orb_descriptors;
7676 std::vector<cv::KeyPoint> orb_keypoints;
77+ orb_keypoints.reserve (nfeatures);
7778 orb_extractor_->detectAndCompute (density_map.grid , cv::noArray (), orb_keypoints,
7879 orb_descriptors);
80+ orb_keypoints.shrink_to_fit ();
7981
80- auto matcher = cv::BFMatcher (cv::NORM_HAMMING);
81- std::vector<std::vector<cv::DMatch>> bf_matches;
82- matcher.knnMatch (orb_descriptors, orb_descriptors, bf_matches, 2 );
82+ const auto self_matcher = cv::BFMatcher (cv::NORM_HAMMING);
83+ std::vector<std::vector<cv::DMatch>> self_matches;
84+ self_matches.reserve (orb_keypoints.size ());
85+ self_matcher.knnMatch (orb_descriptors, orb_descriptors, self_matches, 2 );
8386
8487 std::for_each (orb_keypoints.begin (), orb_keypoints.end (), [&](cv::KeyPoint &keypoint) {
8588 keypoint.pt .x = keypoint.pt .x + static_cast <float >(density_map.lower_bound .y ());
@@ -90,10 +93,10 @@ void MapClosures::MatchAndAddToDatabase(const int id,
9093
9194 std::vector<Matchable *> hbst_matchable;
9295 hbst_matchable.reserve (orb_descriptors.rows );
93- std::for_each (bf_matches .cbegin (), bf_matches .cend (), [&](const auto &bf_match ) {
94- if (bf_match [1 ].distance > self_similarity_threshold) {
95- auto index_descriptor = bf_match [0 ].queryIdx ;
96- auto keypoint = orb_keypoints[index_descriptor];
96+ std::for_each (self_matches .cbegin (), self_matches .cend (), [&](const auto &self_match ) {
97+ if (self_match [1 ].distance > self_similarity_threshold) {
98+ const auto index_descriptor = self_match [0 ].queryIdx ;
99+ const auto & keypoint = orb_keypoints[index_descriptor];
97100 hbst_matchable.emplace_back (
98101 new Matchable (keypoint, orb_descriptors.row (index_descriptor), id));
99102 }
@@ -169,20 +172,18 @@ std::vector<ClosureCandidate> MapClosures::GetTopKClosures(
169172 [&](const auto &descriptor_match) {
170173 const auto ref_id = static_cast <int >(descriptor_match.first );
171174 if (is_far_enough (ref_id, query_id)) {
172- ClosureCandidate closure =
173- ValidateClosure (descriptor_match.first , query_id);
175+ const ClosureCandidate &closure = ValidateClosure (ref_id, query_id);
174176 if (closure.number_of_inliers > min_no_of_matches) {
175177 closures.emplace_back (closure);
176178 }
177179 }
178180 });
179- if (k == -1 ) return closures;
180-
181- std::vector<ClosureCandidate> top_k_closures;
182- top_k_closures.reserve (std::min (k, static_cast <int >(closures.size ())));
183- std::sort (closures.begin (), closures.end (), compare_closure_candidates);
184- std::copy_n (closures.cbegin (), std::min (k, static_cast <int >(closures.size ())),
185- std::back_inserter (top_k_closures));
186- return top_k_closures;
181+ closures.shrink_to_fit ();
182+
183+ if (k != -1 ) {
184+ std::sort (closures.begin (), closures.end (), compare_closure_candidates);
185+ closures.resize (std::min (k, static_cast <int >(closures.size ())));
186+ }
187+ return closures;
187188}
188189} // namespace map_closures
0 commit comments