[Bf-blender-cvs] [65e6387] soc-2016-multiview: finish the rough pipeline, begin debugging
Tianwei Shen
noreply at git.blender.org
Tue Jun 28 05:33:30 CEST 2016
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)
More information about the Bf-blender-cvs
mailing list