[Bf-blender-cvs] [6730c6d] soc-2016-multiview: pipeline in progress, so far so good
Tianwei Shen
noreply at git.blender.org
Tue Jun 14 18:29:15 CEST 2016
Commit: 6730c6d19a8b76e4e44081db1d9d589f694e1413
Author: Tianwei Shen
Date: Wed Jun 15 00:29:01 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rB6730c6d19a8b76e4e44081db1d9d589f694e1413
pipeline in progress, so far so good
===================================================================
M intern/libmv/intern/reconstructionN.cc
M intern/libmv/libmv/autotrack/reconstruction.cc
M intern/libmv/libmv/autotrack/reconstruction.h
M intern/libmv/libmv/autotrack/tracks.cc
M intern/libmv/libmv/autotrack/tracks.h
===================================================================
diff --git a/intern/libmv/intern/reconstructionN.cc b/intern/libmv/intern/reconstructionN.cc
index f625833..aa0512e 100644
--- a/intern/libmv/intern/reconstructionN.cc
+++ b/intern/libmv/intern/reconstructionN.cc
@@ -42,6 +42,7 @@
// 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;
using mv::Marker;
@@ -116,8 +117,7 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(const int clip_num,
libmv::vector<Marker> keyframe_markers;
int keyframe1, keyframe2;
- // make reconstrution on the primary clip reconstruction
- Reconstruction &reconstruction = all_libmv_reconstruction[0]->reconstruction;
+ Tracks all_normalized_tracks; // normalized tracks of all clips
for(int i = 0; i < clip_num; i++)
{
all_libmv_reconstruction[i] = LIBMV_OBJECT_NEW(libmv_ReconstructionN);
@@ -132,6 +132,7 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(const int clip_num,
///* 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
{
@@ -140,6 +141,9 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(const int clip_num,
normalized_tracks.GetMarkersForTracksInBothImages(i, keyframe1, i, keyframe2, &keyframe_markers);
}
}
+ // make reconstrution on the primary clip reconstruction
+ Reconstruction &reconstruction = all_libmv_reconstruction[0]->reconstruction;
+ printf("all pose num %d\n", reconstruction.GetAllPoseNum());
printf("frames to init from: %d %d\n", keyframe1, keyframe2);
printf("number of markers for init: %d\n", keyframe_markers.size());
@@ -181,14 +185,21 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(const int clip_num,
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;
+ all_libmv_reconstruction[0]->is_valid = false;
+ return all_libmv_reconstruction;
+ }
+ if(!mv::EuclideanBundleAll(all_normalized_tracks, &reconstruction))
+ {
+ printf("mv::EuclideanBundleAll failed\n");
+ all_libmv_reconstruction[0]->is_valid = false;
+ return all_libmv_reconstruction;
+ }
+ if(!mv::EuclideanReconstructionComplete(all_normalized_tracks, &reconstruction, &update_callback))
+ {
+ printf("mv::EuclideanReconstructionComplete failed\n");
+ all_libmv_reconstruction[0]->is_valid = false;
return all_libmv_reconstruction;
}
- //EuclideanBundle(normalized_tracks, &reconstruction);
- //EuclideanCompleteReconstruction(normalized_tracks,
- // &reconstruction,
- // &update_callback);
///* Refinement/ */
//if (libmv_reconstruction_options->refine_intrinsics) {
@@ -205,13 +216,14 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(const int clip_num,
///* Set reconstruction scale to unity. */
//EuclideanScaleToUnity(&reconstruction);
- ///* Finish reconstruction. */
+ /* Finish reconstruction. */
//finishReconstruction(tracks,
// *camera_intrinsics,
// libmv_reconstruction,
// 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++)
all_libmv_reconstruction[i]->is_valid = true;
diff --git a/intern/libmv/libmv/autotrack/reconstruction.cc b/intern/libmv/libmv/autotrack/reconstruction.cc
index 611191d..748ef53 100644
--- a/intern/libmv/libmv/autotrack/reconstruction.cc
+++ b/intern/libmv/libmv/autotrack/reconstruction.cc
@@ -68,8 +68,9 @@ void CoordinatesForMarkersInFrame(const vector<Marker> &markers,
coordinates->col(i) = coords[i];
}
}
+
/* markers come from two views in the same clip,
- * reconstruction should be empty
+ * reconstruction should be new and empty
*/
bool ReconstructTwoFrames(const vector<Marker> &markers,
const int clip,
@@ -106,10 +107,12 @@ bool ReconstructTwoFrames(const vector<Marker> &markers,
return false;
}
+ printf("%d, %d, %d\n", cam_intrinsics.image_width(), cam_intrinsics.image_height(), cam_intrinsics.focal_length());
+
// 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);
+ int cam_intrinsic_index = reconstruction->AddCameraIntrinsics(&cam_intrinsics);
+ CameraPose pose1(clip, frame1, cam_intrinsic_index, Mat3::Identity(), Vec3::Zero());
+ CameraPose pose2(clip, frame2, cam_intrinsic_index, R, t);
reconstruction->AddCameraPose(pose1);
reconstruction->AddCameraPose(pose2);
@@ -118,6 +121,34 @@ bool ReconstructTwoFrames(const vector<Marker> &markers,
return true;
}
+/**
+ * @brief EuclideanBundleAll: bundle all the clips and frames
+ * @param all_normalized_tracks: markers from all clips
+ * @param reconstruction: Reconstruction data structure
+ * @return
+ */
+bool EuclideanBundleAll(const Tracks &all_normalized_tracks,
+ Reconstruction *reconstruction)
+{
+ return true;
+}
+
+bool EuclideanReconstructionComplete(const Tracks &tracks,
+ Reconstruction *reconstruction,
+ libmv::ProgressUpdateCallback *update_callback)
+{
+ //InternalCompleteReconstruction<EuclideanPipelineRoutines>(tracks, reconstruction, update_callback);
+ return true;
+}
+
+// ================== mv::Reconstruction implementation ===================
+// push a new cameraIntrinsics and return the index
+int Reconstruction::AddCameraIntrinsics(CameraIntrinsics *intrinsics_ptr)
+{
+ camera_intrinsics_.push_back(intrinsics_ptr);
+ return camera_intrinsics_.size()-1;
+}
+
void Reconstruction::AddCameraPose(const CameraPose& pose)
{
if(camera_poses_.size() < pose.clip + 1)
@@ -125,19 +156,15 @@ void Reconstruction::AddCameraPose(const CameraPose& pose)
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;
+int Reconstruction::GetClipNum() const {
+ return camera_poses_.size();
+}
+
+int Reconstruction::GetAllPoseNum() const {
+ int all_pose = 0;
+ for(int i = 0; i < camera_poses_.size(); ++i) {
+ all_pose += camera_poses_[i].size();
+ }
}
} // namespace mv
diff --git a/intern/libmv/libmv/autotrack/reconstruction.h b/intern/libmv/libmv/autotrack/reconstruction.h
index 6f45739..74aece4 100644
--- a/intern/libmv/libmv/autotrack/reconstruction.h
+++ b/intern/libmv/libmv/autotrack/reconstruction.h
@@ -27,6 +27,7 @@
#include "libmv/base/vector.h"
#include "libmv/numeric/numeric.h"
#include "libmv/simple_pipeline/camera_intrinsics.h"
+#include "libmv/simple_pipeline/callbacks.h"
namespace mv {
@@ -51,51 +52,60 @@ struct CameraPose {
};
class Point {
- int track;
+ int track;
- // The coordinates of the point. Note that not all coordinates are always
- // used; for example points on a plane only use the first two coordinates.
- Vec3 X;
+ // The coordinates of the point. Note that not all coordinates are always
+ // used; for example points on a plane only use the first two coordinates.
+ Vec3 X;
};
// A reconstruction for a set of tracks. The indexing for clip, frame, and
-// track should match that of a Tracs object, stored elsewhere.
+// track should match that of a Tracks object, stored elsewhere.
class Reconstruction {
- public:
- // All methods copy their input reference or take ownership of the pointer.
- void AddCameraPose(const CameraPose& pose);
- void AddCameraIntrinsics(CameraIntrinsics* intrinsics_ptr, const int intrinsic_index);
- int AddPoint(const Point& point);
- int AddModel(Model* model);
-
- // Returns the corresponding pose or point or NULL if missing.
- CameraPose* CameraPoseForFrame(int clip, int frame);
- const CameraPose* CameraPoseForFrame(int clip, int frame) const;
- Point* PointForTrack(int track);
- const Point* PointForTrack(int track) const;
-
- const vector<vector<CameraPose> >& camera_poses() const {
- return camera_poses_;
- }
-
- private:
- // Indexed by CameraPose::intrinsics. Owns the intrinsics objects.
- vector<CameraIntrinsics*> camera_intrinsics_;
-
- // Indexed by Marker::clip then by Marker::frame.
- vector<vector<CameraPose> > camera_poses_;
-
- // Indexed by Marker::track.
- vector<Point> points_;
-
- // Indexed by Marker::model_id. Owns model objects.
- vector<Model*> models_;
+public:
+ // All methods copy their input reference or take ownership of the pointer.
+ void AddCameraPose(const CameraPose& pose);
+ int AddCameraIntrinsics(CameraIntrinsics* intrinsics_ptr);
+ int AddPoint(const Point& point);
+ int AddModel(Model* model);
+
+ // Returns the corresponding pose or point or NULL if missing.
+ CameraPose* CameraPoseForFrame(int clip, int frame);
+ const CameraPose* CameraPoseForFrame(int clip, int frame) const;
+ Point* PointForTrack(int track);
+ const Point* PointForTrack(int track) const;
+
+ const vector<vector<CameraPose> >& camera_poses() const {
+ return camera_poses_;
+ }
+
+ int GetClipNum() const;
+ int GetAllPoseNum() const;
+
+private:
+ // Indexed by CameraPose::intrinsics. Owns the intrinsics objects.
+ vector<CameraIntrinsics*> camera_int
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list