[Bf-blender-cvs] [65e6387] soc-2016-multiview: finish the rough pipeline, begin debugging

Tianwei Shen noreply at git.blender.org
Tue Jun 28 05:33:30 CEST 2016


Commit: 65e6387307fdcb2524f7b8db2c67252d113f3957
Author: Tianwei Shen
Date:   Thu Jun 23 21:51:08 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rB65e6387307fdcb2524f7b8db2c67252d113f3957

finish the rough pipeline, begin debugging

===================================================================

M	intern/libmv/intern/reconstructionN.cc
M	intern/libmv/libmv/autotrack/pipeline.cc
M	intern/libmv/libmv/autotrack/pipeline.h
M	intern/libmv/libmv/autotrack/reconstruction.cc
M	intern/libmv/libmv/autotrack/reconstruction.h
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c

===================================================================

diff --git a/intern/libmv/intern/reconstructionN.cc b/intern/libmv/intern/reconstructionN.cc
index 3f59b3e..c019a83 100644
--- a/intern/libmv/intern/reconstructionN.cc
+++ b/intern/libmv/intern/reconstructionN.cc
@@ -101,6 +101,55 @@ void mv_getNormalizedTracks(const Tracks &tracks,
 	}
 }
 
+void libmv_solveRefineIntrinsics(
+        const Tracks &tracks,
+        const int refine_intrinsics,
+        const int bundle_constraints,
+        reconstruct_progress_update_cb progress_update_callback,
+        void* callback_customdata,
+        Reconstruction* reconstruction,
+        CameraIntrinsics* intrinsics) {
+  /* only a few combinations are supported but trust the caller/ */
+  int bundle_intrinsics = 0;
+
+  if (refine_intrinsics & LIBMV_REFINE_FOCAL_LENGTH) {
+    bundle_intrinsics |= mv::BUNDLE_FOCAL_LENGTH;
+  }
+  if (refine_intrinsics & LIBMV_REFINE_PRINCIPAL_POINT) {
+    bundle_intrinsics |= mv::BUNDLE_PRINCIPAL_POINT;
+  }
+  if (refine_intrinsics & LIBMV_REFINE_RADIAL_DISTORTION_K1) {
+    bundle_intrinsics |= mv::BUNDLE_RADIAL_K1;
+  }
+  if (refine_intrinsics & LIBMV_REFINE_RADIAL_DISTORTION_K2) {
+    bundle_intrinsics |= mv::BUNDLE_RADIAL_K2;
+  }
+
+  progress_update_callback(callback_customdata, 1.0, "Refining solution");
+
+  mv::EuclideanBundleCommonIntrinsics(tracks,
+                                      bundle_intrinsics,
+                                      bundle_constraints,
+                                      reconstruction,
+                                      intrinsics);
+}
+
+void finishReconstruction(
+    const Tracks &tracks,
+    const CameraIntrinsics &camera_intrinsics,
+    libmv_ReconstructionN *libmv_reconstruction,
+    reconstruct_progress_update_cb progress_update_callback,
+    void *callback_customdata) {
+	Reconstruction &reconstruction = libmv_reconstruction->reconstruction;
+
+	/* Reprojection error calculation. */
+	progress_update_callback(callback_customdata, 1.0, "Finishing solution");
+	libmv_reconstruction->tracks = tracks;
+	libmv_reconstruction->error = mv::EuclideanReprojectionError(tracks,
+	                                                             reconstruction,
+	                                                             camera_intrinsics);
+}
+
 }	// end of anonymous namespace
 
 void libmv_reconstructionNDestroy(libmv_ReconstructionN* libmv_reconstructionN)
@@ -203,27 +252,28 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
 		return all_libmv_reconstruction;
 	}
 
-	///* Refinement/ */
-	//if (libmv_reconstruction_options->refine_intrinsics) {
-	//	libmv_solveRefineIntrinsics(
-	//	            tracks,
-	//	            libmv_reconstruction_options->refine_intrinsics,
-	//	            libmv::BUNDLE_NO_CONSTRAINTS,
-	//	            progress_update_callback,
-	//	            callback_customdata,
-	//	            &reconstruction,
-	//	            camera_intrinsics);
-	//}
+	/* Refinement/ */
+	// TODO(Tianwei): current api allows only one camera intrinsics
+	if (libmv_reconstruction_options->all_refine_intrinsics[0]) {
+		libmv_solveRefineIntrinsics(
+		            all_normalized_tracks,
+		            libmv_reconstruction_options->all_refine_intrinsics[0],
+		            mv::BUNDLE_NO_CONSTRAINTS,
+		            progress_update_callback,
+		            callback_customdata,
+		            &reconstruction,
+		            all_libmv_reconstruction[0]->intrinsics);
+	}
 
-	///* Set reconstruction scale to unity. */
-	//EuclideanScaleToUnity(&reconstruction);
+	/* Set reconstruction scale to unity. */
+	mv::EuclideanScaleToUnity(&reconstruction);
 
 	/* Finish reconstruction. */
-	//finishReconstruction(tracks,
-	//                     *camera_intrinsics,
-	//                     libmv_reconstruction,
-	//                     progress_update_callback,
-	//                     callback_customdata);
+	finishReconstruction(all_normalized_tracks,
+	                     *(all_libmv_reconstruction[0]->intrinsics),
+	                     all_libmv_reconstruction[0],
+	                     progress_update_callback,
+	                     callback_customdata);
 
 	// a multi-view reconstruction is succesfuly iff all reconstruction falgs are set to true
 	for(int i = 0; i < clip_num; i++)
