| 117 | } |
| 118 | |
| 119 | std::vector<std::vector<int>> Model::GetMaxOverlappingImages( |
| 120 | const size_t num_images, const double min_triangulation_angle) const { |
| 121 | std::vector<std::vector<int>> overlapping_images(images.size()); |
| 122 | |
| 123 | const float min_triangulation_angle_rad = DegToRad(min_triangulation_angle); |
| 124 | |
| 125 | const auto shared_num_points = ComputeSharedPoints(); |
| 126 | |
| 127 | const float kTriangulationAnglePercentile = 75; |
| 128 | const auto triangulation_angles = |
| 129 | ComputeTriangulationAngles(kTriangulationAnglePercentile); |
| 130 | |
| 131 | for (size_t image_idx = 0; image_idx < images.size(); ++image_idx) { |
| 132 | const auto& shared_images = shared_num_points.at(image_idx); |
| 133 | const auto& overlapping_triangulation_angles = |
| 134 | triangulation_angles.at(image_idx); |
| 135 | |
| 136 | std::vector<std::pair<int, int>> ordered_images; |
| 137 | ordered_images.reserve(shared_images.size()); |
| 138 | for (const auto& [image_idx, count] : shared_images) { |
| 139 | if (overlapping_triangulation_angles.at(image_idx) >= |
| 140 | min_triangulation_angle_rad) { |
| 141 | ordered_images.emplace_back(image_idx, count); |
| 142 | } |
| 143 | } |
| 144 | |
| 145 | const size_t eff_num_images = std::min(ordered_images.size(), num_images); |
| 146 | if (eff_num_images < shared_images.size()) { |
| 147 | std::partial_sort(ordered_images.begin(), |
| 148 | ordered_images.begin() + eff_num_images, |
| 149 | ordered_images.end(), |
| 150 | [](const std::pair<int, int> image1, |
| 151 | const std::pair<int, int> image2) { |
| 152 | return image1.second > image2.second; |
| 153 | }); |
| 154 | } else { |
| 155 | std::sort(ordered_images.begin(), |
| 156 | ordered_images.end(), |
| 157 | [](const std::pair<int, int> image1, |
| 158 | const std::pair<int, int> image2) { |
| 159 | return image1.second > image2.second; |
| 160 | }); |
| 161 | } |
| 162 | |
| 163 | overlapping_images[image_idx].reserve(eff_num_images); |
| 164 | for (size_t i = 0; i < eff_num_images; ++i) { |
| 165 | overlapping_images[image_idx].push_back(ordered_images[i].first); |
| 166 | } |
| 167 | } |
| 168 | |
| 169 | return overlapping_images; |
| 170 | } |
| 171 | |
| 172 | const std::vector<std::vector<int>>& Model::GetMaxOverlappingImagesFromPMVS() |
| 173 | const { |