[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60079] branches/soc-2013-motion_track/ extern/libmv/libmv/simple_pipeline: Modify keyframe selection algorithm to be camera-aware
Joseph Mansfield
sftrabbit at gmail.com
Thu Sep 12 18:16:08 CEST 2013
Revision: 60079
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60079
Author: sftrabbit
Date: 2013-09-12 16:16:08 +0000 (Thu, 12 Sep 2013)
Log Message:
-----------
Modify keyframe selection algorithm to be camera-aware
The keyframe selection algorithm can now select keyframes from the camera passed to it as an argument. It's worth looking into multicamera algorithms too.
Modified Paths:
--------------
branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/keyframe_selection.cc
branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/keyframe_selection.h
Modified: branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/keyframe_selection.cc
===================================================================
--- branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/keyframe_selection.cc 2013-09-12 15:30:37 UTC (rev 60078)
+++ branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/keyframe_selection.cc 2013-09-12 16:16:08 UTC (rev 60079)
@@ -291,16 +291,17 @@
void SelectKeyframesBasedOnGRICAndVariance(
const Tracks &tracks,
const std::vector<CameraIntrinsics> &intrinsics,
+ int camera,
vector<int> &keyframes) {
// Mirza Tahir Ahmed, Matthew N. Dailey
// Robust key frame extraction for 3D reconstruction from video streams
//
// http://www.cs.ait.ac.th/~mdailey/papers/Tahir-KeyFrame.pdf
- static const int kSelectionCamera = 0;
- const CameraIntrinsics &selection_intrinsics = intrinsics[kSelectionCamera];
+ Tracks camera_tracks(tracks.MarkersForCamera(camera));
+ const CameraIntrinsics &camera_intrinsics = intrinsics[camera];
- int max_image = tracks.MaxImage();
+ int max_image = camera_tracks.MaxImage();
int next_keyframe = 1;
int number_keyframes = 0;
@@ -312,7 +313,7 @@
const double Tmin = 0.8;
const double Tmax = 1.0;
- Mat3 N = IntrinsicsNormalizationMatrix(selection_intrinsics);
+ Mat3 N = IntrinsicsNormalizationMatrix(camera_intrinsics);
Mat3 N_inverse = N.inverse();
double Sc_best = std::numeric_limits<double>::max();
@@ -332,11 +333,11 @@
candidate_image++) {
// Conjunction of all markers from both keyframes
vector<Marker> all_markers =
- tracks.MarkersInBothImages(current_keyframe, candidate_image);
+ camera_tracks.MarkersInBothImages(current_keyframe, candidate_image);
// Match keypoints between frames current_keyframe and candidate_image
vector<Marker> tracked_markers =
- tracks.MarkersForTracksInBothImages(current_keyframe, candidate_image);
+ camera_tracks.MarkersForTracksInBothImages(current_keyframe, candidate_image);
// Correspondences in normalized space
Mat x1, x2;
@@ -364,8 +365,8 @@
continue;
Mat3 H, F;
- ComputeHomographyFromCorrespondences(x1, x2, selection_intrinsics, &H);
- ComputeFundamentalFromCorrespondences(x1, x2, selection_intrinsics, &F);
+ ComputeHomographyFromCorrespondences(x1, x2, camera_intrinsics, &H);
+ ComputeFundamentalFromCorrespondences(x1, x2, camera_intrinsics, &F);
// TODO(sergey): STEP 2: Discard outlier matches
@@ -377,9 +378,9 @@
F_e.resize(x1.cols());
for (int i = 0; i < x1.cols(); i++) {
Vec2 current_x1 =
- NorrmalizedToPixelSpace(Vec2(x1(0, i), x1(1, i)), selection_intrinsics);
+ NorrmalizedToPixelSpace(Vec2(x1(0, i), x1(1, i)), camera_intrinsics);
Vec2 current_x2 =
- NorrmalizedToPixelSpace(Vec2(x2(0, i), x2(1, i)), selection_intrinsics);
+ NorrmalizedToPixelSpace(Vec2(x2(0, i), x2(1, i)), camera_intrinsics);
H_e(i) = SymmetricGeometricDistance(H, current_x1, current_x2);
F_e(i) = SymmetricEpipolarDistance(F, current_x1, current_x2);
@@ -449,8 +450,8 @@
reconstruction.InsertView(current_keyframe,
Mat3::Identity(),
Vec3::Zero(),
- kSelectionCamera);
- reconstruction.InsertView(candidate_image, R, t, kSelectionCamera);
+ camera);
+ reconstruction.InsertView(candidate_image, R, t, camera);
// Reconstruct 3D points
int intersects_total = 0, intersects_success = 0;
@@ -584,4 +585,11 @@
}
}
+void SelectKeyframesBasedOnGRICAndVariance(
+ const Tracks &tracks,
+ const std::vector<CameraIntrinsics> &intrinsics,
+ vector<int> &keyframes) {
+ SelectKeyframesBasedOnGRICAndVariance(tracks, intrinsics, 0, keyframes);
+}
+
} // namespace libmv
Modified: branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/keyframe_selection.h
===================================================================
--- branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/keyframe_selection.h 2013-09-12 15:30:37 UTC (rev 60078)
+++ branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/keyframe_selection.h 2013-09-12 16:16:08 UTC (rev 60079)
@@ -29,9 +29,9 @@
namespace libmv {
-// Get list of all images from camera 0 which are good enough to be as keyframes
-// for camera reconstruction. Based on GRIC criteria and uses Pollefeys'
-// approach for correspondence ratio constraint.
+// Get list of all images from given camera which are good enough to be as
+// keyframes for camera reconstruction. Based on GRIC criteria and uses
+// Pollefeys' approach for correspondence ratio constraint.
//
// Additional criteria based on reconstruction variance are used. This means if
// correspondence and GRIC criteria are passed, two-frame reconstruction using
@@ -50,8 +50,14 @@
void SelectKeyframesBasedOnGRICAndVariance(
const Tracks &tracks,
const std::vector<CameraIntrinsics> &intrinsics,
+ int camera,
vector<int> &keyframes);
+void SelectKeyframesBasedOnGRICAndVariance(
+ const Tracks &tracks,
+ const std::vector<CameraIntrinsics> &intrinsics,
+ vector<int> &keyframes);
+
} // namespace libmv
#endif // LIBMV_SIMPLE_PIPELINE_KEYFRAME_SELECTION_H_
More information about the Bf-blender-cvs
mailing list