[Bf-blender-cvs] [6730c6d] soc-2016-multiview: pipeline in progress, so far so good

Tianwei Shen noreply at git.blender.org
Tue Jun 14 18:29:15 CEST 2016


Commit: 6730c6d19a8b76e4e44081db1d9d589f694e1413
Author: Tianwei Shen
Date:   Wed Jun 15 00:29:01 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rB6730c6d19a8b76e4e44081db1d9d589f694e1413

pipeline in progress, so far so good

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

M	intern/libmv/intern/reconstructionN.cc
M	intern/libmv/libmv/autotrack/reconstruction.cc
M	intern/libmv/libmv/autotrack/reconstruction.h
M	intern/libmv/libmv/autotrack/tracks.cc
M	intern/libmv/libmv/autotrack/tracks.h

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

diff --git a/intern/libmv/intern/reconstructionN.cc b/intern/libmv/intern/reconstructionN.cc
index f625833..aa0512e 100644
--- a/intern/libmv/intern/reconstructionN.cc
+++ b/intern/libmv/intern/reconstructionN.cc
@@ -42,6 +42,7 @@
 
 // TODO(tianwei): still rely on simple_pipeline/callback for now, will be removed
 #include "libmv/simple_pipeline/callbacks.h"
+#include "libmv/simple_pipeline/callbacks.h"
 
 using mv::Tracks;
 using mv::Marker;
