diff --git a/modules/stitching/src/autocalib.cpp b/modules/stitching/src/autocalib.cpp index b82c286c3d75a89fff86c1a43d4f3126f890ffe5..4532f77ad5ca7f83e946993132f106f8748bcbe1 100644 --- a/modules/stitching/src/autocalib.cpp +++ b/modules/stitching/src/autocalib.cpp @@ -120,9 +120,16 @@ void estimateFocal(const vector &features, const vector(all_focals.size()) >= num_images - 1) { - nth_element(all_focals.begin(), all_focals.begin() + all_focals.size()/2, all_focals.end()); + double median; + + sort(all_focals.begin(), all_focals.end()); + if (all_focals.size() % 2 == 1) + median = all_focals[all_focals.size() / 2]; + else + median = (all_focals[all_focals.size() / 2 - 1] + all_focals[all_focals.size() / 2]) * 0.5; + for (int i = 0; i < num_images; ++i) - focals[i] = all_focals[all_focals.size()/2]; + focals[i] = median; } else { diff --git a/modules/stitching/src/stitcher.cpp b/modules/stitching/src/stitcher.cpp index d7b7ef79b19d50a6849deb8e6f40759a602fd9f7..14c1ce4b5304daede1a514071561beaa9f82791d 100644 --- a/modules/stitching/src/stitcher.cpp +++ b/modules/stitching/src/stitcher.cpp @@ -442,8 +442,13 @@ void Stitcher::estimateCameraParams() LOGLN("Camera #" << indices_[i] + 1 << ":\n" << cameras_[i].K()); focals.push_back(cameras_[i].focal); } - nth_element(focals.begin(), focals.begin() + focals.size()/2, focals.end()); - warped_image_scale_ = static_cast(focals[focals.size() / 2]); + + sort(focals.begin(), focals.end()); + float warped_image_scale; + if (focals.size() % 2 == 1) + warped_image_scale = static_cast(focals[focals.size() / 2]); + else + warped_image_scale = static_cast(focals[focals.size() / 2 - 1] + focals[focals.size() / 2]) * 0.5f; if (do_wave_correct_) { diff --git a/samples/cpp/stitching_detailed.cpp b/samples/cpp/stitching_detailed.cpp index d6fd68fa59d83b60473dca04206c04d4cfe6c8b1..4f01f72efe53e561c9690351a822b090eb9b5a76 100644 --- a/samples/cpp/stitching_detailed.cpp +++ b/samples/cpp/stitching_detailed.cpp @@ -486,14 +486,20 @@ int main(int argc, char* argv[]) (*adjuster)(features, pairwise_matches, cameras); // Find median focal length + vector focals; for (size_t i = 0; i < cameras.size(); ++i) { LOGLN("Camera #" << indices[i]+1 << ":\n" << cameras[i].K()); focals.push_back(cameras[i].focal); } - nth_element(focals.begin(), focals.begin() + focals.size()/2, focals.end()); - float warped_image_scale = static_cast(focals[focals.size() / 2]); + + sort(focals.begin(), focals.end()); + float warped_image_scale; + if (focals.size() % 2 == 1) + warped_image_scale = static_cast(focals[focals.size() / 2]); + else + warped_image_scale = static_cast(focals[focals.size() / 2 - 1] + focals[focals.size() / 2]) * 0.5f; if (do_wave_correct) {