diff --git a/intern/libmv/libmv/autotrack/pipeline.cc b/intern/libmv/libmv/autotrack/pipeline.cc
index 914dfaf..e29ea09 100644
--- a/intern/libmv/libmv/autotrack/pipeline.cc
+++ b/intern/libmv/libmv/autotrack/pipeline.cc
@@ -331,4 +331,53 @@ void InvertIntrinsicsForTracks(const Tracks &raw_tracks,
 	*calibrated_tracks = Tracks(markers);
 }
 
+void EuclideanScaleToUnity(Reconstruction *reconstruction) {
+	int clip_num = reconstruction->GetClipNum();
+	const vector<vector<CameraPose> >& all_cameras = reconstruction->camera_poses();
+
+	// Calculate center of the mass of all cameras.
+	Vec3 cameras_mass_center = Vec3::Zero();
+	for(int i = 0; i < clip_num; i++) {
+		for (int j = 0; j < all_cameras.size(); ++j) {
+			cameras_mass_center += all_cameras[i][j].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 < clip_num; i++) {
+		for (int j = 0; j < all_cameras.size(); ++j) {
+			double distance = (all_cameras[i][j].t - cameras_mass_center).squaredNorm();
+			if (distance > max_distance) {
+				max_distance = distance;
+			}
+		}
+	}
+
+	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 < clip_num; i++) {
+		for (int j = 0; j < all_cameras.size(); ++j) {
+			int image = all_cameras[i][j].frame;
+			CameraPose *camera = reconstruction->CameraPoseForFrame(i, image);
+			camera->t = camera->t * scale_factor;
+		}
+	}
+
+	// Rescale points positions.
+	vector<Point> all_points = reconstruction->AllPoints();
+	for (int i = 0; i < all_points.size(); ++i) {
+		int track = all_points[i].track;
+		Point *point = reconstruction->PointForTrack(track);
+		point->X = point->X * scale_factor;
+	}
+}
+
 }  // namespace mv
diff --git a/intern/libmv/libmv/autotrack/pipeline.h b/intern/libmv/libmv/autotrack/pipeline.h
index 51ba189..6ab3266 100644
--- a/intern/libmv/libmv/autotrack/pipeline.h
+++ b/intern/libmv/libmv/autotrack/pipeline.h
@@ -64,6 +64,8 @@ void InvertIntrinsicsForTracks(const Tracks &raw_tracks,
                                const CameraIntrinsics &camera_intrinsics,
                                Tracks *calibrated_tracks);
 
+void EuclideanScaleToUnity(Reconstruction *reconstruction);
+
 }  // namespace mv
 
 #endif  // LIBMV_AUTOTRACK_PIPELINE_H_
diff --git a/intern/libmv/libmv/autotrack/reconstruction.cc b/intern/libmv/libmv/autotrack/reconstruction.cc
index 67b36f0..b248e00 100644
--- a/intern/libmv/libmv/autotrack/reconstruction.cc
+++ b/intern/libmv/libmv/autotrack/reconstruction.cc
@@ -187,4 +187,12 @@ int  Reconstruction::AddPoint(const Point& point) {
 	points_[point.track].X = point.X;
 }
 
+const vector<vector<CameraPose> >& Reconstruction::camera_poses() const {
+	return camera_poses_;
+}
+
+const vector<Point>& Reconstruction::AllPoints() const {
+	return points_;
+}
+
 }  // namespace mv
diff --git a/intern/libmv/libmv/autotrack/reconstruction.h b/intern/libmv/libmv/autotrack/reconstruction.h
index 36971b6..8efec9d 100644
--- a/intern/libmv/libmv/autotrack/reconstruction.h
+++ b/intern/libmv/libmv/autotrack/reconstruction.h
@@ -77,9 +77,8 @@ public:
 	Point* PointForTrack(int track);
 	const Point* PointForTrack(int track) const;
 
-	const vector<vector<CameraPose> >& camera_poses() const {
-		return camera_poses_;
-	}
+	const vector<vector<CameraPose> >& camera_poses() const;
+	const vector<Point>& AllPoints() const;
 
 	int GetClipNum() const;
 	int GetAllPoseNum() const;
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 8e69408..4fc8136 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -7467,6 +7467,15 @@ static void lib_link_moviePlaneTracks(FileData *fd, MovieClip *clip, ListBase *t
 	}
 }
 
+static void lib_link_movieCorrespondences(FileData *fd, MovieClip *clip, ListBase *tracksbase)
+{
+	MovieTrackingCorrespondence *corr;
+
+	for (corr = tracksbase->first; corr; corr = corr->next) {
+
+	}
+}
+
 static void lib_link_movieclip(FileData *fd, Main *main)
 {
 	MovieClip *clip;
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 4fd3e41..fe97c40 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -3189,6 +3189,17 @@ static void write_moviePlaneTracks(WriteData *wd, ListBase *plane_tracks_base)
 	}
 }
 
+static void write_movieCorrespondences(WriteData *wd, ListBase *correspondence_base)
+{
+	MovieTrackingCorrespondence *corr;
+	for (corr = correspondence_base->first;
+	     corr;
+	     corr = corr->next)
+	{
+		writestruct(wd, DATA, "MovieTrackingCorrespondence", 1, corr);
+	}
+}
+
 static void write_movieReconstruction(WriteData *wd, MovieTrackingReconstruction *reconstruction)
 {
 	if (reconstruction->camnr)




More information about the Bf-blender-cvs mailing list