[Bf-blender-cvs] [3017d0d] soc-2016-multiview: fix re-projection error bug

Tianwei Shen noreply at git.blender.org
Thu Jul 7 16:22:30 CEST 2016


Commit: 3017d0d68c09dfeb46fb019186fabb24ed12fded
Author: Tianwei Shen
Date:   Thu Jul 7 16:27:42 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rB3017d0d68c09dfeb46fb019186fabb24ed12fded

fix re-projection error bug

- it is caused by using normalized tracks for intrinsics refinement

- remove all std::cout and change them to LG (glog) for logging purpose

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

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/resect.cc

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

diff --git a/intern/libmv/intern/reconstructionN.cc b/intern/libmv/intern/reconstructionN.cc
index e40aeb5..e51f689 100644
--- a/intern/libmv/intern/reconstructionN.cc
+++ b/intern/libmv/intern/reconstructionN.cc
@@ -195,7 +195,7 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
         const int clip_num,
         const libmv_TracksN **all_libmv_tracks,
         const libmv_CameraIntrinsicsOptions *all_libmv_camera_intrinsics_options,
-        const libmv_CorrespondencesN * libmv_correspondences,
+        const libmv_CorrespondencesN *libmv_correspondences,
         libmv_MultiviewReconstructionOptions *libmv_reconstruction_options,
         multiview_reconstruct_progress_update_cb progress_update_callback,
         void* callback_customdata)
@@ -204,11 +204,13 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
   libmv::vector<Marker> keyframe_markers;
   int keyframe1, keyframe2;
 
-  Tracks all_normalized_tracks;	// normalized tracks of all clips
+  Tracks all_tracks, all_normalized_tracks;	// normalized tracks of all clips
+  all_tracks.SetClipNum(clip_num);
   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
+	all_tracks.AddTracks(tracks);
 
     ///* Retrieve reconstruction options from C-API to libmv API. */
     CameraIntrinsics *camera_intrinsics;
@@ -230,11 +232,12 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
   // 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());
+  LG << "number of clips: " << clip_num << "\n";
+  LG << "frames to init from: " << keyframe1 << " " << keyframe2 << "\n";
+  LG << "number of markers for init: " << keyframe_markers.size() << "\n";
   if (keyframe_markers.size() < 8) {
     LG << "No enough markers to initialize from";
-    for(int i = 0; i < clip_num; i++)
+    for (int i = 0; i < clip_num; i++)
       all_libmv_reconstruction[i]->is_valid = false;
     return all_libmv_reconstruction;
   }
