Commit: 65e6387307fdcb2524f7b8db2c67252d113f3957
Author: Tianwei Shen
Date:   Thu Jun 23 21:51:08 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rB65e6387307fdcb2524f7b8db2c67252d113f3957

finish the rough pipeline, begin debugging

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

M       intern/libmv/intern/reconstructionN.cc
M       intern/libmv/libmv/autotrack/pipeline.cc
M       intern/libmv/libmv/autotrack/pipeline.h
M       intern/libmv/libmv/autotrack/reconstruction.cc
M       intern/libmv/libmv/autotrack/reconstruction.h
M       source/blender/blenloader/intern/readfile.c
M       source/blender/blenloader/intern/writefile.c

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

diff --git a/intern/libmv/intern/reconstructionN.cc 
b/intern/libmv/intern/reconstructionN.cc
index 3f59b3e..c019a83 100644
--- a/intern/libmv/intern/reconstructionN.cc
+++ b/intern/libmv/intern/reconstructionN.cc
@@ -101,6 +101,55 @@ void mv_getNormalizedTracks(const Tracks &tracks,
        }
 }
 
+void libmv_solveRefineIntrinsics(
+        const Tracks &tracks,
+        const int refine_intrinsics,
+        const int bundle_constraints,
+        reconstruct_progress_update_cb progress_update_callback,
+        void* callback_customdata,
+        Reconstruction* reconstruction,
+        CameraIntrinsics* intrinsics) {
+  /* only a few combinations are supported but trust the caller/ */
+  int bundle_intrinsics = 0;
+
+  if (refine_intrinsics & LIBMV_REFINE_FOCAL_LENGTH) {
+    bundle_intrinsics |= mv::BUNDLE_FOCAL_LENGTH;
+  }
+  if (refine_intrinsics & LIBMV_REFINE_PRINCIPAL_POINT) {
+    bundle_intrinsics |= mv::BUNDLE_PRINCIPAL_POINT;
+  }
+  if (refine_intrinsics & LIBMV_REFINE_RADIAL_DISTORTION_K1) {
+    bundle_intrinsics |= mv::BUNDLE_RADIAL_K1;
+  }
+  if (refine_intrinsics & LIBMV_REFINE_RADIAL_DISTORTION_K2) {
+    bundle_intrinsics |= mv::BUNDLE_RADIAL_K2;
+  }
+
+  progress_update_callback(callback_customdata, 1.0, "Refining solution");
+
+  mv::EuclideanBundleCommonIntrinsics(tracks,
+                                      bundle_intrinsics,
+                                      bundle_constraints,
+                                      reconstruction,
+                                      intrinsics);
+}
+
+void finishReconstruction(
+    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);
+}
+
 }      // end of anonymous namespace
 
 void libmv_reconstructionNDestroy(libmv_ReconstructionN* libmv_reconstructionN)
@@ -203,27 +252,28 @@ libmv_ReconstructionN** 
libmv_solveMultiviewReconstruction(
                return all_libmv_reconstruction;
        }
 
-       ///* Refinement/ */
-       //if (libmv_reconstruction_options->refine_intrinsics) {
-       //      libmv_solveRefineIntrinsics(
-       //                  tracks,
-       //                  libmv_reconstruction_options->refine_intrinsics,
-       //                  libmv::BUNDLE_NO_CONSTRAINTS,
-       //                  progress_update_callback,
-       //                  callback_customdata,
-       //                  &reconstruction,
-       //                  camera_intrinsics);
-       //}
+       /* Refinement/ */
+       // TODO(Tianwei): current api allows only one camera intrinsics
+       if (libmv_reconstruction_options->all_refine_intrinsics[0]) {
+               libmv_solveRefineIntrinsics(
+                           all_normalized_tracks,
+                           
libmv_reconstruction_options->all_refine_intrinsics[0],
+                           mv::BUNDLE_NO_CONSTRAINTS,
+                           progress_update_callback,
+                           callback_customdata,
+                           &reconstruction,
+                           all_libmv_reconstruction[0]->intrinsics);
+       }
 
-       ///* Set reconstruction scale to unity. */
-       //EuclideanScaleToUnity(&reconstruction);
+       /* Set reconstruction scale to unity. */
+       mv::EuclideanScaleToUnity(&reconstruction);
 
        /* Finish reconstruction. */
-       //finishReconstruction(tracks,
-       //                     *camera_intrinsics,
-       //                     libmv_reconstruction,
-       //                     progress_update_callback,
-       //                     callback_customdata);
+       finishReconstruction(all_normalized_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++)
diff --git a/intern/libmv/libmv/autotrack/pipeline.cc 
b/intern/libmv/libmv/autotrack/pipeline.cc
index 914dfaf..e29ea09 100644
--- a/intern/libmv/libmv/autotrack/pipeline.cc
+++ b/intern/libmv/libmv/autotrack/pipeline.cc
@@ -331,4 +331,53 @@ void InvertIntrinsicsForTracks(const Tracks &raw_tracks,
        *calibrated_tracks = Tracks(markers);
 }
 
