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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to