[Bf-blender-cvs] [eaf30b2] soc-2016-multiview: complete multiview_reconstruction_finish

Tianwei Shen noreply at git.blender.org
Mon Jul 4 11:31:49 CEST 2016


Commit: eaf30b24fc7b2358e5b1855b1146513bde806b55
Author: Tianwei Shen
Date:   Mon Jul 4 17:31:31 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rBeaf30b24fc7b2358e5b1855b1146513bde806b55

complete multiview_reconstruction_finish

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

M	intern/libmv/intern/reconstructionN.cc
M	intern/libmv/intern/reconstructionN.h
M	source/blender/blenkernel/intern/tracking_correspondence.c

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

diff --git a/intern/libmv/intern/reconstructionN.cc b/intern/libmv/intern/reconstructionN.cc
index 2e13927..2267221 100644
--- a/intern/libmv/intern/reconstructionN.cc
+++ b/intern/libmv/intern/reconstructionN.cc
@@ -41,9 +41,6 @@
 #include "libmv/autotrack/reconstruction.h"
 #include "libmv/autotrack/region.h"
 #include "libmv/autotrack/tracks.h"
-
-// 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;
@@ -67,37 +64,39 @@ struct libmv_ReconstructionN {
 namespace {
 class MultiviewReconstructUpdateCallback : public ProgressUpdateCallback {
 public:
-	MultiviewReconstructUpdateCallback(
-	        multiview_reconstruct_progress_update_cb progress_update_callback,
-	        void *callback_customdata) {
-		progress_update_callback_ = progress_update_callback;
-		callback_customdata_ = callback_customdata;
-	}
-
-	void invoke(double progress, const char* message) {
-		if (progress_update_callback_) {
-			progress_update_callback_(callback_customdata_, progress, message);
-		}
-	}
+  MultiviewReconstructUpdateCallback(
+          multiview_reconstruct_progress_update_cb progress_update_callback,
+          void *callback_customdata) {
+    progress_update_callback_ = progress_update_callback;
+    callback_customdata_ = callback_customdata;
+  }
+
+  void invoke(double progress, const char* message) {
+    if (progress_update_callback_) {
+      progress_update_callback_(callback_customdata_, progress, message);
+    }
+  }
 protected:
-	multiview_reconstruct_progress_update_cb progress_update_callback_;
-	void* callback_customdata_;
+  multiview_reconstruct_progress_update_cb progress_update_callback_;
+  void* callback_customdata_;
 };
 
 void mv_getNormalizedTracks(const Tracks &tracks,
                             const CameraIntrinsics &camera_intrinsics,
                             Tracks *normalized_tracks)
 {
-	libmv::vector<Marker> markers = tracks.markers();
-	for (int i = 0; i < markers.size(); ++i) {
-		Marker &marker = markers[i];
-		double normalized_x, normalized_y;
-		camera_intrinsics.InvertIntrinsics(marker.center[0], marker.center[1],
-		                                   &normalized_x, &normalized_y);
-		// TODO(tianwei): put the normalized value in marker instead? is this supposed to be like this?
-		marker.center[0] = normalized_x, marker.center[1] = normalized_y;
-		normalized_tracks->AddMarker(marker);
-	}
+  libmv::vector<Marker> markers = tracks.markers();
+  for (int i = 0; i < markers.size(); ++i) {
+    Marker &marker = markers[i];
+
+	// act in a calibrated fashion
+    double normalized_x, normalized_y;
+    camera_intrinsics.InvertIntrinsics(marker.center[0], marker.center[1],
+                                       &normalized_x, &normalized_y);
+    marker.center[0] = normalized_x, marker.center[1] = normalized_y;
+
+    normalized_tracks->AddMarker(marker);
+  }
 }
 
 // Each clip has a fix camera intrinsics, set frames of a clip to that fixed intrinsics
@@ -105,15 +104,15 @@ bool ReconstructionUpdateFixedIntrinsics(libmv_ReconstructionN **all_libmv_recon
                                          Tracks *tracks,
                                          Reconstruction *reconstruction)
 {
-	int clip_num = tracks->GetClipNum();
-	for(int i = 0; i < clip_num; i++) {
-		CameraIntrinsics *camera_intrinsics = all_libmv_reconstruction[i]->intrinsics;
-		int cam_intrinsic_index = reconstruction->AddCameraIntrinsics(camera_intrinsics);
-		assert(cam_intrinsic_index == i);
-	}
-	reconstruction->InitIntrinsicsMapFixed(*tracks);
-
-	return true;
+  int clip_num = tracks->GetClipNum();
+  for(int i = 0; i < clip_num; i++) {
+    CameraIntrinsics *camera_intrinsics = all_libmv_reconstruction[i]->intrinsics;
+    int cam_intrinsic_index = reconstruction->AddCameraIntrinsics(camera_intrinsics);
+    assert(cam_intrinsic_index == i);
+  }
+  reconstruction->InitIntrinsicsMapFixed(*tracks);
+
+  return true;
 }
 
 void libmv_solveRefineIntrinsics(
@@ -149,28 +148,47 @@ void libmv_solveRefineIntrinsics(
                                       intrinsics);
 }
 
-void finishReconstruction(
+void finishMultiviewReconstruction(
     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);
+    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);
 }
 
+// re-apply camera intrinsics on the normalized 2d points
+Marker libmv_projectMarker(const mv::Point& point,
+                           const mv::CameraPose& camera,
+                           const CameraIntrinsics& intrinsics) {
+  libmv::Vec3 projected = camera.R * point.X + camera.t;
+  projected /= projected(2);
+
+  mv::Marker reprojected_marker;
+  double origin_x, origin_y;
+  intrinsics.ApplyIntrinsics(projected(0), projected(1),
+                             &origin_x, &origin_y);
+  reprojected_marker.center[0] = origin_x;
+  reprojected_marker.center[1] = origin_y;
+
+  reprojected_marker.clip = camera.clip;
+  reprojected_marker.frame = camera.frame;
+  reprojected_marker.track = point.track;
+  return reprojected_marker;
+}
 }	// end of anonymous namespace
 
 void libmv_reconstructionNDestroy(libmv_ReconstructionN* libmv_reconstructionN)
 {
-	LIBMV_OBJECT_DELETE(libmv_reconstructionN->intrinsics, CameraIntrinsics);
-	LIBMV_OBJECT_DELETE(libmv_reconstructionN, libmv_ReconstructionN);
+  LIBMV_OBJECT_DELETE(libmv_reconstructionN->intrinsics, CameraIntrinsics);
+  LIBMV_OBJECT_DELETE(libmv_reconstructionN, libmv_ReconstructionN);
 }
 
 libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
