[Bf-blender-cvs] [5d05af2] soc-2016-multiview: set-up intrinsics map, proceed to resection

Tianwei Shen noreply at git.blender.org
Wed Jun 29 11:29:50 CEST 2016


Commit: 5d05af20b2e99418a212c0f84a60ebcd8b7078ef
Author: Tianwei Shen
Date:   Wed Jun 29 15:05:45 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rB5d05af20b2e99418a212c0f84a60ebcd8b7078ef

set-up intrinsics map, proceed to resection

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

M	intern/libmv/intern/reconstructionN.cc
M	intern/libmv/libmv/autotrack/pipeline.cc
M	intern/libmv/libmv/autotrack/reconstruction.cc
M	intern/libmv/libmv/autotrack/reconstruction.h
M	intern/libmv/libmv/autotrack/resect.cc
M	intern/libmv/libmv/autotrack/resect.h
M	release/datafiles/locale
M	release/scripts/addons
M	release/scripts/addons_contrib
M	source/blender/blenkernel/intern/tracking_correspondence.c

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

diff --git a/intern/libmv/intern/reconstructionN.cc b/intern/libmv/intern/reconstructionN.cc
index ef19d8a..9d62f57 100644
--- a/intern/libmv/intern/reconstructionN.cc
+++ b/intern/libmv/intern/reconstructionN.cc
@@ -101,6 +101,24 @@ void mv_getNormalizedTracks(const Tracks &tracks,
 	}
 }
 
