[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58915] branches/soc-2013-motion_track/ extern/libmv/libmv-capi.cc: Add correct handling of multicamera intrinsics
Joseph Mansfield
sftrabbit at gmail.com
Mon Aug 5 02:37:14 CEST 2013
Revision: 58915
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58915
Author: sftrabbit
Date: 2013-08-05 00:37:13 +0000 (Mon, 05 Aug 2013)
Log Message:
-----------
Add correct handling of multicamera intrinsics
One argument to libmv_solve is an array of camera intrinsics options. The code now converts all elements of the array to internal CameraIntrinsics, instead of just the first. The output struct, libmv_Reconstruction, now contains a vector of output camera intrinsics (each element corresponding to a different camera).
Modified Paths:
--------------
branches/soc-2013-motion_track/extern/libmv/libmv-capi.cc
Modified: branches/soc-2013-motion_track/extern/libmv/libmv-capi.cc
===================================================================
--- branches/soc-2013-motion_track/extern/libmv/libmv-capi.cc 2013-08-04 23:48:50 UTC (rev 58914)
+++ branches/soc-2013-motion_track/extern/libmv/libmv-capi.cc 2013-08-05 00:37:13 UTC (rev 58915)
@@ -36,6 +36,8 @@
#include "libmv-capi.h"
+#include <vector>
+
#include <cstdlib>
#include <cassert>
@@ -67,7 +69,7 @@
/* used for per-track average error calculation after reconstruction */
libmv::Tracks tracks;
- libmv::CameraIntrinsics intrinsics;
+ std::vector<libmv::CameraIntrinsics> intrinsics;
double error;
};
@@ -450,6 +452,16 @@
camera_intrinsics_options->image_height);
}
+static void cameraIntrinsicsFromOptions(const libmv_CameraIntrinsicsOptions camera_intrinsics_options[],
+ int num_cameras,
+ std::vector<libmv::CameraIntrinsics> &camera_intrinsics)
+{
+ for (int i = 0; i < num_cameras; ++i) {
+ camera_intrinsics.push_back(libmv::CameraIntrinsics());
+ cameraIntrinsicsFromOptions(camera_intrinsics_options, &camera_intrinsics[i]);
+ }
+}
+
static libmv::Tracks getNormalizedTracks(const libmv::Tracks &tracks, const libmv::CameraIntrinsics &camera_intrinsics)
{
libmv::vector<libmv::Marker> markers = tracks.AllMarkers();
@@ -590,22 +602,23 @@
{
struct libmv_Reconstruction *libmv_reconstruction = new libmv_Reconstruction();
libmv::EuclideanReconstruction &reconstruction = libmv_reconstruction->reconstruction;
- libmv::CameraIntrinsics &camera_intrinsics = libmv_reconstruction->intrinsics;
+ std::vector<libmv::CameraIntrinsics> &camera_intrinsics = libmv_reconstruction->intrinsics;
libmv::Tracks &tracks = *((libmv::Tracks *) libmv_tracks);
+ int num_cameras = tracks.MaxCamera() + 1;
ReconstructUpdateCallback update_callback(progress_update_callback,
callback_customdata);
/* Convert options from C-API to libmv API */
- cameraIntrinsicsFromOptions(libmv_camera_intrinsics_options, &camera_intrinsics);
+ cameraIntrinsicsFromOptions(libmv_camera_intrinsics_options, num_cameras, camera_intrinsics);
libmv::ReconstructionOptions reconstruction_options;
reconstruction_options.success_threshold = libmv_reconstruction_options->success_threshold;
reconstruction_options.use_fallback_reconstruction = libmv_reconstruction_options->use_fallback_reconstruction;
/* Invert the camera intrinsics */
- libmv::Tracks normalized_tracks = getNormalizedTracks(tracks, camera_intrinsics);
+ libmv::Tracks normalized_tracks = getNormalizedTracks(tracks, camera_intrinsics[0]);
if (libmv_reconstruction_options->motion_flag & LIBMV_TRACKING_MOTION_MODAL) {
/* Perform modal solving */
@@ -627,7 +640,7 @@
selectTwoKeyframesBasedOnGRICAndVariance(tracks,
normalized_tracks,
- camera_intrinsics,
+ camera_intrinsics[0],
reconstruction_options,
keyframe1,
keyframe2);
@@ -663,14 +676,14 @@
libmv::EuclideanBundleCommonIntrinsics(tracks,
refinement_bundle_options,
&reconstruction,
- &camera_intrinsics);
+ &camera_intrinsics[0]);
}
/* Set reconstruction scale to unity */
libmv::EuclideanScaleToUnity(&reconstruction);
/* Finish reconstruction */
- finishReconstruction(tracks, camera_intrinsics, libmv_reconstruction,
+ finishReconstruction(tracks, camera_intrinsics[0], libmv_reconstruction,
progress_update_callback, callback_customdata);
return (struct libmv_Reconstruction *)libmv_reconstruction;
@@ -716,23 +729,25 @@
double libmv_reprojectionErrorForTrack(const struct libmv_Reconstruction *libmv_reconstruction, int track)
{
const libmv::EuclideanReconstruction *reconstruction = &libmv_reconstruction->reconstruction;
- const libmv::CameraIntrinsics *intrinsics = &libmv_reconstruction->intrinsics;
+ const std::vector<libmv::CameraIntrinsics> *intrinsics = &libmv_reconstruction->intrinsics;
libmv::vector<libmv::Marker> markers = libmv_reconstruction->tracks.MarkersForTrack(track);
int num_reprojected = 0;
double total_error = 0.0;
for (int i = 0; i < markers.size(); ++i) {
- const libmv::EuclideanCamera *camera = reconstruction->CameraForImage(markers[i].camera, markers[i].image);
+ int camera = markers[i].camera;
+ const libmv::EuclideanCamera *camera_pose = reconstruction->CameraForImage(camera, markers[i].image);
const libmv::EuclideanPoint *point = reconstruction->PointForTrack(markers[i].track);
+ const libmv::CameraIntrinsics camera_intrinsics = (*intrinsics)[camera];
- if (!camera || !point) {
+ if (!camera_pose || !point) {
continue;
}
num_reprojected++;
- libmv::Marker reprojected_marker = ProjectMarker(*point, *camera, *intrinsics);
+ libmv::Marker reprojected_marker = ProjectMarker(*point, *camera_pose, camera_intrinsics);
double ex = reprojected_marker.x - markers[i].x;
double ey = reprojected_marker.y - markers[i].y;
@@ -746,7 +761,7 @@
int camera, int image)
{
const libmv::EuclideanReconstruction *reconstruction = &libmv_reconstruction->reconstruction;
- const libmv::CameraIntrinsics *intrinsics = &libmv_reconstruction->intrinsics;
+ const libmv::CameraIntrinsics *intrinsics = &libmv_reconstruction->intrinsics[camera];
libmv::vector<libmv::Marker> markers = libmv_reconstruction->tracks.MarkersInImage(camera, image);
const libmv::EuclideanCamera *camera_pose = reconstruction->CameraForImage(camera, image);
int num_reprojected = 0;
More information about the Bf-blender-cvs
mailing list