+void EuclideanScaleToUnity(Reconstruction *reconstruction) {
+       int clip_num = reconstruction->GetClipNum();
+       const vector<vector<CameraPose> >& all_cameras = 
reconstruction->camera_poses();
+
+       // Calculate center of the mass of all cameras.
+       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;
+               }
+       }
+       cameras_mass_center /= all_cameras.size();
+
+       // 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) {
+                       double distance = (all_cameras[i][j].t - 
cameras_mass_center).squaredNorm();
+                       if (distance > max_distance) {
+                               max_distance = distance;
+                       }
+               }
+       }
+
+       if (max_distance == 0.0) {
+               LG << "Cameras position variance is too small, can not rescale";
+               return;
+       }
+
+       double scale_factor = 1.0 / sqrt(max_distance);
+
+       // Rescale cameras positions.
+       for(int i = 0; i < clip_num; i++) {
+               for (int j = 0; j < all_cameras.size(); ++j) {
+                       int image = all_cameras[i][j].frame;
+                       CameraPose *camera = 
reconstruction->CameraPoseForFrame(i, image);
+                       camera->t = camera->t * scale_factor;
+               }
+       }
+
+       // Rescale points positions.
+       vector<Point> all_points = reconstruction->AllPoints();
+       for (int i = 0; i < all_points.size(); ++i) {
+               int track = all_points[i].track;
+               Point *point = reconstruction->PointForTrack(track);
+               point->X = point->X * scale_factor;
+       }
+}
+
 }  // namespace mv
diff --git a/intern/libmv/libmv/autotrack/pipeline.h 
b/intern/libmv/libmv/autotrack/pipeline.h
index 51ba189..6ab3266 100644
--- a/intern/libmv/libmv/autotrack/pipeline.h
+++ b/intern/libmv/libmv/autotrack/pipeline.h
@@ -64,6 +64,8 @@ void InvertIntrinsicsForTracks(const Tracks &raw_tracks,
                                const CameraIntrinsics &camera_intrinsics,
                                Tracks *calibrated_tracks);
 
+void EuclideanScaleToUnity(Reconstruction *reconstruction);
+
 }  // namespace mv
 
 #endif  // LIBMV_AUTOTRACK_PIPELINE_H_
diff --git a/intern/libmv/libmv/autotrack/reconstruction.cc 
b/intern/libmv/libmv/autotrack/reconstruction.cc
index 67b36f0..b248e00 100644
--- a/intern/libmv/libmv/autotrack/reconstruction.cc
+++ b/intern/libmv/libmv/autotrack/reconstruction.cc
@@ -187,4 +187,12 @@ int  Reconstruction::AddPoint(const Point& point) {
        points_[point.track].X = point.X;
 }
 
+const vector<vector<CameraPose> >& Reconstruction::camera_poses() const {
+       return camera_poses_;
+}
+
+const vector<Point>& Reconstruction::AllPoints() const {
+       return points_;
+}
+
 }  // namespace mv
diff --git a/intern/libmv/libmv/autotrack/reconstruction.h 
b/intern/libmv/libmv/autotrack/reconstruction.h
index 36971b6..8efec9d 100644
--- a/intern/libmv/libmv/autotrack/reconstruction.h
+++ b/intern/libmv/libmv/autotrack/reconstruction.h
@@ -77,9 +77,8 @@ public:
        Point* PointForTrack(int track);
        const Point* PointForTrack(int track) const;
 
-       const vector<vector<CameraPose> >& camera_poses() const {
-               return camera_poses_;
-       }
+       const vector<vector<CameraPose> >& camera_poses() const;
+       const vector<Point>& AllPoints() const;
 
        int GetClipNum() const;
        int GetAllPoseNum() const;
diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index 8e69408..4fc8136 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -7467,6 +7467,15 @@ static void lib_link_moviePlaneTracks(FileData *fd, 
MovieClip *clip, ListBase *t
        }
 }
 
+static void lib_link_movieCorrespondences(FileData *fd, MovieClip *clip, 
ListBase *tracksbase)
+{
+       MovieTrackingCorrespondence *corr;
+
+       for (corr = tracksbase->first; corr; corr = corr->next) {
+
+       }
+}
+
 static void lib_link_movieclip(FileData *fd, Main *main)
 {
        MovieClip *clip;
diff --git a/source/blender/blenloader/intern/writefile.c 
b/source/blender/blenloader/intern/writefile.c
index 4fd3e41..fe97c40 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -3189,6 +3189,17 @@ static void write_moviePlaneTracks(WriteData *wd, 
ListBase *plane_tracks_base)
        }
 }
 
+static void write_movieCorrespondences(WriteData *wd, ListBase 
*correspondence_base)
+{
+       MovieTrackingCorrespondence *corr;
+       for (corr = correspondence_base->first;
+            corr;
+            corr = corr->next)
+       {
+               writestruct(wd, DATA, "MovieTrackingCorrespondence", 1, corr);
+       }
+}
+
 static void write_movieReconstruction(WriteData *wd, 
MovieTrackingReconstruction *reconstruction)
 {
        if (reconstruction->camnr)

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

Reply via email to