File size: 7,146 Bytes
7b7496d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 | // Copyright (c) 2022, ETH Zurich and UNC Chapel Hill.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// * Neither the name of ETH Zurich and UNC Chapel Hill nor the names of
// its contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// Author: Johannes L. Schoenberger (jsch-at-demuc-dot-de)
#ifndef COLMAP_SRC_BASE_ESSENTIAL_MATRIX_H_
#define COLMAP_SRC_BASE_ESSENTIAL_MATRIX_H_
#include <vector>
#include <Eigen/Core>
#include <ceres/ceres.h>
#include "util/alignment.h"
#include "util/types.h"
namespace colmap {
// Decompose an essential matrix into the possible rotations and translations.
//
// The first pose is assumed to be P = [I | 0] and the set of four other
// possible second poses are defined as: {[R1 | t], [R2 | t],
// [R1 | -t], [R2 | -t]}
//
// @param E 3x3 essential matrix.
// @param R1 First possible 3x3 rotation matrix.
// @param R2 Second possible 3x3 rotation matrix.
// @param t 3x1 possible translation vector (also -t possible).
void DecomposeEssentialMatrix(const Eigen::Matrix3d& E, Eigen::Matrix3d* R1,
Eigen::Matrix3d* R2, Eigen::Vector3d* t);
// Recover the most probable pose from the given essential matrix.
//
// The pose of the first image is assumed to be P = [I | 0].
//
// @param E 3x3 essential matrix.
// @param points1 First set of corresponding points.
// @param points2 Second set of corresponding points.
// @param inlier_mask Only points with `true` in the inlier mask are
// considered in the cheirality test. Size of the
// inlier mask must match the number of points N.
// @param R Most probable 3x3 rotation matrix.
// @param t Most probable 3x1 translation vector.
// @param points3D Triangulated 3D points infront of camera.
void PoseFromEssentialMatrix(const Eigen::Matrix3d& E,
const std::vector<Eigen::Vector2d>& points1,
const std::vector<Eigen::Vector2d>& points2,
Eigen::Matrix3d* R, Eigen::Vector3d* t,
std::vector<Eigen::Vector3d>* points3D);
// Compose essential matrix from relative camera poses.
//
// Assumes that first camera pose has projection matrix P = [I | 0], and
// pose of second camera is given as transformation from world to camera system.
//
// @param R 3x3 rotation matrix.
// @param t 3x1 translation vector.
//
// @return 3x3 essential matrix.
Eigen::Matrix3d EssentialMatrixFromPose(const Eigen::Matrix3d& R,
const Eigen::Vector3d& t);
// Compose essential matrix from two absolute camera poses.
//
// @param proj_matrix1 3x4 projection matrix.
// @param proj_matrix2 3x4 projection matrix.
//
// @return 3x3 essential matrix.
Eigen::Matrix3d EssentialMatrixFromAbsolutePoses(
const Eigen::Matrix3x4d& proj_matrix1,
const Eigen::Matrix3x4d& proj_matrix2);
// Find optimal image points, such that:
//
// optimal_point1^t * E * optimal_point2 = 0
//
// as described in:
//
// Lindstrom, P., "Triangulation made easy",
// Computer Vision and Pattern Recognition (CVPR),
// 2010 IEEE Conference on , vol., no., pp.1554,1561, 13-18 June 2010
//
// @param E Essential or fundamental matrix.
// @param point1 Corresponding 2D point in first image.
// @param point2 Corresponding 2D point in second image.
// @param optimal_point1 Estimated optimal image point in the first image.
// @param optimal_point2 Estimated optimal image point in the second image.
void FindOptimalImageObservations(const Eigen::Matrix3d& E,
const Eigen::Vector2d& point1,
const Eigen::Vector2d& point2,
Eigen::Vector2d* optimal_point1,
Eigen::Vector2d* optimal_point2);
// Compute the location of the epipole in homogeneous coordinates.
//
// @param E 3x3 essential matrix.
// @param left_image If true, epipole in left image is computed,
// else in right image.
//
// @return Epipole in homogeneous coordinates.
Eigen::Vector3d EpipoleFromEssentialMatrix(const Eigen::Matrix3d& E,
const bool left_image);
// Invert the essential matrix, i.e. if the essential matrix E describes the
// transformation from camera A to B, the inverted essential matrix E' describes
// the transformation from camera B to A.
//
// @param E 3x3 essential matrix.
//
// @return Inverted essential matrix.
Eigen::Matrix3d InvertEssentialMatrix(const Eigen::Matrix3d& matrix);
// Refine essential matrix.
//
// Decomposes the essential matrix into rotation and translation components
// and refines the relative pose using the function `RefineRelativePose`.
//
// @param E 3x3 essential matrix.
// @param points1 First set of corresponding points.
// @param points2 Second set of corresponding points.
// @param inlier_mask Inlier mask for corresponding points.
// @param options Solver options.
//
// @return Flag indicating if solution is usable.
bool RefineEssentialMatrix(const ceres::Solver::Options& options,
const std::vector<Eigen::Vector2d>& points1,
const std::vector<Eigen::Vector2d>& points2,
const std::vector<char>& inlier_mask,
Eigen::Matrix3d* E);
} // namespace colmap
#endif // COLMAP_SRC_BASE_ESSENTIAL_MATRIX_H_
|