[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56632] trunk/blender: Reconstructed scene scale ambiguity improvement

Sergey Sharybin sergey.vfx at gmail.com
Thu May 9 18:38:43 CEST 2013


Revision: 56632
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56632
Author:   nazgul
Date:     2013-05-09 16:38:43 +0000 (Thu, 09 May 2013)
Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/extern/libmv/CMakeLists.txt
    trunk/blender/extern/libmv/files.txt
    trunk/blender/extern/libmv/libmv-capi.cpp
    trunk/blender/source/blender/blenkernel/intern/tracking.c

Added Paths:
-----------
    trunk/blender/extern/libmv/libmv/simple_pipeline/reconstruction_scale.cc
    trunk/blender/extern/libmv/libmv/simple_pipeline/reconstruction_scale.h

Modified: trunk/blender/extern/libmv/CMakeLists.txt
===================================================================
--- trunk/blender/extern/libmv/CMakeLists.txt	2013-05-09 16:16:41 UTC (rev 56631)
+++ trunk/blender/extern/libmv/CMakeLists.txt	2013-05-09 16:38:43 UTC (rev 56632)
@@ -58,6 +58,7 @@
 	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 @@
 	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

Modified: trunk/blender/extern/libmv/files.txt
===================================================================
--- trunk/blender/extern/libmv/files.txt	2013-05-09 16:16:41 UTC (rev 56631)
+++ trunk/blender/extern/libmv/files.txt	2013-05-09 16:38:43 UTC (rev 56632)
@@ -52,6 +52,8 @@
 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

Added: trunk/blender/extern/libmv/libmv/simple_pipeline/reconstruction_scale.cc
===================================================================
--- trunk/blender/extern/libmv/libmv/simple_pipeline/reconstruction_scale.cc	                        (rev 0)
+++ trunk/blender/extern/libmv/libmv/simple_pipeline/reconstruction_scale.cc	2013-05-09 16:38:43 UTC (rev 56632)
@@ -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

Added: trunk/blender/extern/libmv/libmv/simple_pipeline/reconstruction_scale.h
===================================================================
--- trunk/blender/extern/libmv/libmv/simple_pipeline/reconstruction_scale.h	                        (rev 0)
+++ trunk/blender/extern/libmv/libmv/simple_pipeline/reconstruction_scale.h	2013-05-09 16:38:43 UTC (rev 56632)
@@ -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_

Modified: trunk/blender/extern/libmv/libmv-capi.cpp
===================================================================
--- trunk/blender/extern/libmv/libmv-capi.cpp	2013-05-09 16:16:41 UTC (rev 56631)
+++ trunk/blender/extern/libmv/libmv-capi.cpp	2013-05-09 16:38:43 UTC (rev 56632)
@@ -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 @@
 			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);

Modified: trunk/blender/source/blender/blenkernel/intern/tracking.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/tracking.c	2013-05-09 16:16:41 UTC (rev 56631)
+++ trunk/blender/source/blender/blenkernel/intern/tracking.c	2013-05-09 16:38:43 UTC (rev 56632)
@@ -2834,18 +2834,29 @@
 			float mat[4][4];
 			float error = libmv_reporojectionErrorForImage(libmv_reconstruction, a);
 
-			for (i = 0; i < 4; i++)
+			for (i = 0; i < 4; i++) {
 				for (j = 0; j < 4; j++)
 					mat[i][j] = matd[i][j];
+			}
 
+			/* Ensure first camera has got zero rotation and transform.
+			 * This is essential for object tracking to work -- this way
+			 * we'll always know object and environment are properly
+			 * oriented.
+			 *
+			 * There's one weak part tho, which is requirement object
+			 * motion starts at the same frame as camera motion does,
+			 * otherwise that;' be a russian roulette whether object is
+			 * aligned correct or not.
+			 */
 			if (!origin_set) {
-				copy_m4_m4(imat, mat);
-				invert_m4(imat);
+				invert_m4_m4(imat, mat);
+				unit_m4(mat);
 				origin_set = TRUE;
 			}
-
-			if (origin_set)
+			else {
 				mult_m4_m4m4(mat, imat, mat);
+			}
 
 			copy_m4_m4(reconstructed[reconstruction->camnr].mat, mat);
 			reconstructed[reconstruction->camnr].framenr = a;




More information about the Bf-blender-cvs mailing list