+// Each clip has a fix camera intrinsics, set frames of a clip to that fixed intrinsics
+bool ReconstructionUpdateFixedIntrinsics(libmv_ReconstructionN **all_libmv_reconstruction,
+                                         Tracks *tracks,
+                                         Reconstruction *reconstruction)
+{
+	int clip_num = tracks->GetClipNum();
+	std::cout << "[ReconstructionUpdateFixedIntrinsics] " << clip_num << std::endl;
+	for(int i = 0; i < clip_num; i++) {
+		CameraIntrinsics *camera_intrinsics = all_libmv_reconstruction[i]->intrinsics;
+		int cam_intrinsic_index = reconstruction->AddCameraIntrinsics(camera_intrinsics);
+		std::cout << "[ReconstructionUpdateFixedIntrinsics]" << i << std::endl;
+		assert(cam_intrinsic_index == i);
+	}
+	reconstruction->InitIntrinsicsMapFixed(*tracks);
+
+	return true;
+}
+
 void libmv_solveRefineIntrinsics(
         const Tracks &tracks,
         const int refine_intrinsics,
@@ -232,6 +250,11 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
 	///* Actual reconstruction. */
 	update_callback.invoke(0, "Initial reconstruction");
 
+	// update intrinsics mapping from (clip, frame) -> intrinsics
+	// TODO(tianwei): in the future we may support varing focal length,
+	// thus each (clip, frame) should have a unique intrinsics index
+	ReconstructionUpdateFixedIntrinsics(all_libmv_reconstruction, &all_normalized_tracks, &reconstruction);
+
 	// reconstruct two views from the main clip
 	if(!mv::ReconstructTwoFrames(keyframe_markers, 0, *(all_libmv_reconstruction[0]->intrinsics), &reconstruction)) {
 		printf("mv::ReconstrucTwoFrames failed\n");
diff --git a/intern/libmv/libmv/autotrack/pipeline.cc b/intern/libmv/libmv/autotrack/pipeline.cc
index a8ac232..eb095d5 100644
--- a/intern/libmv/libmv/autotrack/pipeline.cc
+++ b/intern/libmv/libmv/autotrack/pipeline.cc
@@ -52,8 +52,10 @@ struct EuclideanPipelineRoutines {
 	}
 
 	static bool Resect(const vector<Marker> &markers,
-	                   Reconstruction *reconstruction, bool final_pass) {
-		return EuclideanResect(markers, reconstruction, final_pass);
+	                   Reconstruction *reconstruction,
+	                   bool final_pass,
+	                   int intrinsics_index) {
+		return EuclideanResect(markers, reconstruction, final_pass, intrinsics_index);
 	}
 
 	static bool Intersect(const vector<Marker> &markers,
@@ -169,31 +171,32 @@ bool InternalCompleteReconstruction(
 			const int max_image = tracks.MaxFrame(clip);
 			for (int image = 0; image <= max_image; ++image) {
 				if (reconstruction->CameraPoseForFrame(clip, image)) {	// this camera pose has been added
-					std::cout << "Skipping frame: " << clip << " " << image << "\n";
+					LG << "Skipping frame: " << clip << " " << image << "\n";
 					continue;
 				}
 				vector<Marker> all_markers;
 				tracks.GetMarkersInFrame(clip, image, &all_markers);
-				std::cout << "Got " << all_markers.size() << " markers for image " << image << "\n";
+				std::cout << "Got " << all_markers.size() << " markers for frame " << clip << ", " << image << "\n";
 
 				vector<Marker> reconstructed_markers;
 				for (int i = 0; i < all_markers.size(); ++i) {
-					if (reconstruction->PointForTrack(all_markers[i].track)) {
+					if (reconstruction->PointForTrack(all_markers[i].track)) {	// 3d points have been added
 						reconstructed_markers.push_back(all_markers[i]);
 					}
 				}
-				std::cout << "Got " << reconstructed_markers.size() << " reconstructed markers for image "
+				std::cout << "Got " << reconstructed_markers.size() << " reconstructed markers for frame "
 				          << clip << " " << image << "\n";
 				if (reconstructed_markers.size() >= 5) {
 					CompleteReconstructionLogProgress(update_callback,
 					                                  (double)total_resects/(num_frames));
 					if (PipelineRoutines::Resect(reconstructed_markers,
-					                             reconstruction, false)) {
+					                             reconstruction, false,
+					                             reconstruction->GetIntrinsicsMap(clip, image))) {
 						num_resects++;
 						total_resects++;
-						std::cout << "Ran Resect() for image (" << clip << ", " << image << ")\n";
+						std::cout << "Ran Resect() for frame (" << clip << ", " << image << ")\n";
 					} else {
-						std::cout << "Failed Resect() for image (" << clip << ", " << image << ")\n";
+						std::cout << "Failed Resect() for frame (" << clip << ", " << image << ")\n";
 					}
 				}
 			}
@@ -213,7 +216,7 @@ bool InternalCompleteReconstruction(
 		int max_image = tracks.MaxFrame(clip);
 		for (int image = 0; image <= max_image; ++image) {
 			if (reconstruction->CameraPoseForFrame(clip, image)) {
-				LG << "Skipping frame: " << image;
+				LG << "Skipping frame: " << clip << " " << image << "\n";
 				continue;
 			}
 			vector<Marker> all_markers;
@@ -229,7 +232,8 @@ bool InternalCompleteReconstruction(
 				CompleteReconstructionLogProgress(update_callback,
 				                                  (double)total_resects/(max_image));
 				if (PipelineRoutines::Resect(reconstructed_markers,
-				                             reconstruction, true)) {
+				                             reconstruction, true,
+				                             reconstruction->GetIntrinsicsMap(clip, image))) {
 					num_resects++;
 					std::cout << "Ran final Resect() for image " << image;
 				} else {
diff --git a/intern/libmv/libmv/autotrack/reconstruction.cc b/intern/libmv/libmv/autotrack/reconstruction.cc
index 14a1aaa..d67606e 100644
--- a/intern/libmv/libmv/autotrack/reconstruction.cc
+++ b/intern/libmv/libmv/autotrack/reconstruction.cc
@@ -109,9 +109,8 @@ bool ReconstructTwoFrames(const vector<Marker> &markers,
 	}
 
 	// frame 1 gets the reference frame, frame 2 gets the relative motion.
-	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);
+	CameraPose pose1(clip, frame1, reconstruction->GetIntrinsicsMap(clip, frame1), Mat3::Identity(), Vec3::Zero());
+	CameraPose pose2(clip, frame2, reconstruction->GetIntrinsicsMap(clip, frame2), R, t);
 	reconstruction->AddCameraPose(pose1);
 	reconstruction->AddCameraPose(pose2);
 
@@ -185,7 +184,14 @@ Point* Reconstruction::PointForTrack(int track) {
 }
 
 const Point* Reconstruction::PointForTrack(int track) const {
-	return const_cast<Point *>(static_cast<const Reconstruction *>(this)->PointForTrack(track));
+	if (track < 0 || track >= points_.size()) {
+		return NULL;
+	}
+	const Point *point = &points_[track];
+	if (point->track == -1) {	// initialized but not set, return NULL
+		return NULL;
+	}
+	return point;
 }
 
 int Reconstruction::AddPoint(const Point& point) {
@@ -217,4 +223,43 @@ int Reconstruction::GetReconstructedCameraNum() const {
 	return reconstructed_num;
 }
 
+void Reconstruction::InitIntrinsicsMap(Tracks &tracks) {
+	int clip_num = tracks.GetClipNum();
+	intrinsics_map.resize(clip_num);
+	for(int i = 0; i < clip_num; i++) {
+		intrinsics_map.resize(tracks.MaxFrame(i)+1);
+		for(int j = 0; j < intrinsics_map.size(); j++) {
+			intrinsics_map[i][j] = -1;
+		}
+	}
+}
+
+void Reconstruction::InitIntrinsicsMapFixed(Tracks &tracks) {
+	int clip_num = tracks.GetClipNum();
+	intrinsics_map.resize(clip_num);
+	for(int i = 0; i < clip_num; i++) {
+		intrinsics_map[i].resize(tracks.MaxFrame(i)+1);
+		for(int j = 0; j < intrinsics_map[i].size(); j++) {
+			intrinsics_map[i][j] = i;
+		}
+	}
+}
+
+bool Reconstruction::SetIntrinsicsMap(int clip, int frame, int intrinsics) {
+	if(intrinsics_map.size() <= clip)
+		return false;
+	if(intrinsics_map[clip].size() <= frame)
+		return false;
+	intrinsics_map[clip][frame] = intrinsics;
+	return true;
+}
+
+int Reconstruction::GetIntrinsicsMap(int clip, int frame) const {
+	if(intrinsics_map.size() <= clip)
+		return -1;
+	if(intrinsics_map[clip].size() <= frame)
+		return -1;
+	return intrinsics_map[clip][frame];
+}
+
 }  // namespace mv
diff --git a/intern/libmv/libmv/autotrack/reconstruction.h b/intern/libmv/libmv/autotrack/reconstruction.h
index af04871..d123992 100644
--- a/intern/libmv/libmv/autotrack/reconstruction.h
+++ b/intern/libmv/libmv/autotrack/reconstruction.h
@@ -69,7 +69,7 @@ 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 AddPoint(const Point& point);
 	int  AddModel(Model* model);
 
 	// Returns the corresponding pose or point or NULL if missing.
@@ -85,6 +85,15 @@ public:
 	int GetAllPoseNum() const;
 	int GetReconstructedCameraNum() const;
 
+	// initialize all intrinsics map to -1
+	void InitIntrinsicsMap(Tracks &tracks);
+	// initialize intrinsics of clip i to i(CameraPose::intrinsics)
+	void InitIntrinsicsMapFixed(Tracks &tracks);
+	// set CameraPose::intrinsics for frame (clip, frame)
+	bool SetIntrinsicsMap(int clip, int frame, int intrinsics);
+	// return CameraPose::intrinsics if (clip, frame) is intrinsics_map, otherwise return -1
+	int GetIntrinsicsMap(int clip, int frame) const;
+
 private:
 	// Indexed by CameraPose::intrinsics. Owns the intrinsics objects.
 	vector<CameraIntrinsics*> camera_intrinsics_;
@@ -97,6 +106,9 @@ private:
 
 	// Indexed by Marker::model_id. Owns model objects.
 	vector<Model*> models_;
+
+	// Indexed by Marker::clip then by Marker::frame.
+	vector<vector<int> > intrinsics_map;
 };
 
 // Reconstruct two frames from the same clip, used as the initial reconstruction
diff --git a/intern/libmv/libmv/autotrack/resect.cc b/intern/libmv/libmv/autotrack/resect.cc
index cadcf2c..7aa8270 100644
--- a/intern/libmv/libmv/autotrack/resect.cc
+++ b/intern/libmv/libmv/autotrack/resect.cc
@@ -99,7 +99,9 @@ struct EuclideanResectCostFunction {
 }  // namespace


@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list