Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/libmv/libmv/simple_pipeline/bundle.cc')
-rw-r--r--intern/libmv/libmv/simple_pipeline/bundle.cc458
1 files changed, 240 insertions, 218 deletions
diff --git a/intern/libmv/libmv/simple_pipeline/bundle.cc b/intern/libmv/libmv/simple_pipeline/bundle.cc
index 25a63c87e1b..e86c3bca57f 100644
--- a/intern/libmv/libmv/simple_pipeline/bundle.cc
+++ b/intern/libmv/libmv/simple_pipeline/bundle.cc
@@ -32,16 +32,16 @@
#include "libmv/multiview/projection.h"
#include "libmv/numeric/numeric.h"
#include "libmv/simple_pipeline/camera_intrinsics.h"
-#include "libmv/simple_pipeline/reconstruction.h"
-#include "libmv/simple_pipeline/tracks.h"
#include "libmv/simple_pipeline/distortion_models.h"
#include "libmv/simple_pipeline/packed_intrinsics.h"
+#include "libmv/simple_pipeline/reconstruction.h"
+#include "libmv/simple_pipeline/tracks.h"
namespace libmv {
namespace {
-bool NeedUseInvertIntrinsicsPipeline(const CameraIntrinsics *intrinsics) {
+bool NeedUseInvertIntrinsicsPipeline(const CameraIntrinsics* intrinsics) {
const DistortionModelType distortion_model =
intrinsics->GetDistortionModelType();
return (distortion_model == DISTORTION_MODEL_NUKE);
@@ -59,12 +59,14 @@ bool NeedUseInvertIntrinsicsPipeline(const CameraIntrinsics *intrinsics) {
// The invariant_intrinsics are used to access intrinsics which are never
// packed into parameter block: for example, distortion model type and image
// dimension.
-template<typename T>
+template <typename T>
void ApplyDistortionModelUsingIntrinsicsBlock(
- const CameraIntrinsics *invariant_intrinsics,
+ const CameraIntrinsics* invariant_intrinsics,
const T* const intrinsics_block,
- const T& normalized_x, const T& normalized_y,
- T* distorted_x, T* distorted_y) {
+ const T& normalized_x,
+ const T& normalized_y,
+ T* distorted_x,
+ T* distorted_y) {
// Unpack the intrinsics.
const T& focal_length =
intrinsics_block[PackedIntrinsics::OFFSET_FOCAL_LENGTH];
@@ -76,65 +78,75 @@ void ApplyDistortionModelUsingIntrinsicsBlock(
// TODO(keir): Do early bailouts for zero distortion; these are expensive
// jet operations.
switch (invariant_intrinsics->GetDistortionModelType()) {
- case DISTORTION_MODEL_POLYNOMIAL:
- {
- const T& k1 = intrinsics_block[PackedIntrinsics::OFFSET_K1];
- const T& k2 = intrinsics_block[PackedIntrinsics::OFFSET_K2];
- const T& k3 = intrinsics_block[PackedIntrinsics::OFFSET_K3];
- const T& p1 = intrinsics_block[PackedIntrinsics::OFFSET_P1];
- const T& p2 = intrinsics_block[PackedIntrinsics::OFFSET_P2];
-
- ApplyPolynomialDistortionModel(focal_length,
- focal_length,
- principal_point_x,
- principal_point_y,
- k1, k2, k3,
- p1, p2,
- normalized_x, normalized_y,
- distorted_x, distorted_y);
- return;
- }
-
- case DISTORTION_MODEL_DIVISION:
- {
- const T& k1 = intrinsics_block[PackedIntrinsics::OFFSET_K1];
- const T& k2 = intrinsics_block[PackedIntrinsics::OFFSET_K2];
-
- ApplyDivisionDistortionModel(focal_length,
+ case DISTORTION_MODEL_POLYNOMIAL: {
+ const T& k1 = intrinsics_block[PackedIntrinsics::OFFSET_K1];
+ const T& k2 = intrinsics_block[PackedIntrinsics::OFFSET_K2];
+ const T& k3 = intrinsics_block[PackedIntrinsics::OFFSET_K3];
+ const T& p1 = intrinsics_block[PackedIntrinsics::OFFSET_P1];
+ const T& p2 = intrinsics_block[PackedIntrinsics::OFFSET_P2];
+
+ ApplyPolynomialDistortionModel(focal_length,
focal_length,
principal_point_x,
principal_point_y,
- k1, k2,
- normalized_x, normalized_y,
- distorted_x, distorted_y);
- return;
- }
+ k1,
+ k2,
+ k3,
+ p1,
+ p2,
+ normalized_x,
+ normalized_y,
+ distorted_x,
+ distorted_y);
+ return;
+ }
- case DISTORTION_MODEL_NUKE:
- {
- LOG(FATAL) << "Unsupported distortion model.";
- return;
- }
+ case DISTORTION_MODEL_DIVISION: {
+ const T& k1 = intrinsics_block[PackedIntrinsics::OFFSET_K1];
+ const T& k2 = intrinsics_block[PackedIntrinsics::OFFSET_K2];
+
+ ApplyDivisionDistortionModel(focal_length,
+ focal_length,
+ principal_point_x,
+ principal_point_y,
+ k1,
+ k2,
+ normalized_x,
+ normalized_y,
+ distorted_x,
+ distorted_y);
+ return;
+ }
- case DISTORTION_MODEL_BROWN:
- {
- const T& k1 = intrinsics_block[PackedIntrinsics::OFFSET_K1];
- const T& k2 = intrinsics_block[PackedIntrinsics::OFFSET_K2];
- const T& k3 = intrinsics_block[PackedIntrinsics::OFFSET_K3];
- const T& k4 = intrinsics_block[PackedIntrinsics::OFFSET_K4];
- const T& p1 = intrinsics_block[PackedIntrinsics::OFFSET_P1];
- const T& p2 = intrinsics_block[PackedIntrinsics::OFFSET_P2];
-
- ApplyBrownDistortionModel(focal_length,
- focal_length,
- principal_point_x,
- principal_point_y,
- k1, k2, k3, k4,
- p1, p2,
- normalized_x, normalized_y,
- distorted_x, distorted_y);
- return;
- }
+ case DISTORTION_MODEL_NUKE: {
+ LOG(FATAL) << "Unsupported distortion model.";
+ return;
+ }
+
+ case DISTORTION_MODEL_BROWN: {
+ const T& k1 = intrinsics_block[PackedIntrinsics::OFFSET_K1];
+ const T& k2 = intrinsics_block[PackedIntrinsics::OFFSET_K2];
+ const T& k3 = intrinsics_block[PackedIntrinsics::OFFSET_K3];
+ const T& k4 = intrinsics_block[PackedIntrinsics::OFFSET_K4];
+ const T& p1 = intrinsics_block[PackedIntrinsics::OFFSET_P1];
+ const T& p2 = intrinsics_block[PackedIntrinsics::OFFSET_P2];
+
+ ApplyBrownDistortionModel(focal_length,
+ focal_length,
+ principal_point_x,
+ principal_point_y,
+ k1,
+ k2,
+ k3,
+ k4,
+ p1,
+ p2,
+ normalized_x,
+ normalized_y,
+ distorted_x,
+ distorted_y);
+ return;
+ }
}
LOG(FATAL) << "Unknown distortion model.";
@@ -152,12 +164,14 @@ void ApplyDistortionModelUsingIntrinsicsBlock(
// The invariant_intrinsics are used to access intrinsics which are never
// packed into parameter block: for example, distortion model type and image
// dimension.
-template<typename T>
+template <typename T>
void InvertDistortionModelUsingIntrinsicsBlock(
- const CameraIntrinsics *invariant_intrinsics,
+ const CameraIntrinsics* invariant_intrinsics,
const T* const intrinsics_block,
- const T& image_x, const T& image_y,
- T* normalized_x, T* normalized_y) {
+ const T& image_x,
+ const T& image_y,
+ T* normalized_x,
+ T* normalized_y) {
// Unpack the intrinsics.
const T& focal_length =
intrinsics_block[PackedIntrinsics::OFFSET_FOCAL_LENGTH];
@@ -175,31 +189,35 @@ void InvertDistortionModelUsingIntrinsicsBlock(
LOG(FATAL) << "Unsupported distortion model.";
return;
- case DISTORTION_MODEL_NUKE:
- {
- const T& k1 = intrinsics_block[PackedIntrinsics::OFFSET_K1];
- const T& k2 = intrinsics_block[PackedIntrinsics::OFFSET_K2];
-
- InvertNukeDistortionModel(focal_length,
- focal_length,
- principal_point_x,
- principal_point_y,
- invariant_intrinsics->image_width(),
- invariant_intrinsics->image_height(),
- k1, k2,
- image_x, image_y,
- normalized_x, normalized_y);
- return;
- }
+ case DISTORTION_MODEL_NUKE: {
+ const T& k1 = intrinsics_block[PackedIntrinsics::OFFSET_K1];
+ const T& k2 = intrinsics_block[PackedIntrinsics::OFFSET_K2];
+
+ InvertNukeDistortionModel(focal_length,
+ focal_length,
+ principal_point_x,
+ principal_point_y,
+ invariant_intrinsics->image_width(),
+ invariant_intrinsics->image_height(),
+ k1,
+ k2,
+ image_x,
+ image_y,
+ normalized_x,
+ normalized_y);
+ return;
+ }
}
LOG(FATAL) << "Unknown distortion model.";
}
-template<typename T>
+template <typename T>
void NormalizedToImageSpace(const T* const intrinsics_block,
- const T& normalized_x, const T& normalized_y,
- T* image_x, T* image_y) {
+ const T& normalized_x,
+ const T& normalized_y,
+ T* image_x,
+ T* image_y) {
// Unpack the intrinsics.
const T& focal_length =
intrinsics_block[PackedIntrinsics::OFFSET_FOCAL_LENGTH];
@@ -219,11 +237,10 @@ void NormalizedToImageSpace(const T* const intrinsics_block,
// This functor can only be used for distortion models which have analytically
// defined Apply() function.
struct ReprojectionErrorApplyIntrinsics {
- ReprojectionErrorApplyIntrinsics(
- const CameraIntrinsics *invariant_intrinsics,
- const double observed_distorted_x,
- const double observed_distorted_y,
- const double weight)
+ ReprojectionErrorApplyIntrinsics(const CameraIntrinsics* invariant_intrinsics,
+ const double observed_distorted_x,
+ const double observed_distorted_y,
+ const double weight)
: invariant_intrinsics_(invariant_intrinsics),
observed_distorted_x_(observed_distorted_x),
observed_distorted_y_(observed_distorted_y),
@@ -253,11 +270,12 @@ struct ReprojectionErrorApplyIntrinsics {
T yn = x[1] / x[2];
T predicted_distorted_x, predicted_distorted_y;
- ApplyDistortionModelUsingIntrinsicsBlock(
- invariant_intrinsics_,
- intrinsics,
- xn, yn,
- &predicted_distorted_x, &predicted_distorted_y);
+ ApplyDistortionModelUsingIntrinsicsBlock(invariant_intrinsics_,
+ intrinsics,
+ xn,
+ yn,
+ &predicted_distorted_x,
+ &predicted_distorted_y);
// The error is the difference between the predicted and observed position.
residuals[0] = (predicted_distorted_x - T(observed_distorted_x_)) * weight_;
@@ -265,7 +283,7 @@ struct ReprojectionErrorApplyIntrinsics {
return true;
}
- const CameraIntrinsics *invariant_intrinsics_;
+ const CameraIntrinsics* invariant_intrinsics_;
const double observed_distorted_x_;
const double observed_distorted_y_;
const double weight_;
@@ -279,7 +297,7 @@ struct ReprojectionErrorApplyIntrinsics {
// defined Invert() function.
struct ReprojectionErrorInvertIntrinsics {
ReprojectionErrorInvertIntrinsics(
- const CameraIntrinsics *invariant_intrinsics,
+ const CameraIntrinsics* invariant_intrinsics,
const double observed_distorted_x,
const double observed_distorted_y,
const double weight)
@@ -295,8 +313,7 @@ struct ReprojectionErrorInvertIntrinsics {
const T* const X, // Point coordinates 3x1.
T* residuals) const {
// Unpack the intrinsics.
- const T& focal_length =
- intrinsics[PackedIntrinsics::OFFSET_FOCAL_LENGTH];
+ const T& focal_length = intrinsics[PackedIntrinsics::OFFSET_FOCAL_LENGTH];
const T& principal_point_x =
intrinsics[PackedIntrinsics::OFFSET_PRINCIPAL_POINT_X];
const T& principal_point_y =
@@ -327,14 +344,17 @@ struct ReprojectionErrorInvertIntrinsics {
InvertDistortionModelUsingIntrinsicsBlock(
invariant_intrinsics_,
intrinsics,
- T(observed_distorted_x_), T(observed_distorted_y_),
- &observed_undistorted_normalized_x, &observed_undistorted_normalized_y);
+ T(observed_distorted_x_),
+ T(observed_distorted_y_),
+ &observed_undistorted_normalized_x,
+ &observed_undistorted_normalized_y);
T observed_undistorted_image_x, observed_undistorted_image_y;
- NormalizedToImageSpace(
- intrinsics,
- observed_undistorted_normalized_x, observed_undistorted_normalized_y,
- &observed_undistorted_image_x, &observed_undistorted_image_y);
+ NormalizedToImageSpace(intrinsics,
+ observed_undistorted_normalized_x,
+ observed_undistorted_normalized_y,
+ &observed_undistorted_image_x,
+ &observed_undistorted_image_y);
// The error is the difference between the predicted and observed position.
residuals[0] = (predicted_x - observed_undistorted_image_x) * weight_;
@@ -343,7 +363,7 @@ struct ReprojectionErrorInvertIntrinsics {
return true;
}
- const CameraIntrinsics *invariant_intrinsics_;
+ const CameraIntrinsics* invariant_intrinsics_;
const double observed_distorted_x_;
const double observed_distorted_y_;
const double weight_;
@@ -356,22 +376,23 @@ void BundleIntrinsicsLogMessage(const int bundle_intrinsics) {
} else {
std::string bundling_message = "";
-#define APPEND_BUNDLING_INTRINSICS(name, flag) \
- if (bundle_intrinsics & flag) { \
- if (!bundling_message.empty()) { \
- bundling_message += ", "; \
- } \
- bundling_message += name; \
- } (void)0
+#define APPEND_BUNDLING_INTRINSICS(name, flag) \
+ if (bundle_intrinsics & flag) { \
+ if (!bundling_message.empty()) { \
+ bundling_message += ", "; \
+ } \
+ bundling_message += name; \
+ } \
+ (void)0
- APPEND_BUNDLING_INTRINSICS("f", BUNDLE_FOCAL_LENGTH);
+ APPEND_BUNDLING_INTRINSICS("f", BUNDLE_FOCAL_LENGTH);
APPEND_BUNDLING_INTRINSICS("px, py", BUNDLE_PRINCIPAL_POINT);
- APPEND_BUNDLING_INTRINSICS("k1", BUNDLE_RADIAL_K1);
- APPEND_BUNDLING_INTRINSICS("k2", BUNDLE_RADIAL_K2);
- APPEND_BUNDLING_INTRINSICS("k3", BUNDLE_RADIAL_K3);
- APPEND_BUNDLING_INTRINSICS("k4", BUNDLE_RADIAL_K4);
- APPEND_BUNDLING_INTRINSICS("p1", BUNDLE_TANGENTIAL_P1);
- APPEND_BUNDLING_INTRINSICS("p2", BUNDLE_TANGENTIAL_P2);
+ APPEND_BUNDLING_INTRINSICS("k1", BUNDLE_RADIAL_K1);
+ APPEND_BUNDLING_INTRINSICS("k2", BUNDLE_RADIAL_K2);
+ APPEND_BUNDLING_INTRINSICS("k3", BUNDLE_RADIAL_K3);
+ APPEND_BUNDLING_INTRINSICS("k4", BUNDLE_RADIAL_K4);
+ APPEND_BUNDLING_INTRINSICS("p1", BUNDLE_TANGENTIAL_P1);
+ APPEND_BUNDLING_INTRINSICS("p2", BUNDLE_TANGENTIAL_P2);
LG << "Bundling " << bundling_message << ".";
}
@@ -383,7 +404,7 @@ void BundleIntrinsicsLogMessage(const int bundle_intrinsics) {
// Element with key i matches to a rotation+translation for
// camera at image i.
map<int, Vec6> PackCamerasRotationAndTranslation(
- const EuclideanReconstruction &reconstruction) {
+ const EuclideanReconstruction& reconstruction) {
map<int, Vec6> all_cameras_R_t;
vector<EuclideanCamera> all_cameras = reconstruction.AllCameras();
@@ -399,14 +420,13 @@ map<int, Vec6> PackCamerasRotationAndTranslation(
// Convert cameras rotations fro mangle axis back to rotation matrix.
void UnpackCamerasRotationAndTranslation(
- const map<int, Vec6> &all_cameras_R_t,
- EuclideanReconstruction *reconstruction) {
-
+ const map<int, Vec6>& all_cameras_R_t,
+ EuclideanReconstruction* reconstruction) {
for (map<int, Vec6>::value_type image_and_camera_R_T : all_cameras_R_t) {
const int image = image_and_camera_R_T.first;
const Vec6& camera_R_t = image_and_camera_R_T.second;
- EuclideanCamera *camera = reconstruction->CameraForImage(image);
+ EuclideanCamera* camera = reconstruction->CameraForImage(image);
if (!camera) {
continue;
}
@@ -421,8 +441,8 @@ void UnpackCamerasRotationAndTranslation(
//
// TODO(sergey): currently uses dense Eigen matrices, best would
// be to use sparse Eigen matrices
-void CRSMatrixToEigenMatrix(const ceres::CRSMatrix &crs_matrix,
- Mat *eigen_matrix) {
+void CRSMatrixToEigenMatrix(const ceres::CRSMatrix& crs_matrix,
+ Mat* eigen_matrix) {
eigen_matrix->resize(crs_matrix.num_rows, crs_matrix.num_cols);
eigen_matrix->setZero();
@@ -439,11 +459,11 @@ void CRSMatrixToEigenMatrix(const ceres::CRSMatrix &crs_matrix,
}
}
-void EuclideanBundlerPerformEvaluation(const Tracks &tracks,
- EuclideanReconstruction *reconstruction,
- map<int, Vec6> *all_cameras_R_t,
- ceres::Problem *problem,
- BundleEvaluation *evaluation) {
+void EuclideanBundlerPerformEvaluation(const Tracks& tracks,
+ EuclideanReconstruction* reconstruction,
+ map<int, Vec6>* all_cameras_R_t,
+ ceres::Problem* problem,
+ BundleEvaluation* evaluation) {
int max_track = tracks.MaxTrack();
// Number of camera rotations equals to number of translation,
int num_cameras = all_cameras_R_t->size();
@@ -451,7 +471,7 @@ void EuclideanBundlerPerformEvaluation(const Tracks &tracks,
vector<EuclideanPoint*> minimized_points;
for (int i = 0; i <= max_track; i++) {
- EuclideanPoint *point = reconstruction->PointForTrack(i);
+ EuclideanPoint* point = reconstruction->PointForTrack(i);
if (point) {
// We need to know whether the track is a constant zero weight.
// If it is so it wouldn't have a parameter block in the problem.
@@ -477,16 +497,16 @@ void EuclideanBundlerPerformEvaluation(const Tracks &tracks,
evaluation->num_cameras = num_cameras;
evaluation->num_points = num_points;
- if (evaluation->evaluate_jacobian) { // Evaluate jacobian matrix.
+ if (evaluation->evaluate_jacobian) { // Evaluate jacobian matrix.
ceres::CRSMatrix evaluated_jacobian;
ceres::Problem::EvaluateOptions eval_options;
// Cameras goes first in the ordering.
int max_image = tracks.MaxImage();
for (int i = 0; i <= max_image; i++) {
- const EuclideanCamera *camera = reconstruction->CameraForImage(i);
+ const EuclideanCamera* camera = reconstruction->CameraForImage(i);
if (camera) {
- double *current_camera_R_t = &(*all_cameras_R_t)[i](0);
+ double* current_camera_R_t = &(*all_cameras_R_t)[i](0);
// All cameras are variable now.
problem->SetParameterBlockVariable(current_camera_R_t);
@@ -497,63 +517,65 @@ void EuclideanBundlerPerformEvaluation(const Tracks &tracks,
// Points goes at the end of ordering,
for (int i = 0; i < minimized_points.size(); i++) {
- EuclideanPoint *point = minimized_points.at(i);
+ EuclideanPoint* point = minimized_points.at(i);
eval_options.parameter_blocks.push_back(&point->X(0));
}
- problem->Evaluate(eval_options,
- NULL, NULL, NULL,
- &evaluated_jacobian);
+ problem->Evaluate(eval_options, NULL, NULL, NULL, &evaluated_jacobian);
CRSMatrixToEigenMatrix(evaluated_jacobian, &evaluation->jacobian);
}
}
-template<typename CostFunction>
-void AddResidualBlockToProblemImpl(const CameraIntrinsics *invariant_intrinsics,
- double observed_x, double observed_y,
+template <typename CostFunction>
+void AddResidualBlockToProblemImpl(const CameraIntrinsics* invariant_intrinsics,
+ double observed_x,
+ double observed_y,
double weight,
- double *intrinsics_block,
- double *camera_R_t,
- EuclideanPoint *point,
+ double* intrinsics_block,
+ double* camera_R_t,
+ EuclideanPoint* point,
ceres::Problem* problem) {
- problem->AddResidualBlock(new ceres::AutoDiffCostFunction<
- CostFunction, 2, PackedIntrinsics::NUM_PARAMETERS, 6, 3>(
- new CostFunction(
- invariant_intrinsics,
- observed_x, observed_y,
- weight)),
+ problem->AddResidualBlock(
+ new ceres::AutoDiffCostFunction<CostFunction,
+ 2,
+ PackedIntrinsics::NUM_PARAMETERS,
+ 6,
+ 3>(new CostFunction(
+ invariant_intrinsics, observed_x, observed_y, weight)),
NULL,
intrinsics_block,
camera_R_t,
&point->X(0));
}
-void AddResidualBlockToProblem(const CameraIntrinsics *invariant_intrinsics,
- const Marker &marker,
+void AddResidualBlockToProblem(const CameraIntrinsics* invariant_intrinsics,
+ const Marker& marker,
double marker_weight,
double* intrinsics_block,
- double *camera_R_t,
- EuclideanPoint *point,
+ double* camera_R_t,
+ EuclideanPoint* point,
ceres::Problem* problem) {
if (NeedUseInvertIntrinsicsPipeline(invariant_intrinsics)) {
AddResidualBlockToProblemImpl<ReprojectionErrorInvertIntrinsics>(
- invariant_intrinsics,
- marker.x, marker.y,
- marker_weight,
- intrinsics_block,
- camera_R_t,
- point,
- problem);
+ invariant_intrinsics,
+ marker.x,
+ marker.y,
+ marker_weight,
+ intrinsics_block,
+ camera_R_t,
+ point,
+ problem);
} else {
AddResidualBlockToProblemImpl<ReprojectionErrorApplyIntrinsics>(
- invariant_intrinsics,
- marker.x, marker.y,
- marker_weight,
- intrinsics_block,
- camera_R_t,
- point,
- problem);
+ invariant_intrinsics,
+ marker.x,
+ marker.y,
+ marker_weight,
+ intrinsics_block,
+ camera_R_t,
+ point,
+ problem);
}
}
@@ -566,25 +588,25 @@ void AddResidualBlockToProblem(const CameraIntrinsics *invariant_intrinsics,
//
// At this point we only need to bundle points positions, cameras
// are to be totally still here.
-void EuclideanBundlePointsOnly(const CameraIntrinsics *invariant_intrinsics,
- const vector<Marker> &markers,
- map<int, Vec6> &all_cameras_R_t,
+void EuclideanBundlePointsOnly(const CameraIntrinsics* invariant_intrinsics,
+ const vector<Marker>& markers,
+ map<int, Vec6>& all_cameras_R_t,
double* intrinsics_block,
- EuclideanReconstruction *reconstruction) {
+ EuclideanReconstruction* reconstruction) {
ceres::Problem::Options problem_options;
ceres::Problem problem(problem_options);
int num_residuals = 0;
for (int i = 0; i < markers.size(); ++i) {
- const Marker &marker = markers[i];
- EuclideanCamera *camera = reconstruction->CameraForImage(marker.image);
- EuclideanPoint *point = reconstruction->PointForTrack(marker.track);
+ const Marker& marker = markers[i];
+ EuclideanCamera* camera = reconstruction->CameraForImage(marker.image);
+ EuclideanPoint* point = reconstruction->PointForTrack(marker.track);
if (camera == NULL || point == NULL) {
continue;
}
// Rotation of camera denoted in angle axis followed with
// camera translation.
- double *current_camera_R_t = &all_cameras_R_t[camera->image](0);
+ double* current_camera_R_t = &all_cameras_R_t[camera->image](0);
AddResidualBlockToProblem(invariant_intrinsics,
marker,
@@ -625,8 +647,8 @@ void EuclideanBundlePointsOnly(const CameraIntrinsics *invariant_intrinsics,
} // namespace
-void EuclideanBundle(const Tracks &tracks,
- EuclideanReconstruction *reconstruction) {
+void EuclideanBundle(const Tracks& tracks,
+ EuclideanReconstruction* reconstruction) {
PolynomialCameraIntrinsics empty_intrinsics;
EuclideanBundleCommonIntrinsics(tracks,
BUNDLE_NO_INTRINSICS,
@@ -636,13 +658,12 @@ void EuclideanBundle(const Tracks &tracks,
NULL);
}
-void EuclideanBundleCommonIntrinsics(
- const Tracks &tracks,
- const int bundle_intrinsics,
- const int bundle_constraints,
- EuclideanReconstruction *reconstruction,
- CameraIntrinsics *intrinsics,
- BundleEvaluation *evaluation) {
+void EuclideanBundleCommonIntrinsics(const Tracks& tracks,
+ const int bundle_intrinsics,
+ const int bundle_constraints,
+ EuclideanReconstruction* reconstruction,
+ CameraIntrinsics* intrinsics,
+ BundleEvaluation* evaluation) {
LG << "Original intrinsics: " << *intrinsics;
vector<Marker> markers = tracks.AllMarkers();
@@ -661,19 +682,19 @@ void EuclideanBundleCommonIntrinsics(
// Block for minimization has got the following structure:
// <3 elements for angle-axis> <3 elements for translation>
map<int, Vec6> all_cameras_R_t =
- PackCamerasRotationAndTranslation(*reconstruction);
+ PackCamerasRotationAndTranslation(*reconstruction);
// Parameterization used to restrict camera motion for modal solvers.
- ceres::SubsetParameterization *constant_translation_parameterization = NULL;
+ ceres::SubsetParameterization* constant_translation_parameterization = NULL;
if (bundle_constraints & BUNDLE_NO_TRANSLATION) {
- std::vector<int> constant_translation;
+ std::vector<int> constant_translation;
- // First three elements are rotation, ast three are translation.
- constant_translation.push_back(3);
- constant_translation.push_back(4);
- constant_translation.push_back(5);
+ // First three elements are rotation, ast three are translation.
+ constant_translation.push_back(3);
+ constant_translation.push_back(4);
+ constant_translation.push_back(5);
- constant_translation_parameterization =
+ constant_translation_parameterization =
new ceres::SubsetParameterization(6, constant_translation);
}
@@ -683,16 +704,16 @@ void EuclideanBundleCommonIntrinsics(
int num_residuals = 0;
bool have_locked_camera = false;
for (int i = 0; i < markers.size(); ++i) {
- const Marker &marker = markers[i];
- EuclideanCamera *camera = reconstruction->CameraForImage(marker.image);
- EuclideanPoint *point = reconstruction->PointForTrack(marker.track);
+ const Marker& marker = markers[i];
+ EuclideanCamera* camera = reconstruction->CameraForImage(marker.image);
+ EuclideanPoint* point = reconstruction->PointForTrack(marker.track);
if (camera == NULL || point == NULL) {
continue;
}
// Rotation of camera denoted in angle axis followed with
// camera translation.
- double *current_camera_R_t = &all_cameras_R_t[camera->image](0);
+ double* current_camera_R_t = &all_cameras_R_t[camera->image](0);
// Skip residual block for markers which does have absolutely
// no affect on the final solution.
@@ -706,7 +727,8 @@ void EuclideanBundleCommonIntrinsics(
point,
&problem);
- // We lock the first camera to better deal with scene orientation ambiguity.
+ // We lock the first camera to better deal with scene orientation
+ // ambiguity.
if (!have_locked_camera) {
problem.SetParameterBlockConstant(current_camera_R_t);
have_locked_camera = true;
@@ -729,7 +751,7 @@ void EuclideanBundleCommonIntrinsics(
}
if (intrinsics->GetDistortionModelType() == DISTORTION_MODEL_DIVISION &&
- (bundle_intrinsics & BUNDLE_TANGENTIAL) != 0) {
+ (bundle_intrinsics & BUNDLE_TANGENTIAL) != 0) {
LOG(FATAL) << "Division model doesn't support bundling "
"of tangential distortion";
}
@@ -745,29 +767,29 @@ void EuclideanBundleCommonIntrinsics(
// constant using some macro trickery.
std::vector<int> constant_intrinsics;
-#define MAYBE_SET_CONSTANT(bundle_enum, offset) \
- if (!(bundle_intrinsics & bundle_enum) || \
- !packed_intrinsics.IsParameterDefined(offset)) { \
- constant_intrinsics.push_back(offset); \
- }
+#define MAYBE_SET_CONSTANT(bundle_enum, offset) \
+ if (!(bundle_intrinsics & bundle_enum) || \
+ !packed_intrinsics.IsParameterDefined(offset)) { \
+ constant_intrinsics.push_back(offset); \
+ }
MAYBE_SET_CONSTANT(BUNDLE_FOCAL_LENGTH,
PackedIntrinsics::OFFSET_FOCAL_LENGTH);
MAYBE_SET_CONSTANT(BUNDLE_PRINCIPAL_POINT,
PackedIntrinsics::OFFSET_PRINCIPAL_POINT_X);
MAYBE_SET_CONSTANT(BUNDLE_PRINCIPAL_POINT,
PackedIntrinsics::OFFSET_PRINCIPAL_POINT_Y);
- MAYBE_SET_CONSTANT(BUNDLE_RADIAL_K1, PackedIntrinsics::OFFSET_K1);
- MAYBE_SET_CONSTANT(BUNDLE_RADIAL_K2, PackedIntrinsics::OFFSET_K2);
- MAYBE_SET_CONSTANT(BUNDLE_RADIAL_K3, PackedIntrinsics::OFFSET_K3);
- MAYBE_SET_CONSTANT(BUNDLE_RADIAL_K4, PackedIntrinsics::OFFSET_K4);
- MAYBE_SET_CONSTANT(BUNDLE_TANGENTIAL_P1, PackedIntrinsics::OFFSET_P1);
- MAYBE_SET_CONSTANT(BUNDLE_TANGENTIAL_P2, PackedIntrinsics::OFFSET_P2);
+ MAYBE_SET_CONSTANT(BUNDLE_RADIAL_K1, PackedIntrinsics::OFFSET_K1);
+ MAYBE_SET_CONSTANT(BUNDLE_RADIAL_K2, PackedIntrinsics::OFFSET_K2);
+ MAYBE_SET_CONSTANT(BUNDLE_RADIAL_K3, PackedIntrinsics::OFFSET_K3);
+ MAYBE_SET_CONSTANT(BUNDLE_RADIAL_K4, PackedIntrinsics::OFFSET_K4);
+ MAYBE_SET_CONSTANT(BUNDLE_TANGENTIAL_P1, PackedIntrinsics::OFFSET_P1);
+ MAYBE_SET_CONSTANT(BUNDLE_TANGENTIAL_P2, PackedIntrinsics::OFFSET_P2);
#undef MAYBE_SET_CONSTANT
if (!constant_intrinsics.empty()) {
- ceres::SubsetParameterization *subset_parameterization =
- new ceres::SubsetParameterization(PackedIntrinsics::NUM_PARAMETERS,
- constant_intrinsics);
+ ceres::SubsetParameterization* subset_parameterization =
+ new ceres::SubsetParameterization(PackedIntrinsics::NUM_PARAMETERS,
+ constant_intrinsics);
problem.SetParameterization(intrinsics_block, subset_parameterization);
}
@@ -800,8 +822,8 @@ void EuclideanBundleCommonIntrinsics(
LG << "Final intrinsics: " << *intrinsics;
if (evaluation) {
- EuclideanBundlerPerformEvaluation(tracks, reconstruction, &all_cameras_R_t,
- &problem, evaluation);
+ EuclideanBundlerPerformEvaluation(
+ tracks, reconstruction, &all_cameras_R_t, &problem, evaluation);
}
// Separate step to adjust positions of tracks which are
@@ -828,8 +850,8 @@ void EuclideanBundleCommonIntrinsics(
}
}
-void ProjectiveBundle(const Tracks & /*tracks*/,
- ProjectiveReconstruction * /*reconstruction*/) {
+void ProjectiveBundle(const Tracks& /*tracks*/,
+ ProjectiveReconstruction* /*reconstruction*/) {
// TODO(keir): Implement this! This can't work until we have a better bundler
// than SSBA, since SSBA has no support for projective bundling.
}