Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/extern
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2013-05-09 20:38:43 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2013-05-09 20:38:43 +0400
commit4f5f97254c06e0043b34df9a689dc45899c011cc (patch)
tree4f3c11d4a59a08f5ffc5a925eb23d3706d52d2c1 /extern
parent522eeaa6a0cd41f9193e42afb1907743101810c9 (diff)
Reconstructed scene scale ambiguity improvement
Made it so reconstructed scene always scaled in a way that variance of camera centers is unity. This solves "issues" when different keyframes will give the same reprojection error but will give scenes with different.scale, which could easily have been considered as a bad keyframe combination. This change is essential for automatic keyframe selection algorithm to work reliable for user.
Diffstat (limited to 'extern')
-rw-r--r--extern/libmv/CMakeLists.txt2
-rw-r--r--extern/libmv/files.txt2
-rw-r--r--extern/libmv/libmv-capi.cpp4
-rw-r--r--extern/libmv/libmv/simple_pipeline/reconstruction_scale.cc69
-rw-r--r--extern/libmv/libmv/simple_pipeline/reconstruction_scale.h36
5 files changed, 113 insertions, 0 deletions
diff --git a/extern/libmv/CMakeLists.txt b/extern/libmv/CMakeLists.txt
index 025481f9954..71554795355 100644
--- a/extern/libmv/CMakeLists.txt
+++ b/extern/libmv/CMakeLists.txt
@@ -58,6 +58,7 @@ set(SRC
libmv/simple_pipeline/modal_solver.cc
libmv/simple_pipeline/pipeline.cc
libmv/simple_pipeline/reconstruction.cc
+ libmv/simple_pipeline/reconstruction_scale.cc
libmv/simple_pipeline/resect.cc
libmv/simple_pipeline/tracks.cc
libmv/tracking/brute_region_tracker.cc
@@ -116,6 +117,7 @@ set(SRC
libmv/simple_pipeline/modal_solver.h
libmv/simple_pipeline/pipeline.h
libmv/simple_pipeline/reconstruction.h
+ libmv/simple_pipeline/reconstruction_scale.h
libmv/simple_pipeline/resect.h
libmv/simple_pipeline/tracks.h
libmv/tracking/brute_region_tracker.h
diff --git a/extern/libmv/files.txt b/extern/libmv/files.txt
index d77d0ea8147..426b6db41fc 100644
--- a/extern/libmv/files.txt
+++ b/extern/libmv/files.txt
@@ -52,6 +52,8 @@ libmv/simple_pipeline/pipeline.cc
libmv/simple_pipeline/pipeline.h
libmv/simple_pipeline/reconstruction.cc
libmv/simple_pipeline/reconstruction.h
+libmv/simple_pipeline/reconstruction_scale.cc
+libmv/simple_pipeline/reconstruction_scale.h
libmv/simple_pipeline/resect.cc
libmv/simple_pipeline/resect.h
libmv/simple_pipeline/tracks.cc
diff --git a/extern/libmv/libmv-capi.cpp b/extern/libmv/libmv-capi.cpp
index b9ca4c12535..0f2ebc50384 100644
--- a/extern/libmv/libmv-capi.cpp
+++ b/extern/libmv/libmv-capi.cpp
@@ -46,6 +46,7 @@
#include "libmv/simple_pipeline/pipeline.h"
#include "libmv/simple_pipeline/camera_intrinsics.h"
#include "libmv/simple_pipeline/modal_solver.h"
+#include "libmv/simple_pipeline/reconstruction_scale.h"
#include <stdlib.h>
#include <assert.h>
@@ -553,6 +554,9 @@ libmv_Reconstruction *libmv_solveReconstruction(libmv_Tracks *libmv_tracks,
progress_update_callback, callback_customdata);
}
+ /* set reconstruction scale to unity */
+ libmv::EuclideanScaleToUnity(reconstruction);
+
/* finish reconstruction */
finishReconstruction(tracks, camera_intrinsics, libmv_reconstruction,
progress_update_callback, callback_customdata);
diff --git a/extern/libmv/libmv/simple_pipeline/reconstruction_scale.cc b/extern/libmv/libmv/simple_pipeline/reconstruction_scale.cc
new file mode 100644
index 00000000000..9841f5cb4eb
--- /dev/null
+++ b/extern/libmv/libmv/simple_pipeline/reconstruction_scale.cc
@@ -0,0 +1,69 @@
+// Copyright (c) 2013 libmv authors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+// sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+
+#include "libmv/simple_pipeline/reconstruction_scale.h"
+#include "libmv/logging/logging.h"
+
+namespace libmv {
+
+void EuclideanScaleToUnity(EuclideanReconstruction *reconstruction) {
+ vector<EuclideanCamera> all_cameras = reconstruction->AllCameras();
+ vector<EuclideanPoint> all_points = reconstruction->AllPoints();
+
+ // Calculate center of the mass of all cameras.
+ Vec3 cameras_mass_center = Vec3::Zero();
+ for (int i = 0; i < all_cameras.size(); ++i) {
+ cameras_mass_center += all_cameras[i].t;
+ }
+ cameras_mass_center /= all_cameras.size();
+
+ // Find the most distant camera from the mass center.
+ double max_distance = 0.0;
+ for (int i = 0; i < all_cameras.size(); ++i) {
+ double distance = (all_cameras[i].t - cameras_mass_center).squaredNorm();
+ if (distance > max_distance) {
+ max_distance = distance;
+ LG << i;
+ }
+ }
+
+ if (max_distance == 0.0) {
+ LG << "Cameras position variance is too small, can not rescale";
+ return;
+ }
+
+ double scale_factor = 1.0 / sqrt(max_distance);
+
+ // Rescale cameras positions.
+ for (int i = 0; i < all_cameras.size(); ++i) {
+ int image = all_cameras[i].image;
+ EuclideanCamera *camera = reconstruction->CameraForImage(image);
+ camera->t = camera->t * scale_factor;
+ }
+
+ // Rescale points positions.
+ for (int i = 0; i < all_points.size(); ++i) {
+ int track = all_points[i].track;
+ EuclideanPoint *point = reconstruction->PointForTrack(track);
+ point->X = point->X * scale_factor;
+ }
+}
+
+} // namespace libmv
diff --git a/extern/libmv/libmv/simple_pipeline/reconstruction_scale.h b/extern/libmv/libmv/simple_pipeline/reconstruction_scale.h
new file mode 100644
index 00000000000..f2349ff5146
--- /dev/null
+++ b/extern/libmv/libmv/simple_pipeline/reconstruction_scale.h
@@ -0,0 +1,36 @@
+// Copyright (c) 2013 libmv authors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+// sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+
+#ifndef LIBMV_SIMPLE_PIPELINE_RECONSTRUCTION_SCALE_H_
+#define LIBMV_SIMPLE_PIPELINE_RECONSTRUCTION_SCALE_H_
+
+#include "libmv/simple_pipeline/reconstruction.h"
+
+namespace libmv {
+
+/*!
+ Scale euclidean reconstruction in a way variance of
+ camera centers equals to one.
+ */
+void EuclideanScaleToUnity(EuclideanReconstruction *reconstruction);
+
+} // namespace libmv
+
+#endif // LIBMV_SIMPLE_PIPELINE_RECONSTRUCTION_SCALE_H_