@@ -270,7 +273,7 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
   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)) {
+  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 all_libmv_reconstruction;
@@ -282,18 +285,18 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
   //  all_libmv_reconstruction[0]->is_valid = false;
   //  return all_libmv_reconstruction;
   //}
-  if(!mv::EuclideanCompleteMultiviewReconstruction(all_normalized_tracks, &reconstruction, &update_callback)) {
+  if (!mv::EuclideanCompleteMultiviewReconstruction(all_normalized_tracks, &reconstruction, &update_callback)) {
     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";
+  LG << "[libmv_solveMultiviewReconstruction] Successfully do track intersection and camera resection\n";
 
   /* Refinement/ */
   //TODO(Tianwei): current api allows only one camera refine intrinsics
   if (libmv_reconstruction_options->all_refine_intrinsics[0]) {
     libmv_solveRefineIntrinsics(
-                all_normalized_tracks,
+                all_tracks,
                 libmv_reconstruction_options->all_refine_intrinsics[0],
                 mv::BUNDLE_NO_CONSTRAINTS,
                 progress_update_callback,
@@ -307,14 +310,14 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
   mv::EuclideanScaleToUnity(&reconstruction);
 
   /* Finish reconstruction. */
-  finishMultiviewReconstruction(all_normalized_tracks,
+  finishMultiviewReconstruction(all_tracks,
                                 *(all_libmv_reconstruction[0]->intrinsics),
                                 all_libmv_reconstruction[0],
                                 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++)
+  for (int i = 0; i < clip_num; i++)
     all_libmv_reconstruction[i]->is_valid = true;
 
   return all_libmv_reconstruction;
diff --git a/intern/libmv/libmv/autotrack/pipeline.cc b/intern/libmv/libmv/autotrack/pipeline.cc
index 2f976fa..1545ebd 100644
--- a/intern/libmv/libmv/autotrack/pipeline.cc
+++ b/intern/libmv/libmv/autotrack/pipeline.cc
@@ -120,20 +120,20 @@ bool InternalCompleteReconstruction(
   int num_resects = -1;
   int num_intersects = -1;
   int total_resects = 0;
-  std::cout << "Max track: " << max_track << "\n";
-  std::cout << "Number of total frames: " << num_frames << "\n";
-  std::cout << "Number of markers: " << tracks.NumMarkers() << "\n";
+  LG << "Max track: " << max_track << "\n";
+  LG << "Number of total frames: " << num_frames << "\n";
+  LG << "Number of markers: " << tracks.NumMarkers() << "\n";
   while (num_resects != 0 || num_intersects != 0) {
     // Do all possible intersections.
     num_intersects = 0;
     for (int track = 0; track <= max_track; ++track) {
       if (reconstruction->PointForTrack(track)) {		// track has already been added
-        std::cout << "Skipping point: " << track << "\n";
+        LG << "Skipping point: " << track << "\n";
         continue;
       }
       vector<Marker> all_markers;
       tracks.GetMarkersForTrack(track, &all_markers);
-      std::cout << "Got " << all_markers.size() << " markers for track " << track << "\n";
+      LG << "Got " << all_markers.size() << " markers for track " << track << "\n";
 
       vector<Marker> reconstructed_markers;
       for (int i = 0; i < all_markers.size(); ++i) {
@@ -141,16 +141,16 @@ bool InternalCompleteReconstruction(
           reconstructed_markers.push_back(all_markers[i]);
         }
       }
-      std::cout << "Got " << reconstructed_markers.size() << " reconstructed markers for track " << track << "\n";
+      LG << "Got " << reconstructed_markers.size() << " reconstructed markers for track " << track << "\n";
       if (reconstructed_markers.size() >= 2) {
         CompleteReconstructionLogProgress(update_callback,
                                           (double)total_resects/(num_frames));
         if (PipelineRoutines::Intersect(reconstructed_markers,
                                         reconstruction)) {
           num_intersects++;
-          std::cout << "Ran Intersect() for track " << track << "\n";
+          LG << "Ran Intersect() for track " << track << "\n";
         } else {
-          std::cout << "Failed Intersect() for track " << track << "\n";
+          LG << "Failed Intersect() for track " << track << "\n";
         }
       }
     }
@@ -160,9 +160,9 @@ bool InternalCompleteReconstruction(
                                         (double)total_resects/(num_frames),
                                         "Bundling...");
       PipelineRoutines::Bundle(tracks, reconstruction);
-      std::cout << "Ran Bundle() after intersections.\n";
+      LG << "Ran Bundle() after intersections.";
     }
-    std::cout << "Did " << num_intersects << " intersects.\n";
+    LG << "Did " << num_intersects << " intersects.\n";
 
     // Do all possible resections.
     num_resects = 0;
@@ -175,7 +175,7 @@ bool InternalCompleteReconstruction(
         }
         vector<Marker> all_markers;
         tracks.GetMarkersInFrame(clip, image, &all_markers);
-        std::cout << "Got " << all_markers.size() << " markers for frame " << clip << ", " << image << "\n";
+        LG << "Got " << all_markers.size() << " markers for frame " << clip << ", " << image << "\n";
 
         vector<Marker> reconstructed_markers;
         for (int i = 0; i < all_markers.size(); ++i) {
@@ -183,7 +183,7 @@ bool InternalCompleteReconstruction(
             reconstructed_markers.push_back(all_markers[i]);
           }
         }
-        std::cout << "Got " << reconstructed_markers.size() << " reconstructed markers for frame "
+        LG << "Got " << reconstructed_markers.size() << " reconstructed markers for frame "
                   << clip << " " << image << "\n";
         if (reconstructed_markers.size() >= 5) {
           CompleteReconstructionLogProgress(update_callback,
@@ -193,9 +193,9 @@ bool InternalCompleteReconstruction(
                                        reconstruction->GetIntrinsicsMap(clip, image))) {
             num_resects++;
             total_resects++;
-            std::cout << "Ran Resect() for frame (" << clip << ", " << image << ")\n";
+            LG << "Ran Resect() for frame (" << clip << ", " << image << ")\n";
           } else {
-            std::cout << "Failed Resect() for frame (" << clip << ", " << image << ")\n";
+            LG << "Failed Resect() for frame (" << clip << ", " << image << ")\n";
           }
         }
       }
@@ -206,11 +206,11 @@ bool InternalCompleteReconstruction(
                                         "Bundling...");
       PipelineRoutines::Bundle(tracks, reconstruction);
     }
-    std::cout << "Did " << num_resects << " resects.\n";
+    LG << "Did " << num_resects << " resects.\n";
   }
 
   // One last pass...
-  std::cout << "[InternalCompleteReconstruction] Ran last pass\n";
+  LG << "[InternalCompleteReconstruction] Ran last pass\n";
   num_resects = 0;
   for(int clip = 0; clip < clip_num; clip++) {
     int max_image = tracks.MaxFrame(clip);
@@ -235,9 +235,9 @@ bool InternalCompleteReconstruction(
                                      reconstruction, t

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list