[Bf-blender-cvs] [4c6399f] soc-2016-multiview: fix bug in EuclideanScaleToUnity

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


Commit: 4c6399fe4a321a93dfbda2f9dedb1d8cae1191ef
Author: Tianwei Shen
Date:   Wed Jun 29 16:05:13 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rB4c6399fe4a321a93dfbda2f9dedb1d8cae1191ef

fix bug in EuclideanScaleToUnity

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

M	intern/libmv/intern/reconstructionN.cc
M	intern/libmv/libmv/autotrack/intersect.cc
M	intern/libmv/libmv/autotrack/pipeline.cc
M	intern/libmv/libmv/autotrack/resect.cc

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

diff --git a/intern/libmv/intern/reconstructionN.cc b/intern/libmv/intern/reconstructionN.cc
index 9d62f57..aa59552 100644
--- a/intern/libmv/intern/reconstructionN.cc
+++ b/intern/libmv/intern/reconstructionN.cc
@@ -107,11 +107,9 @@ bool ReconstructionUpdateFixedIntrinsics(libmv_ReconstructionN **all_libmv_recon
                                          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);
@@ -257,13 +255,10 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
 
 	// reconstruct two views from the main clip
 	if(!mv::ReconstructTwoFrames(keyframe_markers, 0, *(all_libmv_reconstruction[0]->intrinsics), &reconstruction)) {
-		printf("mv::ReconstrucTwoFrames failed\n");
+		LG << "mv::ReconstrucTwoFrames failed\n";
 		all_libmv_reconstruction[0]->is_valid = false;
 		return all_libmv_reconstruction;
 	}
-	std::cout << "[libmv_solveMultiviewReconstruction] reconstruct "
-	          <<  reconstruction.GetReconstructedCameraNum()
-	          << " cameras after ReconstructTwoFrames" << std::endl;
 	// bundle the two-view initial reconstruction
 	// (it is redundant for now since now 3d point is added at this stage)
 	//if(!mv::EuclideanBundleAll(all_normalized_tracks, &reconstruction)) {
@@ -272,13 +267,14 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
 	//	return all_libmv_reconstruction;
 	//}
 	if(!mv::EuclideanCompleteMultiviewReconstruction(all_normalized_tracks, &reconstruction, &update_callback)) {
-		printf("mv::EuclideanReconstructionComplete failed\n");
+		LG << "mv::EuclideanReconstructionComplete failed\n";
 		all_libmv_reconstruction[0]->is_valid = false;
 		return all_libmv_reconstruction;
 	}
+	std::cout << "[libmv_solveMultiviewReconstruction] Successfully do track intersection and camera resection\n";
 
 	/* Refinement/ */
-	//TODO(Tianwei): current api allows only one camera intrinsics
+	//TODO(Tianwei): current api allows only one camera refine intrinsics
 	if (libmv_reconstruction_options->all_refine_intrinsics[0]) {
 		libmv_solveRefineIntrinsics(
 		            all_normalized_tracks,
@@ -289,6 +285,7 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
 		            &reconstruction,
 		            all_libmv_reconstruction[0]->intrinsics);
 	}
+	std::cout << "[libmv_solveMultiviewReconstruction] Successfully refine camera intrinsics\n";
 
 	///* Set reconstruction scale to unity. */
 	mv::EuclideanScaleToUnity(&reconstruction);
diff --git a/intern/libmv/libmv/autotrack/intersect.cc b/intern/libmv/libmv/autotrack/intersect.cc
index 614eec9..b2e2a4a 100644
--- a/intern/libmv/libmv/autotrack/intersect.cc
+++ b/intern/libmv/libmv/autotrack/intersect.cc
@@ -86,7 +86,7 @@ bool EuclideanIntersect(const vector<Marker> &markers,
   vector<Mat34> cameras;
   Mat34 P;
   for (int i = 0; i < markers.size(); ++i) {
-    std::cout << "[Intersect] marker clip frame: " << markers[i].clip << " " << markers[i].frame << std::endl;
+    LG << "[Intersect] marker clip frame: " << markers[i].clip << " " << markers[i].frame << std::endl;
     CameraPose *camera = reconstruction->CameraPoseForFrame(markers[i].clip, markers[i].frame);
     libmv::P_From_KRt(K, camera->R, camera->t, &P);
     cameras.push_back(P);
diff --git a/intern/libmv/libmv/autotrack/pipeline.cc b/intern/libmv/libmv/autotrack/pipeline.cc
index eb095d5..fb79570 100644
--- a/intern/libmv/libmv/autotrack/pipeline.cc
+++ b/intern/libmv/libmv/autotrack/pipeline.cc
@@ -211,6 +211,7 @@ bool InternalCompleteReconstruction(
 	}
 
 	// One last pass...
+	std::cout << "[InternalCompleteReconstruction] Ran last pass\n";
 	num_resects = 0;
 	for(int clip = 0; clip < clip_num; clip++) {
 		int max_image = tracks.MaxFrame(clip);
@@ -341,18 +342,22 @@ void EuclideanScaleToUnity(Reconstruction *reconstruction) {
 	const vector<vector<CameraPose> >& all_cameras = reconstruction->camera_poses();
 
 	// Calculate center of the mass of all cameras.
+	int total_valid_cameras = 0;
 	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;
+		for (int j = 0; j < all_cameras[i].size(); ++j) {
+			if(all_cameras[i][j].clip > 0 && all_cameras[i][j].frame > 0) {
+				cameras_mass_center += all_cameras[i][j].t;
+				total_valid_cameras++;
+			}
 		}
 	}
-	cameras_mass_center /= all_cameras.size();
+	cameras_mass_center /= total_valid_cameras;
 
 	// 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) {
+		for (int j = 0; j < all_cameras[i].size(); ++j) {
 			double distance = (all_cameras[i][j].t - cameras_mass_center).squaredNorm();
 			if (distance > max_distance) {
 				max_distance = distance;
@@ -369,7 +374,7 @@ void EuclideanScaleToUnity(Reconstruction *reconstruction) {
 
 	// Rescale cameras positions.
 	for(int i = 0; i < clip_num; i++) {
-		for (int j = 0; j < all_cameras.size(); ++j) {
+		for (int j = 0; j < all_cameras[i].size(); ++j) {
 			int image = all_cameras[i][j].frame;
 			CameraPose *camera = reconstruction->CameraPoseForFrame(i, image);
 			camera->t = camera->t * scale_factor;
diff --git a/intern/libmv/libmv/autotrack/resect.cc b/intern/libmv/libmv/autotrack/resect.cc
index 7aa8270..9bcb616 100644
--- a/intern/libmv/libmv/autotrack/resect.cc
+++ b/intern/libmv/libmv/autotrack/resect.cc
@@ -177,8 +177,8 @@ bool EuclideanResect(const vector<Marker> &markers,
   R = libmv::RotationFromEulerVector(dRt.head<3>()) * R;
   t = dRt.tail<3>();
 
-  std::cout << "Resection for frame " << markers[0].clip << " " << markers[0].frame
-            << " got:\n" << "R:\n" << R << "\nt:\n" << t;
+  LG << "Resection for frame " << markers[0].clip << " " << markers[0].frame
+     << " got:\n" << "R:\n" << R << "\nt:\n" << t << "\n";
   CameraPose pose(markers[0].clip, markers[0].frame, intrinsics, R, t);
   reconstruction->AddCameraPose(pose);
   return true;




More information about the Bf-blender-cvs mailing list