[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58611] branches/soc-2013-motion_track/ extern/libmv: Unify libmv C API for solving
Joseph Mansfield
sftrabbit at gmail.com
Fri Jul 26 02:37:26 CEST 2013
Revision: 58611
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58611
Author: sftrabbit
Date: 2013-07-26 00:37:26 +0000 (Fri, 26 Jul 2013)
Log Message:
-----------
Unify libmv C API for solving
The current libmv C API exposes the libmv_solve function which forwards to either libmv_solveReconstruction or libmv_solveModal, depending on whether the user selected Tripod Motion in the UI. These functions contain a fair bit of common code. Unify them into the single libmv_solve function, leading the way to a clean multiview reconstruction solution.
Modified Paths:
--------------
branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/bundle.cc
branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/bundle.h
branches/soc-2013-motion_track/extern/libmv/libmv-capi.cc
Modified: branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/bundle.cc
===================================================================
--- branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/bundle.cc 2013-07-25 23:42:20 UTC (rev 58610)
+++ branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/bundle.cc 2013-07-26 00:37:26 UTC (rev 58611)
@@ -385,13 +385,25 @@
void EuclideanBundle(const Tracks &tracks,
EuclideanReconstruction *reconstruction) {
- CameraIntrinsics intrinsics;
+ BundleOptions bundle_options;
+ CameraIntrinsics empty_intrinsics;
+ EuclideanBundleCommonIntrinsics(tracks,
+ bundle_options,
+ reconstruction,
+ &empty_intrinsics);
+}
+
+void EuclideanBundleModal(const Tracks &tracks,
+ EuclideanReconstruction *reconstruction) {
BundleOptions bundle_options;
+ bundle_options.constraints = libmv::BUNDLE_NO_TRANSLATION;
+
+ CameraIntrinsics empty_intrinsics;
EuclideanBundleCommonIntrinsics(tracks,
bundle_options,
reconstruction,
- &intrinsics);
+ &empty_intrinsics);
}
void EuclideanBundleCommonIntrinsics(const Tracks &tracks,
Modified: branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/bundle.h
===================================================================
--- branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/bundle.h 2013-07-25 23:42:20 UTC (rev 58610)
+++ branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/bundle.h 2013-07-26 00:37:26 UTC (rev 58611)
@@ -82,6 +82,27 @@
/*!
Refine camera poses and 3D coordinates using bundle adjustment.
+ This routine adjusts all cameras and points in \a *reconstruction. This
+ assumes a full observation for reconstructed tracks; this implies that if
+ there is a reconstructed 3D point (a bundle) for a track, then all markers
+ for that track will be included in the minimization. \a tracks should
+ contain markers used in the initial reconstruction.
+
+ The cameras and bundles (3D points), except the camera positions, are
+ refined in-place.
+
+ \note This assumes an outlier-free set of markers.
+ \note This assumes a calibrated reconstruction, e.g. the markers are
+ already corrected for camera intrinsics and radial distortion.
+
+ \sa EuclideanResect, EuclideanIntersect, EuclideanReconstructTwoFrames
+*/
+void EuclideanBundleModal(const Tracks &tracks,
+ EuclideanReconstruction *reconstruction);
+
+/*!
+ Refine camera poses and 3D coordinates using bundle adjustment.
+
This routine adjusts all cameras positions, points, and the camera
intrinsics (assumed common across all images) in \a *reconstruction. This
assumes a full observation for reconstructed tracks; this implies that if
Modified: branches/soc-2013-motion_track/extern/libmv/libmv-capi.cc
===================================================================
--- branches/soc-2013-motion_track/extern/libmv/libmv-capi.cc 2013-07-25 23:42:20 UTC (rev 58610)
+++ branches/soc-2013-motion_track/extern/libmv/libmv-capi.cc 2013-07-26 00:37:26 UTC (rev 58611)
@@ -600,22 +600,22 @@
return true;
}
-static libmv_Reconstruction *libmv_solveReconstruction(const libmv_Tracks *libmv_tracks,
- const libmv_cameraIntrinsicsOptions *libmv_camera_intrinsics_options,
+libmv_Reconstruction *libmv_solve(const libmv_Tracks *libmv_tracks,
+ const libmv_cameraIntrinsicsOptions libmv_camera_intrinsics_options[],
libmv_reconstructionOptions *libmv_reconstruction_options,
reconstruct_progress_update_cb progress_update_callback,
void *callback_customdata)
{
libmv_Reconstruction *libmv_reconstruction = new libmv_Reconstruction();
-
- libmv::Tracks &tracks = *((libmv::Tracks *) libmv_tracks);
libmv::EuclideanReconstruction &reconstruction = libmv_reconstruction->reconstruction;
libmv::CameraIntrinsics &camera_intrinsics = libmv_reconstruction->intrinsics;
- ReconstructUpdateCallback update_callback =
- ReconstructUpdateCallback(progress_update_callback, callback_customdata);
+ libmv::Tracks &tracks = *((libmv::Tracks *) libmv_tracks);
- /* Retrieve reconstruction options from C-API to libmv API */
+ ReconstructUpdateCallback update_callback(progress_update_callback,
+ callback_customdata);
+
+ /* Convert options from C-API to libmv API */
cameraIntrinsicsFromOptions(libmv_camera_intrinsics_options, &camera_intrinsics);
libmv::ReconstructionOptions reconstruction_options;
@@ -625,43 +625,53 @@
/* Invert the camera intrinsics */
libmv::Tracks normalized_tracks = getNormalizedTracks(tracks, camera_intrinsics);
- /* keyframe selection */
- int keyframe1 = libmv_reconstruction_options->keyframe1,
- keyframe2 = libmv_reconstruction_options->keyframe2;
+ if (libmv_reconstruction_options->motion_flag & LIBMV_TRACKING_MOTION_MODAL) {
+ /* Perform modal solving */
+ libmv::ModalSolver(normalized_tracks, &reconstruction, &update_callback);
+
+ /* Perform bundle adjustment */
+ libmv::EuclideanBundleModal(tracks,
+ &reconstruction);
+ }
+ else {
+ /* Keyframe selection */
+ int &keyframe1 = libmv_reconstruction_options->keyframe1,
+ &keyframe2 = libmv_reconstruction_options->keyframe2;
- if (libmv_reconstruction_options->select_keyframes) {
- LG << "Using automatic keyframe selection";
+ if (libmv_reconstruction_options->select_keyframes) {
+ LG << "Using automatic keyframe selection";
- update_callback.invoke(0, "Selecting keyframes");
+ update_callback.invoke(0, "Selecting keyframes");
- selectTwoKeyframesBasedOnGRICAndVariance(tracks,
- normalized_tracks,
- camera_intrinsics,
- reconstruction_options,
- keyframe1,
- keyframe2);
+ selectTwoKeyframesBasedOnGRICAndVariance(tracks,
+ normalized_tracks,
+ camera_intrinsics,
+ reconstruction_options,
+ keyframe1,
+ keyframe2);
+ }
- /* so keyframes in the interface would be updated */
- libmv_reconstruction_options->keyframe1 = keyframe1;
- libmv_reconstruction_options->keyframe2 = keyframe2;
- }
+ LG << "frames to init from: " << keyframe1 << " " << keyframe2;
- /* actual reconstruction */
- LG << "frames to init from: " << keyframe1 << " " << keyframe2;
+ /* Reconstruct for two frames */
+ libmv::vector<libmv::Marker> keyframe_markers =
+ normalized_tracks.MarkersForTracksInBothImages(keyframe1, keyframe2);
- libmv::vector<libmv::Marker> keyframe_markers =
- normalized_tracks.MarkersForTracksInBothImages(keyframe1, keyframe2);
+ LG << "number of markers for init: " << keyframe_markers.size();
- LG << "number of markers for init: " << keyframe_markers.size();
+ update_callback.invoke(0, "Initial reconstruction");
- update_callback.invoke(0, "Initial reconstruction");
+ libmv::EuclideanReconstructTwoFrames(keyframe_markers, &reconstruction);
- libmv::EuclideanReconstructTwoFrames(keyframe_markers, &reconstruction);
- libmv::EuclideanBundle(normalized_tracks, &reconstruction);
- libmv::EuclideanCompleteReconstruction(reconstruction_options, normalized_tracks,
- &reconstruction, &update_callback);
+ /* Perform bundle adjustment */
+ libmv::EuclideanBundle(normalized_tracks, &reconstruction);
- /* refinement */
+ /* Reconstruct for all frames */
+ libmv::EuclideanCompleteReconstruction(reconstruction_options, normalized_tracks,
+ &reconstruction, &update_callback);
+ }
+
+ /* Refine bundle parameters */
if (libmv_reconstruction_options->refine_intrinsics) {
libmv_solveRefineIntrinsics(tracks,
*libmv_reconstruction_options,
@@ -671,94 +681,16 @@
&camera_intrinsics);
}
- /* set reconstruction scale to unity */
+ /* Set reconstruction scale to unity */
libmv::EuclideanScaleToUnity(&reconstruction);
- /* finish reconstruction */
+ /* Finish reconstruction */
finishReconstruction(tracks, camera_intrinsics, libmv_reconstruction,
progress_update_callback, callback_customdata);
return (libmv_Reconstruction *)libmv_reconstruction;
}
-static struct libmv_Reconstruction *libmv_solveModal(const libmv_Tracks *libmv_tracks,
- const libmv_cameraIntrinsicsOptions *libmv_camera_intrinsics_options,
- const libmv_reconstructionOptions *libmv_reconstruction_options,
- reconstruct_progress_update_cb progress_update_callback,
- void *callback_customdata)
-{
- libmv_Reconstruction *libmv_reconstruction = new libmv_Reconstruction();
-
- libmv::Tracks &tracks = *((libmv::Tracks *) libmv_tracks);
- libmv::EuclideanReconstruction &reconstruction = libmv_reconstruction->reconstruction;
- libmv::CameraIntrinsics &camera_intrinsics = libmv_reconstruction->intrinsics;
-
- ReconstructUpdateCallback update_callback =
- ReconstructUpdateCallback(progress_update_callback, callback_customdata);
-
- cameraIntrinsicsFromOptions(libmv_camera_intrinsics_options, &camera_intrinsics);
-
- /* Invert the camera intrinsics. */
- libmv::Tracks normalized_tracks = getNormalizedTracks(tracks, camera_intrinsics);
-
- /* Actual reconstruction. */
- libmv::ModalSolver(normalized_tracks, &reconstruction, &update_callback);
-
- libmv::BundleOptions bundle_options;
- bundle_options.bundle_intrinsics = libmv::BUNDLE_NO_INTRINSICS;
- bundle_options.constraints = libmv::BUNDLE_NO_TRANSLATION;
-
- libmv::CameraIntrinsics empty_intrinsics;
- libmv::EuclideanBundleCommonIntrinsics(tracks,
- bundle_options,
- &reconstruction,
- &empty_intrinsics);
-
- /* Refinement. */
- if (libmv_reconstruction_options->refine_intrinsics) {
- libmv_solveRefineIntrinsics(tracks,
- *libmv_reconstruction_options,
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list