Commit: 4a1fdb48eb1914c54042b76b16e0f7fd099d3bba
Author: Tianwei Shen
Date:   Tue Jun 14 17:01:38 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rB4a1fdb48eb1914c54042b76b16e0f7fd099d3bba

update autotrack two-view reconstrution

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

M       intern/libmv/intern/reconstructionN.cc
M       intern/libmv/libmv/autotrack/reconstruction.cc
M       intern/libmv/libmv/autotrack/reconstruction.h

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

diff --git a/intern/libmv/intern/reconstructionN.cc 
b/intern/libmv/intern/reconstructionN.cc
index 61954cc..f625833 100644
--- a/intern/libmv/intern/reconstructionN.cc
+++ b/intern/libmv/intern/reconstructionN.cc
@@ -177,7 +177,9 @@ libmv_ReconstructionN** 
libmv_solveMultiviewReconstruction(const int clip_num,
 
        ///* TODO(tianwei): chain the tracks and correspondences */
 
-       if(!mv::ReconstructTwoFrames(keyframe_markers, &reconstruction)) {
+       // reconstruct two views from the main clip
+       if(!mv::ReconstructTwoFrames(keyframe_markers, 0, 
*(all_libmv_reconstruction[0]->intrinsics), &reconstruction))
+       {
                printf("mv::ReconstrucTwoFrames failed\n");
                for(int i = 0; i < clip_num; i++)
                        all_libmv_reconstruction[i]->is_valid = false;
diff --git a/intern/libmv/libmv/autotrack/reconstruction.cc 
b/intern/libmv/libmv/autotrack/reconstruction.cc
index 73fc02c..611191d 100644
--- a/intern/libmv/libmv/autotrack/reconstruction.cc
+++ b/intern/libmv/libmv/autotrack/reconstruction.cc
@@ -21,6 +21,7 @@
 // Author: [email protected] (Tianwei Shen)
 
 #include "libmv/autotrack/reconstruction.h"
+#include "libmv/multiview/fundamental.h"
 #include "libmv/autotrack/marker.h"
 #include "libmv/autotrack/tracks.h"
 #include "libmv/numeric/numeric.h"
@@ -28,10 +29,51 @@
 
 using mv::Marker;
 using mv::Tracks;
+using libmv::Mat;
+using libmv::Mat2;
+using libmv::Mat3;
+using libmv::Vec;
+using libmv::Vec2;
 
 namespace mv {
 
+void GetFramesInMarkers(const vector<Marker> &markers,
+                        int *image1, int *image2) {
+       if (markers.size() < 2) {
+               return;
+       }
+       *image1 = markers[0].frame;
+       for (int i = 1; i < markers.size(); ++i) {
+               if (markers[i].frame != *image1) {
+                       *image2 = markers[i].frame;
+                       return;
+               }
+       }
+       *image2 = -1;
+       LOG(FATAL) << "Only one image in the markers.";
+}
+
+void CoordinatesForMarkersInFrame(const vector<Marker> &markers,
+                                  int clip, int frame,
+                                  Mat *coordinates) {
+       vector<Vec2> coords;
+       for (int i = 0; i < markers.size(); ++i) {
+               const Marker &marker = markers[i];
+               if (markers[i].clip == clip && markers[i].frame == frame) {
+                       coords.push_back(Vec2(marker.center[0], 
marker.center[1]));
+               }
+       }
+       coordinates->resize(2, coords.size());
+       for (int i = 0; i < coords.size(); i++) {
+               coordinates->col(i) = coords[i];
+       }
+}
+/* markers come from two views in the same clip,
+ * reconstruction should be empty
+ */
 bool ReconstructTwoFrames(const vector<Marker> &markers,
+                          const int clip,
+                          libmv::CameraIntrinsics &cam_intrinsics,
                           Reconstruction *reconstruction)
 {
        if (markers.size() < 16) {
@@ -39,40 +81,63 @@ bool ReconstructTwoFrames(const vector<Marker> &markers,
                return false;
        }
 
-       int image1, image2;
-       //GetImagesInMarkers(markers, &image1, &image2);
+       int frame1, frame2;
+       GetFramesInMarkers(markers, &frame1, &frame2);
 
-       //Mat x1, x2;
-       //CoordinatesForMarkersInImage(markers, image1, &x1);
-       //CoordinatesForMarkersInImage(markers, image2, &x2);
+       Mat x1, x2;
+       CoordinatesForMarkersInFrame(markers, clip, frame1, &x1);
+       CoordinatesForMarkersInFrame(markers, clip, frame2, &x2);
 
-       //Mat3 F;
-       //NormalizedEightPointSolver(x1, x2, &F);
+       Mat3 F;
+       libmv::NormalizedEightPointSolver(x1, x2, &F);
 
-       //// The F matrix should be an E matrix, but squash it just to be sure.
-       //Mat3 E;
-       //FundamentalToEssential(F, &E);
+       // The F matrix should be an E matrix, but squash it just to be sure.
+       Mat3 E;
+       libmv::FundamentalToEssential(F, &E);
 
-       //// Recover motion between the two images. Since this function assumes 
a
-       //// calibrated camera, use the identity for K.
-       //Mat3 R;
-       //Vec3 t;
-       //Mat3 K = Mat3::Identity();
-       //if (!MotionFromEssentialAndCorrespondence(E,
-       //                                          K, x1.col(0),
-       //                                          K, x2.col(0),
-       //                                          &R, &t)) {
-       //      LG << "Failed to compute R and t from E and K.";
-       //      return false;
-       //}
+       // Recover motion between the two images. Since this function assumes a
+       // calibrated camera, use the identity for K.
+       Mat3 R;
+       Vec3 t;
+       Mat3 K = Mat3::Identity();
+       if (!libmv::MotionFromEssentialAndCorrespondence(E, K, x1.col(0), K, 
x2.col(0), &R, &t))
+       {
+               LG << "Failed to compute R and t from E and K.";
+               return false;
+       }
 
-       //// Image 1 gets the reference frame, image 2 gets the relative motion.
-       //reconstruction->InsertCamera(image1, Mat3::Identity(), Vec3::Zero());
-       //reconstruction->InsertCamera(image2, R, t);
+       // frame 1 gets the reference frame, frame 2 gets the relative motion.
+       reconstruction->AddCameraIntrinsics(&cam_intrinsics, clip);
+       CameraPose pose1(clip, frame1, clip, Mat3::Identity(), Vec3::Zero());
+       CameraPose pose2(clip, frame2, clip, R, t);
+       reconstruction->AddCameraPose(pose1);
+       reconstruction->AddCameraPose(pose2);
 
-       //LG << "From two frame reconstruction got:\nR:\n" << R
-       //   << "\nt:" << t.transpose();
+       LG << "From two frame reconstruction got:\nR:\n" << R
+          << "\nt:" << t.transpose();
        return true;
 }
 
+void Reconstruction::AddCameraPose(const CameraPose& pose)
+{
+       if(camera_poses_.size() < pose.clip + 1)
+               camera_poses_.resize(pose.clip+1);
+       camera_poses_[pose.clip].push_back(pose);
+}
+
+/**
+ * @brief Reconstruction::AddCameraIntrinsics insert camera intrinsics into 
Reconstruction by index,
+ * overwrite the old intrinsic if there is any, resize the CameraIntrinsics 
vector if the size is smaller
+ * than index.
+ * @param intrinsics_ptr: camera intrinsic pointer
+ * @param intrisic_index: index
+ * @return
+ */
+void Reconstruction::AddCameraIntrinsics(CameraIntrinsics* intrinsics_ptr, 
const int intrinsic_index)
+{
+       if(camera_intrinsics_.size() < intrinsic_index+1)
+               camera_intrinsics_.resize(intrinsic_index+1);
+       camera_intrinsics_[intrinsic_index] = intrinsics_ptr;
+}
+
 }  // namespace mv
diff --git a/intern/libmv/libmv/autotrack/reconstruction.h 
b/intern/libmv/libmv/autotrack/reconstruction.h
index 0a9fd29..6f45739 100644
--- a/intern/libmv/libmv/autotrack/reconstruction.h
+++ b/intern/libmv/libmv/autotrack/reconstruction.h
@@ -39,12 +39,15 @@ class Model;
 struct Marker;
 class Tracks;
 
-class CameraPose {
-  int clip;
-  int frame;
-  int intrinsics;
-  Mat3 R;
-  Vec3 t;
+struct CameraPose {
+       CameraPose(int clip_, int frame_, int intrinsics_, Mat3 R_, Vec3 t_):
+           clip(clip_), frame(frame_), intrinsics(intrinsics_), R(R_), t(t_) {}
+
+       int clip;
+       int frame;
+       int intrinsics;
+       Mat3 R;
+       Vec3 t;
 };
 
 class Point {
@@ -61,7 +64,7 @@ class Reconstruction {
  public:
   // All methods copy their input reference or take ownership of the pointer.
   void AddCameraPose(const CameraPose& pose);
-  int  AddCameraIntrinsics(CameraIntrinsics* intrinsics);
+  void AddCameraIntrinsics(CameraIntrinsics* intrinsics_ptr, const int 
intrinsic_index);
   int  AddPoint(const Point& point);
   int  AddModel(Model* model);
 
@@ -90,6 +93,8 @@ class Reconstruction {
 };
 
 bool ReconstructTwoFrames(const vector<Marker> &markers,
+                          const int clip,
+                          libmv::CameraIntrinsics &cam_intrinsics,
                           Reconstruction *reconstruction);
 }  // namespace mv

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

Reply via email to