@@ -116,8 +117,7 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(const int clip_num,
 	libmv::vector<Marker> keyframe_markers;
 	int keyframe1, keyframe2;
 
-	// make reconstrution on the primary clip reconstruction
-	Reconstruction &reconstruction = all_libmv_reconstruction[0]->reconstruction;
+	Tracks all_normalized_tracks;	// normalized tracks of all clips
 	for(int i = 0; i < clip_num; i++)
 	{
 		all_libmv_reconstruction[i] = LIBMV_OBJECT_NEW(libmv_ReconstructionN);
@@ -132,6 +132,7 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(const int clip_num,
 		///* Invert the camera intrinsics/ */
 		Tracks normalized_tracks;
 		mv_getNormalizedTracks(tracks, *camera_intrinsics, &normalized_tracks);
+		all_normalized_tracks.AddTracks(normalized_tracks);
 
 		if(i == 0)		// key frame from primary camera
 		{
@@ -140,6 +141,9 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(const int clip_num,
 			normalized_tracks.GetMarkersForTracksInBothImages(i, keyframe1, i, keyframe2, &keyframe_markers);
 		}
 	}
+	// make reconstrution on the primary clip reconstruction
+	Reconstruction &reconstruction = all_libmv_reconstruction[0]->reconstruction;
+	printf("all pose num %d\n", reconstruction.GetAllPoseNum());
 
 	printf("frames to init from: %d %d\n", keyframe1, keyframe2);
 	printf("number of markers for init: %d\n", keyframe_markers.size());
@@ -181,14 +185,21 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(const int clip_num,
 	if(!mv::ReconstructTwoFrames(keyframe_markers, 0, *(all_libmv_reconstruction[0]->intrinsics), &reconstruction))
 	{
 		printf("mv::ReconstrucTwoFrames failed\n");
-		for(int i = 0; i < clip_num; i++)
-			all_libmv_reconstruction[i]->is_valid = false;
+		all_libmv_reconstruction[0]->is_valid = false;
+		return all_libmv_reconstruction;
+	}
+	if(!mv::EuclideanBundleAll(all_normalized_tracks, &reconstruction))
+	{
+		printf("mv::EuclideanBundleAll failed\n");
+		all_libmv_reconstruction[0]->is_valid = false;
+		return all_libmv_reconstruction;
+	}
+	if(!mv::EuclideanReconstructionComplete(all_normalized_tracks, &reconstruction, &update_callback))
+	{
+		printf("mv::EuclideanReconstructionComplete failed\n");
+		all_libmv_reconstruction[0]->is_valid = false;
 		return all_libmv_reconstruction;
 	}
-	//EuclideanBundle(normalized_tracks, &reconstruction);
-	//EuclideanCompleteReconstruction(normalized_tracks,
-	//                                &reconstruction,
-	//                                &update_callback);
 
 	///* Refinement/ */
 	//if (libmv_reconstruction_options->refine_intrinsics) {
@@ -205,13 +216,14 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(const int clip_num,
 	///* Set reconstruction scale to unity. */
 	//EuclideanScaleToUnity(&reconstruction);
 
-	///* Finish reconstruction. */
+	/* Finish reconstruction. */
 	//finishReconstruction(tracks,
 	//                     *camera_intrinsics,
 	//                     libmv_reconstruction,
 	//                     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++)
 		all_libmv_reconstruction[i]->is_valid = true;
 
diff --git a/intern/libmv/libmv/autotrack/reconstruction.cc b/intern/libmv/libmv/autotrack/reconstruction.cc
index 611191d..748ef53 100644
--- a/intern/libmv/libmv/autotrack/reconstruction.cc
+++ b/intern/libmv/libmv/autotrack/reconstruction.cc
@@ -68,8 +68,9 @@ void CoordinatesForMarkersInFrame(const vector<Marker> &markers,
 		coordinates->col(i) = coords[i];
 	}
 }
+
 /* markers come from two views in the same clip,
- * reconstruction should be empty
+ * reconstruction should be new and empty
  */
 bool ReconstructTwoFrames(const vector<Marker> &markers,
                           const int clip,
@@ -106,10 +107,12 @@ bool ReconstructTwoFrames(const vector<Marker> &markers,
 		return false;
 	}
 
+	printf("%d, %d, %d\n", cam_intrinsics.image_width(), cam_intrinsics.image_height(), cam_intrinsics.focal_length());
+
 	// frame 1 gets the reference frame, frame 2 gets the relative motion.
-	reconstruction->AddCameraIntrinsics(&cam_intrinsics, clip);
-	CameraPose pose1(clip, frame1, clip, Mat3::Identity(), Vec3::Zero());
-	CameraPose pose2(clip, frame2, clip, R, t);
+	int cam_intrinsic_index = reconstruction->AddCameraIntrinsics(&cam_intrinsics);
+	CameraPose pose1(clip, frame1, cam_intrinsic_index, Mat3::Identity(), Vec3::Zero());
+	CameraPose pose2(clip, frame2, cam_intrinsic_index, R, t);
 	reconstruction->AddCameraPose(pose1);
 	reconstruction->AddCameraPose(pose2);
 
@@ -118,6 +121,34 @@ bool ReconstructTwoFrames(const vector<Marker> &markers,
 	return true;
 }
 
+/**
+ * @brief EuclideanBundleAll: bundle all the clips and frames
+ * @param all_normalized_tracks: markers from all clips
+ * @param reconstruction: Reconstruction data structure
+ * @return
+ */
+bool EuclideanBundleAll(const Tracks &all_normalized_tracks,
+                        Reconstruction *reconstruction)
+{
+	return true;
+}
+
+bool EuclideanReconstructionComplete(const Tracks &tracks,
+                                     Reconstruction *reconstruction,
+                                     libmv::ProgressUpdateCallback *update_callback)
+{
+	//InternalCompleteReconstruction<EuclideanPipelineRoutines>(tracks, reconstruction, update_callback);
+	return true;
+}
+
+//	==================  mv::Reconstruction implementation ===================
+// push a new cameraIntrinsics and return the index
+int Reconstruction::AddCameraIntrinsics(CameraIntrinsics *intrinsics_ptr)
+{
+	camera_intrinsics_.push_back(intrinsics_ptr);
+	return camera_intrinsics_.size()-1;
+}
+
 void Reconstruction::AddCameraPose(const CameraPose& pose)
 {
 	if(camera_poses_.size() < pose.clip + 1)
@@ -125,19 +156,15 @@ void Reconstruction::AddCameraPose(const CameraPose& pose)
 	camera_poses_[pose.clip].push_back(pose);
 }
 
-/**
- * @brief Reconstruction::AddCameraIntrinsics insert camera intrinsics into Reconstruction by index,
- * overwrite the old intrinsic if there is any, resize the CameraIntrinsics vector if the size is smaller
- * than index.
- * @param intrinsics_ptr: camera intrinsic pointer
- * @param intrisic_index: index
- * @return
- */
-void Reconstruction::AddCameraIntrinsics(CameraIntrinsics* intrinsics_ptr, const int intrinsic_index)
-{
-	if(camera_intrinsics_.size() < intrinsic_index+1)
-		camera_intrinsics_.resize(intrinsic_index+1);
-	camera_intrinsics_[intrinsic_index] = intrinsics_ptr;
+int Reconstruction::GetClipNum() const {
+	return camera_poses_.size();
+}
+
+int Reconstruction::GetAllPoseNum() const {
+	int all_pose = 0;
+	for(int i = 0; i < camera_poses_.size(); ++i) {
+		all_pose += camera_poses_[i].size();
+	}
 }
 
 }  // namespace mv
diff --git a/intern/libmv/libmv/autotrack/reconstruction.h b/intern/libmv/libmv/autotrack/reconstruction.h
index 6f45739..74aece4 100644
--- a/intern/libmv/libmv/autotrack/reconstruction.h
+++ b/intern/libmv/libmv/autotrack/reconstruction.h
@@ -27,6 +27,7 @@
 #include "libmv/base/vector.h"
 #include "libmv/numeric/numeric.h"
 #include "libmv/simple_pipeline/camera_intrinsics.h"
+#include "libmv/simple_pipeline/callbacks.h"
 
 namespace mv {
 
@@ -51,51 +52,60 @@ struct CameraPose {
 };
 
 class Point {
-  int track;
+	int track;
 
-  // The coordinates of the point. Note that not all coordinates are always
-  // used; for example points on a plane only use the first two coordinates.
-  Vec3 X;
+	// The coordinates of the point. Note that not all coordinates are always
+	// used; for example points on a plane only use the first two coordinates.
+	Vec3 X;
 };
 
 // A reconstruction for a set of tracks. The indexing for clip, frame, and
-// track should match that of a Tracs object, stored elsewhere.
+// track should match that of a Tracks object, stored elsewhere.
 class Reconstruction {
- public:
-  // All methods copy their input reference or take ownership of the pointer.
-  void AddCameraPose(const CameraPose& pose);
-  void AddCameraIntrinsics(CameraIntrinsics* intrinsics_ptr, const int intrinsic_index);
-  int  AddPoint(const Point& point);
-  int  AddModel(Model* model);
-
-  // Returns the corresponding pose or point or NULL if missing.
-        CameraPose* CameraPoseForFrame(int clip, int frame);
-  const CameraPose* CameraPoseForFrame(int clip, int frame) const;
-        Point* PointForTrack(int track);
-  const Point* PointForTrack(int track) const;
-
-  const vector<vector<CameraPose> >& camera_poses() const {
-    return camera_poses_;
-  }
-
- private:
-  // Indexed by CameraPose::intrinsics. Owns the intrinsics objects.
-  vector<CameraIntrinsics*> camera_intrinsics_;
-
-  // Indexed by Marker::clip then by Marker::frame.
-  vector<vector<CameraPose> > camera_poses_;
-
-  // Indexed by Marker::track.
-  vector<Point> points_;
-
-  // Indexed by Marker::model_id. Owns model objects.
-  vector<Model*> models_;
+public:
+	// All methods copy their input reference or take ownership of the pointer.
+	void AddCameraPose(const CameraPose& pose);
+	int AddCameraIntrinsics(CameraIntrinsics* intrinsics_ptr);
+	int  AddPoint(const Point& point);
+	int  AddModel(Model* model);
+
+	// Returns the corresponding pose or point or NULL if missing.
+	CameraPose* CameraPoseForFrame(int clip, int frame);
+	const CameraPose* CameraPoseForFrame(int clip, int frame) const;
+	Point* PointForTrack(int track);
+	const Point* PointForTrack(int track) const;
+
+	const vector<vector<CameraPose> >& camera_poses() const {
+		return camera_poses_;
+	}
+
+	int GetClipNum() const;
+	int GetAllPoseNum() const;
+
+private:
+	// Indexed by CameraPose::intrinsics. Owns the intrinsics objects.
+	vector<CameraIntrinsics*> camera_int

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list