@@ -182,148 +200,271 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
         multiview_reconstruct_progress_update_cb progress_update_callback,
         void* callback_customdata)
 {
-	libmv_ReconstructionN **all_libmv_reconstruction = LIBMV_STRUCT_NEW(libmv_ReconstructionN*, clip_num);
-	libmv::vector<Marker> keyframe_markers;
-	int keyframe1, keyframe2;
-
-	Tracks all_normalized_tracks;	// normalized tracks of all clips
-	all_normalized_tracks.SetClipNum(clip_num);
-	for(int i = 0; i < clip_num; i++)
-	{
-		all_libmv_reconstruction[i] = LIBMV_OBJECT_NEW(libmv_ReconstructionN);
-		Tracks &tracks = *((Tracks *) all_libmv_tracks[i]);		// Tracks are just a bunch of markers
-
-		///* Retrieve reconstruction options from C-API to libmv API. */
-		CameraIntrinsics *camera_intrinsics;
-		camera_intrinsics = all_libmv_reconstruction[i]->intrinsics =
-		        libmv_cameraIntrinsicsCreateFromOptions(&all_libmv_camera_intrinsics_options[i]);
-
-		///* 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
-		{
-			///* keyframe selection. */
-			keyframe1 = libmv_reconstruction_options->keyframe1, keyframe2 = libmv_reconstruction_options->keyframe2;
-			normalized_tracks.GetMarkersForTracksInBothImages(i, keyframe1, i, keyframe2, &keyframe_markers);
-		}
-	}
-	// make reconstrution on the primary clip reconstruction
-	Reconstruction &reconstruction = all_libmv_reconstruction[0]->reconstruction;
-
-	printf("frames to init from: %d %d\n", keyframe1, keyframe2);
-	printf("number of markers for init: %d\n", keyframe_markers.size());
-	if (keyframe_markers.size() < 8) {
-		LG << "No enough markers to initialize from";
-		for(int i = 0; i < clip_num; i++)
-			all_libmv_reconstruction[i]->is_valid = false;
-		return all_libmv_reconstruction;
-	}
-
-	// create multiview reconstruct update callback
-	MultiviewReconstructUpdateCallback update_callback =
-	        MultiviewReconstructUpdateCallback(progress_update_callback,
-	                                           callback_customdata);
-
-	// TODO(tianwei): skip the automatic keyframe selection for now
-	//if (libmv_reconstruction_options->select_keyframes) {
-	//	LG << "Using automatic keyframe selection";
-
-	//	update_callback.invoke(0, "Selecting keyframes");
-
-	//	selectTwoKeyframesBasedOnGRICAndVariance(tracks,
-	//	                                         normalized_tracks,
-	//	                                         *camera_intrinsics,
-	//	                                         keyframe1,
-	//	                                         keyframe2);
-
-	//	/* so keyframes in the interface would be updated */
-	//	libmv_reconstruction_options->keyframe1 = keyframe1;
-	//	libmv_reconstruction_options->keyframe2 = keyframe2;
-	//}
-
-	///* 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)) {
-		LG << "mv::ReconstrucTwoFrames failed\n";
-		all_libmv_reconstruction[0]->is_valid = false;
-		return a

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list