ippe.h
Go to the documentation of this file.
1 
18 // This is the core header file for IPPE. Infinitesimal Plane-based Pose Estimation (IPPE)
19 // is a very fast and accurate way to compute a camera's pose from a single image of a
20 // planar object using point correspondences. This has uses in several applications,
21 // including augmented reality, 3D tracking and pose estimation with planar markers, and
22 // 3D scene understanding. This package is free and covered by the BSD licence without any
23 // warranty. We hope you find this code useful and if so please cite our paper in your
24 // work:
25 
26 //@article{ year={2014}, issn={0920-5691}, journal={International Journal of Computer
27 //Vision}, volume={109}, number={3}, doi={10.1007/s11263-014-0725-5}, title={Infinitesimal
28 // Plane-Based Pose Estimation}, url={http://dx.doi.org/10.1007/s11263-014-0725-5},
29 // publisher={Springer US}, keywords={Plane; Pose; SfM; PnP; Homography}, author={Collins,
30 // Toby and Bartoli, Adrien}, pages={252-286}, language={English} }
31 
32 // Please contact Toby (toby.collins@gmail.com) if you have any questions about the code, paper and IPPE.
33 
34 
35 #ifndef _IPPE_H_
36 #define _IPPE_H_
37 
38 #include <opencv2/core.hpp>
39 #include <opencv2/calib3d.hpp>
40 #include "aruco_export.h"
41 #include <limits>
42 
43 #define IPPE_SMALL 1e-7 // a small constant used to test 'small' values close to zero.
44 
45 namespace aruco
46 {
47 // returns the two solutions
48 std::vector<cv::Mat> solvePnP(const std::vector<cv::Point3f>& objPoints,
49  const std::vector<cv::Point2f>& imgPoints,
50  cv::InputArray cameraMatrix, cv::InputArray distCoeffs);
51 void solvePnP(const std::vector<cv::Point3f>& objPoints,
52  const std::vector<cv::Point2f>& imgPoints, cv::InputArray cameraMatrix,
53  cv::InputArray distCoeffs, cv::Mat& rvec, cv::Mat& tvec);
54 ARUCO_EXPORT std::vector<std::pair<cv::Mat, double>> solvePnP_(
55  float size, const std::vector<cv::Point2f>& imgPoints, cv::InputArray cameraMatrix,
56  cv::InputArray distCoeffs);
57 
58 std::vector<std::pair<cv::Mat, double>> solvePnP_(const std::vector<cv::Point3f>& objPoints,
59  const std::vector<cv::Point2f>& imgPoints,
60  cv::InputArray cameraMatrix,
61  cv::InputArray distCoeffs);
62 
63 } // namespace aruco
64 namespace IPPE
65 {
66 
68 {
69 public:
73  PoseSolver();
74 
78  ~PoseSolver();
79 
99  void solveGeneric(cv::InputArray _objectPoints, cv::InputArray _imagePoints,
100  cv::InputArray _cameraMatrix, cv::InputArray _distCoeffs,
101  cv::OutputArray _rvec1, cv::OutputArray _tvec1, float& reprojErr1,
102  cv::OutputArray _rvec2, cv::OutputArray _tvec2, float& reprojErr2);
103 
123  void solveSquare(double squareLength, cv::InputArray _imagePoints,
124  cv::InputArray _cameraMatrix, cv::InputArray _distCoeffs,
125  cv::OutputArray _rvec1, cv::OutputArray _tvec1, float& reprojErr1,
126  cv::OutputArray _rvec2, cv::OutputArray _tvec2, float& reprojErr2);
127 
134  void generateSquareObjectCorners3D(double squareLength, cv::OutputArray _objectPoints);
135 
143  void generateSquareObjectCorners2D(double squareLength, cv::OutputArray _objectPoints);
144 
153  double meanSceneDepth(cv::InputArray objectPoints, cv::InputArray rvec, cv::InputArray tvec);
154 
155 private:
168  void solveGeneric(cv::InputArray _objectPoints, cv::InputArray _normalizedImagePoints,
169  cv::OutputArray _Ma, cv::OutputArray _Mb);
170 
184  void solveCanonicalForm(cv::InputArray _canonicalObjPoints, cv::InputArray _normalizedInputPoints,
185  cv::InputArray _H, cv::OutputArray _Ma, cv::OutputArray _Mb);
186 
195  void computeTranslation(cv::InputArray _objectPoints, cv::InputArray _normalizedImgPoints,
196  cv::InputArray _R, cv::OutputArray _t);
197 
213  void computeRotations(double j00, double j01, double j10, double j11, double p,
214  double q, cv::OutputArray _R1, cv::OutputArray _R2);
215 
227  void homographyFromSquarePoints(cv::InputArray _targetPoints, double halfLength,
228  cv::OutputArray _H);
229 
235  void rot2vec(cv::InputArray _R, cv::OutputArray _r);
236 
246  void makeCanonicalObjectPoints(cv::InputArray _objectPoints,
247  cv::OutputArray _canonicalObjectPoints,
248  cv::OutputArray _MobjectPoints2Canonical);
249 
268  void evalReprojError(cv::InputArray _objectPoints, cv::InputArray _imagePoints,
269  cv::InputArray _cameraMatrix, cv::InputArray _distCoeffs,
270  cv::InputArray _M, float& err);
271 
295  void sortPosesByReprojError(cv::InputArray _objectPoints, cv::InputArray _imagePoints,
296  cv::InputArray _cameraMatrix, cv::InputArray _distCoeffs,
297  cv::InputArray _Ma, cv::InputArray _Mb, cv::OutputArray _M1,
298  cv::OutputArray _M2, float& err1, float& err2);
299 
306  void rotateVec2ZAxis(cv::InputArray _a, cv::OutputArray _Ra);
307 
308 
317  bool computeObjextSpaceR3Pts(cv::InputArray _objectPoints, cv::OutputArray _R);
318 
326  bool computeObjextSpaceRSvD(cv::InputArray _objectPointsZeroMean, cv::OutputArray _R);
327 };
328 } // namespace IPPE
329 
330 namespace HomographyHO
331 {
332 
343 void homographyHO(cv::InputArray srcPoints, cv::InputArray targPoints, cv::OutputArray H);
344 
356 void normalizeDataIsotropic(cv::InputArray Data, cv::OutputArray DataN, cv::OutputArray T,
357  cv::OutputArray Ti);
358 } // namespace HomographyHO
359 
360 #endif
IPPE::PoseSolver::rot2vec
void rot2vec(cv::InputArray _R, cv::OutputArray _r)
Fast conversion from a rotation matrix to a rotation vector using Rodrigues' formula.
Definition: ippe.cpp:409
IPPE::PoseSolver::PoseSolver
PoseSolver()
PoseSolver constructor.
Definition: ippe.cpp:151
HomographyHO::normalizeDataIsotropic
void normalizeDataIsotropic(cv::InputArray Data, cv::OutputArray DataN, cv::OutputArray T, cv::OutputArray Ti)
Performs data normalization before homography estimation. For details see Hartley,...
Definition: ippe.cpp:923
IPPE::PoseSolver
Definition: ippe.h:67
aruco::solvePnP_
ARUCO_EXPORT std::vector< std::pair< cv::Mat, double > > solvePnP_(float size, const std::vector< cv::Point2f > &imgPoints, cv::InputArray cameraMatrix, cv::InputArray distCoeffs)
Definition: ippe.cpp:115
IPPE::PoseSolver::homographyFromSquarePoints
void homographyFromSquarePoints(cv::InputArray _targetPoints, double halfLength, cv::OutputArray _H)
Closed-form solution for the homography mapping with four corner correspondences of a square (it maps...
Definition: ippe.cpp:660
IPPE::PoseSolver::~PoseSolver
~PoseSolver()
PoseSolver destructor.
Definition: ippe.cpp:155
IPPE::PoseSolver::makeCanonicalObjectPoints
void makeCanonicalObjectPoints(cv::InputArray _objectPoints, cv::OutputArray _canonicalObjectPoints, cv::OutputArray _MobjectPoints2Canonical)
Takes a set of planar object points and transforms them to 'canonical' object coordinates This is whe...
Definition: ippe.cpp:734
aruco_export.h
HomographyHO::homographyHO
void homographyHO(cv::InputArray srcPoints, cv::InputArray targPoints, cv::OutputArray H)
Computes the best-fitting homography matrix from source to target points using Harker and O'Leary's m...
Definition: ippe.cpp:1041
IPPE::PoseSolver::computeObjextSpaceRSvD
bool computeObjextSpaceRSvD(cv::InputArray _objectPointsZeroMean, cv::OutputArray _R)
computeObjextSpaceRSvD Computes the rotation _R that rotates the object points to the plane z=0....
Definition: ippe.cpp:1275
IPPE::PoseSolver::sortPosesByReprojError
void sortPosesByReprojError(cv::InputArray _objectPoints, cv::InputArray _imagePoints, cv::InputArray _cameraMatrix, cv::InputArray _distCoeffs, cv::InputArray _Ma, cv::InputArray _Mb, cv::OutputArray _M1, cv::OutputArray _M2, float &err1, float &err2)
Sorts two pose solutions according to their RMS reprojection error (lowest first).
Definition: ippe.cpp:895
IPPE::PoseSolver::meanSceneDepth
double meanSceneDepth(cv::InputArray objectPoints, cv::InputArray rvec, cv::InputArray tvec)
Computes the average depth of an object given its pose in camera coordinates.
Definition: ippe.cpp:376
IPPE::PoseSolver::computeRotations
void computeRotations(double j00, double j01, double j10, double j11, double p, double q, cv::OutputArray _R1, cv::OutputArray _R2)
Computes the two rotation solutions from the Jacobian of a homography matrix H at a point (ux,...
Definition: ippe.cpp:537
IPPE::PoseSolver::solveCanonicalForm
void solveCanonicalForm(cv::InputArray _canonicalObjPoints, cv::InputArray _normalizedInputPoints, cv::InputArray _H, cv::OutputArray _Ma, cv::OutputArray _Mb)
Finds the two possible poses of a planar object in its canonical position, given a set of corresponde...
Definition: ippe.cpp:255
IPPE::PoseSolver::solveSquare
void solveSquare(double squareLength, cv::InputArray _imagePoints, cv::InputArray _cameraMatrix, cv::InputArray _distCoeffs, cv::OutputArray _rvec1, cv::OutputArray _tvec1, float &reprojErr1, cv::OutputArray _rvec2, cv::OutputArray _tvec2, float &reprojErr2)
Finds the two possible poses of a square planar object and their respective reprojection errors using...
Definition: ippe.cpp:297
ARUCO_EXPORT
#define ARUCO_EXPORT
Definition: aruco_export.h:30
IPPE::PoseSolver::generateSquareObjectCorners2D
void generateSquareObjectCorners2D(double squareLength, cv::OutputArray _objectPoints)
Generates the 4 object points of a square planar object, without including the z-component (which is ...
Definition: ippe.cpp:366
IPPE::PoseSolver::solveGeneric
void solveGeneric(cv::InputArray _objectPoints, cv::InputArray _imagePoints, cv::InputArray _cameraMatrix, cv::InputArray _distCoeffs, cv::OutputArray _rvec1, cv::OutputArray _tvec1, float &reprojErr1, cv::OutputArray _rvec2, cv::OutputArray _tvec2, float &reprojErr2)
Finds the two possible poses of a planar object given a set of correspondences and their respective r...
Definition: ippe.cpp:159
IPPE::PoseSolver::evalReprojError
void evalReprojError(cv::InputArray _objectPoints, cv::InputArray _imagePoints, cv::InputArray _cameraMatrix, cv::InputArray _distCoeffs, cv::InputArray _M, float &err)
Evaluates the Root Mean Squared (RMS) reprojection error of a pose solution.
Definition: ippe.cpp:846
aruco
Definition: cameraparameters.h:24
IPPE
Definition: ippe.h:64
IPPE::PoseSolver::rotateVec2ZAxis
void rotateVec2ZAxis(cv::InputArray _a, cv::OutputArray _Ra)
Finds the rotation _Ra that rotates a vector _a to the z axis (0,0,1)
Definition: ippe.cpp:1169
HomographyHO
Definition: ippe.h:330
IPPE::PoseSolver::generateSquareObjectCorners3D
void generateSquareObjectCorners3D(double squareLength, cv::OutputArray _objectPoints)
Generates the 4 object points of a square planar object.
Definition: ippe.cpp:356
IPPE::PoseSolver::computeTranslation
void computeTranslation(cv::InputArray _objectPoints, cv::InputArray _normalizedImgPoints, cv::InputArray _R, cv::OutputArray _t)
Computes the translation solution for a given rotation solution.
Definition: ippe.cpp:440
aruco::solvePnP
std::vector< cv::Mat > solvePnP(const std::vector< cv::Point3f > &objPoints, const std::vector< cv::Point2f > &imgPoints, cv::InputArray cameraMatrix, cv::InputArray distCoeffs)
Definition: ippe.cpp:88
IPPE::PoseSolver::computeObjextSpaceR3Pts
bool computeObjextSpaceR3Pts(cv::InputArray _objectPoints, cv::OutputArray _R)
Computes the rotation _R that rotates the object points to the plane z=0. This uses the cross-product...
Definition: ippe.cpp:1213


aruco
Author(s): Rafael Muñoz Salinas , Bence Magyar
autogenerated on Sat Sep 23 2023 02:26:45