diff options
Diffstat (limited to 'intern/libmv/intern/reconstruction.cc')
-rw-r--r-- | intern/libmv/intern/reconstruction.cc | 229 |
1 files changed, 106 insertions, 123 deletions
diff --git a/intern/libmv/intern/reconstruction.cc b/intern/libmv/intern/reconstruction.cc index 0f4e890d4ca..430607461da 100644 --- a/intern/libmv/intern/reconstruction.cc +++ b/intern/libmv/intern/reconstruction.cc @@ -24,8 +24,8 @@ #include "libmv/logging/logging.h" #include "libmv/simple_pipeline/bundle.h" -#include "libmv/simple_pipeline/keyframe_selection.h" #include "libmv/simple_pipeline/initialize_reconstruction.h" +#include "libmv/simple_pipeline/keyframe_selection.h" #include "libmv/simple_pipeline/modal_solver.h" #include "libmv/simple_pipeline/pipeline.h" #include "libmv/simple_pipeline/reconstruction_scale.h" @@ -39,19 +39,19 @@ using libmv::EuclideanScaleToUnity; using libmv::Marker; using libmv::ProgressUpdateCallback; -using libmv::PolynomialCameraIntrinsics; -using libmv::Tracks; using libmv::EuclideanBundle; using libmv::EuclideanCompleteReconstruction; using libmv::EuclideanReconstructTwoFrames; using libmv::EuclideanReprojectionError; +using libmv::PolynomialCameraIntrinsics; +using libmv::Tracks; struct libmv_Reconstruction { EuclideanReconstruction reconstruction; /* Used for per-track average error calculation after reconstruction */ Tracks tracks; - CameraIntrinsics *intrinsics; + CameraIntrinsics* intrinsics; double error; bool is_valid; @@ -63,7 +63,7 @@ class ReconstructUpdateCallback : public ProgressUpdateCallback { public: ReconstructUpdateCallback( reconstruct_progress_update_cb progress_update_callback, - void *callback_customdata) { + void* callback_customdata) { progress_update_callback_ = progress_update_callback; callback_customdata_ = callback_customdata; } @@ -73,13 +73,14 @@ class ReconstructUpdateCallback : public ProgressUpdateCallback { progress_update_callback_(callback_customdata_, progress, message); } } + protected: reconstruct_progress_update_cb progress_update_callback_; void* callback_customdata_; }; void libmv_solveRefineIntrinsics( - const Tracks &tracks, + const Tracks& tracks, const int refine_intrinsics, const int bundle_constraints, reconstruct_progress_update_cb progress_update_callback, @@ -96,11 +97,11 @@ void libmv_solveRefineIntrinsics( bundle_intrinsics |= libmv::BUNDLE_PRINCIPAL_POINT; } -#define SET_DISTORTION_FLAG_CHECKED(type, coefficient) \ - do { \ - if (refine_intrinsics & LIBMV_REFINE_ ## type ##_DISTORTION_ ## coefficient) { \ - bundle_intrinsics |= libmv::BUNDLE_ ## type ## _ ## coefficient; \ - } \ +#define SET_DISTORTION_FLAG_CHECKED(type, coefficient) \ + do { \ + if (refine_intrinsics & LIBMV_REFINE_##type##_DISTORTION_##coefficient) { \ + bundle_intrinsics |= libmv::BUNDLE_##type##_##coefficient; \ + } \ } while (0) SET_DISTORTION_FLAG_CHECKED(RADIAL, K1); @@ -123,20 +124,19 @@ void libmv_solveRefineIntrinsics( } void finishReconstruction( - const Tracks &tracks, - const CameraIntrinsics &camera_intrinsics, - libmv_Reconstruction *libmv_reconstruction, + const Tracks& tracks, + const CameraIntrinsics& camera_intrinsics, + libmv_Reconstruction* libmv_reconstruction, reconstruct_progress_update_cb progress_update_callback, - void *callback_customdata) { - EuclideanReconstruction &reconstruction = - libmv_reconstruction->reconstruction; + void* callback_customdata) { + EuclideanReconstruction& reconstruction = + libmv_reconstruction->reconstruction; /* Reprojection error calculation. */ progress_update_callback(callback_customdata, 1.0, "Finishing solution"); libmv_reconstruction->tracks = tracks; - libmv_reconstruction->error = EuclideanReprojectionError(tracks, - reconstruction, - camera_intrinsics); + libmv_reconstruction->error = + EuclideanReprojectionError(tracks, reconstruction, camera_intrinsics); } bool selectTwoKeyframesBasedOnGRICAndVariance( @@ -148,9 +148,8 @@ bool selectTwoKeyframesBasedOnGRICAndVariance( libmv::vector<int> keyframes; /* Get list of all keyframe candidates first. */ - SelectKeyframesBasedOnGRICAndVariance(normalized_tracks, - camera_intrinsics, - keyframes); + SelectKeyframesBasedOnGRICAndVariance( + normalized_tracks, camera_intrinsics, keyframes); if (keyframes.size() < 2) { LG << "Not enough keyframes detected by GRIC"; @@ -175,24 +174,20 @@ bool selectTwoKeyframesBasedOnGRICAndVariance( EuclideanReconstruction reconstruction; int current_keyframe = keyframes[i]; libmv::vector<Marker> keyframe_markers = - normalized_tracks.MarkersForTracksInBothImages(previous_keyframe, - current_keyframe); + normalized_tracks.MarkersForTracksInBothImages(previous_keyframe, + current_keyframe); Tracks keyframe_tracks(keyframe_markers); /* get a solution from two keyframes only */ EuclideanReconstructTwoFrames(keyframe_markers, &reconstruction); EuclideanBundle(keyframe_tracks, &reconstruction); - EuclideanCompleteReconstruction(keyframe_tracks, - &reconstruction, - NULL); + EuclideanCompleteReconstruction(keyframe_tracks, &reconstruction, NULL); - double current_error = EuclideanReprojectionError(tracks, - reconstruction, - camera_intrinsics); + double current_error = + EuclideanReprojectionError(tracks, reconstruction, camera_intrinsics); - LG << "Error between " << previous_keyframe - << " and " << current_keyframe + LG << "Error between " << previous_keyframe << " and " << current_keyframe << ": " << current_error; if (current_error < best_error) { @@ -214,53 +209,49 @@ Marker libmv_projectMarker(const EuclideanPoint& point, projected /= projected(2); libmv::Marker reprojected_marker; - intrinsics.ApplyIntrinsics(projected(0), projected(1), - &reprojected_marker.x, - &reprojected_marker.y); + intrinsics.ApplyIntrinsics( + projected(0), projected(1), &reprojected_marker.x, &reprojected_marker.y); reprojected_marker.image = camera.image; reprojected_marker.track = point.track; return reprojected_marker; } -void libmv_getNormalizedTracks(const Tracks &tracks, - const CameraIntrinsics &camera_intrinsics, - Tracks *normalized_tracks) { +void libmv_getNormalizedTracks(const Tracks& tracks, + const CameraIntrinsics& camera_intrinsics, + Tracks* normalized_tracks) { libmv::vector<Marker> markers = tracks.AllMarkers(); for (int i = 0; i < markers.size(); ++i) { - Marker &marker = markers[i]; - camera_intrinsics.InvertIntrinsics(marker.x, marker.y, - &marker.x, &marker.y); - normalized_tracks->Insert(marker.image, - marker.track, - marker.x, marker.y, - marker.weight); + Marker& marker = markers[i]; + camera_intrinsics.InvertIntrinsics( + marker.x, marker.y, &marker.x, &marker.y); + normalized_tracks->Insert( + marker.image, marker.track, marker.x, marker.y, marker.weight); } } } // namespace -libmv_Reconstruction *libmv_solveReconstruction( +libmv_Reconstruction* libmv_solveReconstruction( 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 = - LIBMV_OBJECT_NEW(libmv_Reconstruction); + libmv_Reconstruction* libmv_reconstruction = + LIBMV_OBJECT_NEW(libmv_Reconstruction); - Tracks &tracks = *((Tracks *) libmv_tracks); - EuclideanReconstruction &reconstruction = - libmv_reconstruction->reconstruction; + Tracks& tracks = *((Tracks*)libmv_tracks); + EuclideanReconstruction& reconstruction = + libmv_reconstruction->reconstruction; ReconstructUpdateCallback update_callback = - ReconstructUpdateCallback(progress_update_callback, - callback_customdata); + ReconstructUpdateCallback(progress_update_callback, callback_customdata); /* Retrieve reconstruction options from C-API to libmv API. */ - CameraIntrinsics *camera_intrinsics; + CameraIntrinsics* camera_intrinsics; camera_intrinsics = libmv_reconstruction->intrinsics = - libmv_cameraIntrinsicsCreateFromOptions(libmv_camera_intrinsics_options); + libmv_cameraIntrinsicsCreateFromOptions(libmv_camera_intrinsics_options); /* Invert the camera intrinsics/ */ Tracks normalized_tracks; @@ -276,10 +267,10 @@ libmv_Reconstruction *libmv_solveReconstruction( update_callback.invoke(0, "Selecting keyframes"); if (selectTwoKeyframesBasedOnGRICAndVariance(tracks, - normalized_tracks, - *camera_intrinsics, - keyframe1, - keyframe2)) { + normalized_tracks, + *camera_intrinsics, + keyframe1, + keyframe2)) { /* so keyframes in the interface would be updated */ libmv_reconstruction_options->keyframe1 = keyframe1; libmv_reconstruction_options->keyframe2 = keyframe2; @@ -290,7 +281,7 @@ libmv_Reconstruction *libmv_solveReconstruction( LG << "frames to init from: " << keyframe1 << " " << keyframe2; libmv::vector<Marker> keyframe_markers = - normalized_tracks.MarkersForTracksInBothImages(keyframe1, keyframe2); + normalized_tracks.MarkersForTracksInBothImages(keyframe1, keyframe2); LG << "number of markers for init: " << keyframe_markers.size(); @@ -309,14 +300,12 @@ libmv_Reconstruction *libmv_solveReconstruction( } EuclideanBundle(normalized_tracks, &reconstruction); - EuclideanCompleteReconstruction(normalized_tracks, - &reconstruction, - &update_callback); + EuclideanCompleteReconstruction( + normalized_tracks, &reconstruction, &update_callback); /* Refinement. */ if (libmv_reconstruction_options->refine_intrinsics) { - libmv_solveRefineIntrinsics( - tracks, + libmv_solveRefineIntrinsics(tracks, libmv_reconstruction_options->refine_intrinsics, libmv::BUNDLE_NO_CONSTRAINTS, progress_update_callback, @@ -336,31 +325,29 @@ libmv_Reconstruction *libmv_solveReconstruction( callback_customdata); libmv_reconstruction->is_valid = true; - return (libmv_Reconstruction *) libmv_reconstruction; + return (libmv_Reconstruction*)libmv_reconstruction; } -libmv_Reconstruction *libmv_solveModal( - const libmv_Tracks *libmv_tracks, - const libmv_CameraIntrinsicsOptions *libmv_camera_intrinsics_options, - const libmv_ReconstructionOptions *libmv_reconstruction_options, +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 = - LIBMV_OBJECT_NEW(libmv_Reconstruction); + void* callback_customdata) { + libmv_Reconstruction* libmv_reconstruction = + LIBMV_OBJECT_NEW(libmv_Reconstruction); - Tracks &tracks = *((Tracks *) libmv_tracks); - EuclideanReconstruction &reconstruction = - libmv_reconstruction->reconstruction; + Tracks& tracks = *((Tracks*)libmv_tracks); + EuclideanReconstruction& reconstruction = + libmv_reconstruction->reconstruction; ReconstructUpdateCallback update_callback = - ReconstructUpdateCallback(progress_update_callback, - callback_customdata); + ReconstructUpdateCallback(progress_update_callback, callback_customdata); /* Retrieve reconstruction options from C-API to libmv API. */ - CameraIntrinsics *camera_intrinsics; + CameraIntrinsics* camera_intrinsics; camera_intrinsics = libmv_reconstruction->intrinsics = - libmv_cameraIntrinsicsCreateFromOptions( - libmv_camera_intrinsics_options); + libmv_cameraIntrinsicsCreateFromOptions(libmv_camera_intrinsics_options); /* Invert the camera intrinsics. */ Tracks normalized_tracks; @@ -378,11 +365,11 @@ libmv_Reconstruction *libmv_solveModal( /* Refinement. */ if (libmv_reconstruction_options->refine_intrinsics) { - libmv_solveRefineIntrinsics( - tracks, + libmv_solveRefineIntrinsics(tracks, libmv_reconstruction_options->refine_intrinsics, libmv::BUNDLE_NO_TRANSLATION, - progress_update_callback, callback_customdata, + progress_update_callback, + callback_customdata, &reconstruction, camera_intrinsics); } @@ -395,26 +382,25 @@ libmv_Reconstruction *libmv_solveModal( callback_customdata); libmv_reconstruction->is_valid = true; - return (libmv_Reconstruction *) libmv_reconstruction; + return (libmv_Reconstruction*)libmv_reconstruction; } -int libmv_reconstructionIsValid(libmv_Reconstruction *libmv_reconstruction) { +int libmv_reconstructionIsValid(libmv_Reconstruction* libmv_reconstruction) { return libmv_reconstruction->is_valid; } -void libmv_reconstructionDestroy(libmv_Reconstruction *libmv_reconstruction) { +void libmv_reconstructionDestroy(libmv_Reconstruction* libmv_reconstruction) { LIBMV_OBJECT_DELETE(libmv_reconstruction->intrinsics, CameraIntrinsics); LIBMV_OBJECT_DELETE(libmv_reconstruction, libmv_Reconstruction); } int libmv_reprojectionPointForTrack( - const libmv_Reconstruction *libmv_reconstruction, + const libmv_Reconstruction* libmv_reconstruction, int track, double pos[3]) { - const EuclideanReconstruction *reconstruction = - &libmv_reconstruction->reconstruction; - const EuclideanPoint *point = - reconstruction->PointForTrack(track); + const EuclideanReconstruction* reconstruction = + &libmv_reconstruction->reconstruction; + const EuclideanPoint* point = reconstruction->PointForTrack(track); if (point) { pos[0] = point->X[0]; pos[1] = point->X[2]; @@ -425,23 +411,22 @@ int libmv_reprojectionPointForTrack( } double libmv_reprojectionErrorForTrack( - const libmv_Reconstruction *libmv_reconstruction, - int track) { - const EuclideanReconstruction *reconstruction = - &libmv_reconstruction->reconstruction; - const CameraIntrinsics *intrinsics = libmv_reconstruction->intrinsics; + const libmv_Reconstruction* libmv_reconstruction, int track) { + const EuclideanReconstruction* reconstruction = + &libmv_reconstruction->reconstruction; + const CameraIntrinsics* intrinsics = libmv_reconstruction->intrinsics; libmv::vector<Marker> markers = - libmv_reconstruction->tracks.MarkersForTrack(track); + libmv_reconstruction->tracks.MarkersForTrack(track); int num_reprojected = 0; double total_error = 0.0; for (int i = 0; i < markers.size(); ++i) { double weight = markers[i].weight; - const EuclideanCamera *camera = - reconstruction->CameraForImage(markers[i].image); - const EuclideanPoint *point = - reconstruction->PointForTrack(markers[i].track); + const EuclideanCamera* camera = + reconstruction->CameraForImage(markers[i].image); + const EuclideanPoint* point = + reconstruction->PointForTrack(markers[i].track); if (!camera || !point || weight == 0.0) { continue; @@ -450,7 +435,7 @@ double libmv_reprojectionErrorForTrack( num_reprojected++; Marker reprojected_marker = - libmv_projectMarker(*point, *camera, *intrinsics); + libmv_projectMarker(*point, *camera, *intrinsics); double ex = (reprojected_marker.x - markers[i].x) * weight; double ey = (reprojected_marker.y - markers[i].y) * weight; @@ -461,14 +446,13 @@ double libmv_reprojectionErrorForTrack( } double libmv_reprojectionErrorForImage( - const libmv_Reconstruction *libmv_reconstruction, - int image) { - const EuclideanReconstruction *reconstruction = - &libmv_reconstruction->reconstruction; - const CameraIntrinsics *intrinsics = libmv_reconstruction->intrinsics; + const libmv_Reconstruction* libmv_reconstruction, int image) { + const EuclideanReconstruction* reconstruction = + &libmv_reconstruction->reconstruction; + const CameraIntrinsics* intrinsics = libmv_reconstruction->intrinsics; libmv::vector<Marker> markers = - libmv_reconstruction->tracks.MarkersInImage(image); - const EuclideanCamera *camera = reconstruction->CameraForImage(image); + libmv_reconstruction->tracks.MarkersInImage(image); + const EuclideanCamera* camera = reconstruction->CameraForImage(image); int num_reprojected = 0; double total_error = 0.0; @@ -477,8 +461,8 @@ double libmv_reprojectionErrorForImage( } for (int i = 0; i < markers.size(); ++i) { - const EuclideanPoint *point = - reconstruction->PointForTrack(markers[i].track); + const EuclideanPoint* point = + reconstruction->PointForTrack(markers[i].track); if (!point) { continue; @@ -487,7 +471,7 @@ double libmv_reprojectionErrorForImage( num_reprojected++; Marker reprojected_marker = - libmv_projectMarker(*point, *camera, *intrinsics); + libmv_projectMarker(*point, *camera, *intrinsics); double ex = (reprojected_marker.x - markers[i].x) * markers[i].weight; double ey = (reprojected_marker.y - markers[i].y) * markers[i].weight; @@ -498,13 +482,12 @@ double libmv_reprojectionErrorForImage( } int libmv_reprojectionCameraForImage( - const libmv_Reconstruction *libmv_reconstruction, + const libmv_Reconstruction* libmv_reconstruction, int image, double mat[4][4]) { - const EuclideanReconstruction *reconstruction = - &libmv_reconstruction->reconstruction; - const EuclideanCamera *camera = - reconstruction->CameraForImage(image); + const EuclideanReconstruction* reconstruction = + &libmv_reconstruction->reconstruction; + const EuclideanCamera* camera = reconstruction->CameraForImage(image); if (camera) { for (int j = 0; j < 3; ++j) { @@ -541,11 +524,11 @@ int libmv_reprojectionCameraForImage( } double libmv_reprojectionError( - const libmv_Reconstruction *libmv_reconstruction) { + const libmv_Reconstruction* libmv_reconstruction) { return libmv_reconstruction->error; } -libmv_CameraIntrinsics *libmv_reconstructionExtractIntrinsics( - libmv_Reconstruction *libmv_reconstruction) { - return (libmv_CameraIntrinsics *) libmv_reconstruction->intrinsics; +libmv_CameraIntrinsics* libmv_reconstructionExtractIntrinsics( + libmv_Reconstruction* libmv_reconstruction) { + return (libmv_CameraIntrinsics*)libmv_reconstruction->intrinsics; } |