mirror of
https://github.com/opencv/opencv.git
synced 2025-06-13 04:52:53 +08:00
improve doc.
This commit is contained in:
parent
22496742b4
commit
67acfc6e25
@ -7,7 +7,7 @@ object in the case of computer vision area to do later some 3D rendering or in t
|
|||||||
obtain an object pose in order to grasp it and do some manipulation. However, this is not a trivial
|
obtain an object pose in order to grasp it and do some manipulation. However, this is not a trivial
|
||||||
problem to solve due to the fact that the most common issue in image processing is the computational
|
problem to solve due to the fact that the most common issue in image processing is the computational
|
||||||
cost of applying a lot of algorithms or mathematical operations for solving a problem which is basic
|
cost of applying a lot of algorithms or mathematical operations for solving a problem which is basic
|
||||||
and immediateley for humans.
|
and immediately for humans.
|
||||||
|
|
||||||
Goal
|
Goal
|
||||||
----
|
----
|
||||||
@ -63,7 +63,7 @@ The tutorial consists of two main programs:
|
|||||||
|
|
||||||
-# **Model registration**
|
-# **Model registration**
|
||||||
|
|
||||||
This applicaton is exclusive to whom don't have a 3D textured model of the object to be detected.
|
This application is exclusive to whom don't have a 3D textured model of the object to be detected.
|
||||||
You can use this program to create your own textured 3D model. This program only works for planar
|
You can use this program to create your own textured 3D model. This program only works for planar
|
||||||
objects, then if you want to model an object with complex shape you should use a sophisticated
|
objects, then if you want to model an object with complex shape you should use a sophisticated
|
||||||
software to create it.
|
software to create it.
|
||||||
@ -110,7 +110,7 @@ The tutorial consists of two main programs:
|
|||||||
-c, --confidence (value:0.95)
|
-c, --confidence (value:0.95)
|
||||||
RANSAC confidence
|
RANSAC confidence
|
||||||
-e, --error (value:2.0)
|
-e, --error (value:2.0)
|
||||||
RANSAC reprojection errror
|
RANSAC reprojection error
|
||||||
-f, --fast (value:true)
|
-f, --fast (value:true)
|
||||||
use of robust fast match
|
use of robust fast match
|
||||||
-h, --help (value:true)
|
-h, --help (value:true)
|
||||||
@ -269,7 +269,7 @@ Here is explained in detail the code for the real time application:
|
|||||||
|
|
||||||
Firstly, we have to set which matcher we want to use. In this case is used
|
Firstly, we have to set which matcher we want to use. In this case is used
|
||||||
@ref cv::FlannBasedMatcher matcher which in terms of computational cost is faster than the
|
@ref cv::FlannBasedMatcher matcher which in terms of computational cost is faster than the
|
||||||
@ref cv::BFMatcher matcher as we increase the trained collectction of features. Then, for
|
@ref cv::BFMatcher matcher as we increase the trained collection of features. Then, for
|
||||||
FlannBased matcher the index created is *Multi-Probe LSH: Efficient Indexing for High-Dimensional
|
FlannBased matcher the index created is *Multi-Probe LSH: Efficient Indexing for High-Dimensional
|
||||||
Similarity Search* due to *ORB* descriptors are binary.
|
Similarity Search* due to *ORB* descriptors are binary.
|
||||||
|
|
||||||
@ -381,12 +381,12 @@ Here is explained in detail the code for the real time application:
|
|||||||
as not, there are false correspondences or also called *outliers*. The [Random Sample
|
as not, there are false correspondences or also called *outliers*. The [Random Sample
|
||||||
Consensus](http://en.wikipedia.org/wiki/RANSAC) or *Ransac* is a non-deterministic iterative
|
Consensus](http://en.wikipedia.org/wiki/RANSAC) or *Ransac* is a non-deterministic iterative
|
||||||
method which estimate parameters of a mathematical model from observed data producing an
|
method which estimate parameters of a mathematical model from observed data producing an
|
||||||
aproximate result as the number of iterations increase. After appyling *Ransac* all the *outliers*
|
approximate result as the number of iterations increase. After appyling *Ransac* all the *outliers*
|
||||||
will be eliminated to then estimate the camera pose with a certain probability to obtain a good
|
will be eliminated to then estimate the camera pose with a certain probability to obtain a good
|
||||||
solution.
|
solution.
|
||||||
|
|
||||||
For the camera pose estimation I have implemented a *class* **PnPProblem**. This *class* has 4
|
For the camera pose estimation I have implemented a *class* **PnPProblem**. This *class* has 4
|
||||||
atributes: a given calibration matrix, the rotation matrix, the translation matrix and the
|
attributes: a given calibration matrix, the rotation matrix, the translation matrix and the
|
||||||
rotation-translation matrix. The intrinsic calibration parameters of the camera which you are
|
rotation-translation matrix. The intrinsic calibration parameters of the camera which you are
|
||||||
using to estimate the pose are necessary. In order to obtain the parameters you can check
|
using to estimate the pose are necessary. In order to obtain the parameters you can check
|
||||||
@ref tutorial_camera_calibration_square_chess and @ref tutorial_camera_calibration tutorials.
|
@ref tutorial_camera_calibration_square_chess and @ref tutorial_camera_calibration tutorials.
|
||||||
@ -406,7 +406,7 @@ Here is explained in detail the code for the real time application:
|
|||||||
|
|
||||||
PnPProblem pnp_detection(params_WEBCAM); // instantiate PnPProblem class
|
PnPProblem pnp_detection(params_WEBCAM); // instantiate PnPProblem class
|
||||||
@endcode
|
@endcode
|
||||||
The following code is how the *PnPProblem class* initialises its atributes:
|
The following code is how the *PnPProblem class* initialises its attributes:
|
||||||
@code{.cpp}
|
@code{.cpp}
|
||||||
// Custom constructor given the intrinsic camera parameters
|
// Custom constructor given the intrinsic camera parameters
|
||||||
|
|
||||||
@ -431,13 +431,13 @@ Here is explained in detail the code for the real time application:
|
|||||||
surfaces and sometimes the pose estimation seems to have a mirror effect. Therefore, in this this
|
surfaces and sometimes the pose estimation seems to have a mirror effect. Therefore, in this this
|
||||||
tutorial is used ITERATIVE method due to the object to be detected has planar surfaces.
|
tutorial is used ITERATIVE method due to the object to be detected has planar surfaces.
|
||||||
|
|
||||||
The OpenCV Ransac implementation wants you to provide three parameters: the maximum number of
|
The OpenCV RANSAC implementation wants you to provide three parameters: the maximum number of
|
||||||
iterations until stop the algorithm, the maximum allowed distance between the observed and
|
iterations until stop the algorithm, the maximum allowed distance between the observed and
|
||||||
computed point projections to consider it an inlier and the confidence to obtain a good result.
|
computed point projections to consider it an inlier and the confidence to obtain a good result.
|
||||||
You can tune these paramaters in order to improve your algorithm performance. Increasing the
|
You can tune these parameters in order to improve your algorithm performance. Increasing the
|
||||||
number of iterations you will have a more accurate solution, but will take more time to find a
|
number of iterations you will have a more accurate solution, but will take more time to find a
|
||||||
solution. Increasing the reprojection error will reduce the computation time, but your solution
|
solution. Increasing the reprojection error will reduce the computation time, but your solution
|
||||||
will be unaccurate. Decreasing the confidence your arlgorithm will be faster, but the obtained
|
will be unaccurate. Decreasing the confidence your algorithm will be faster, but the obtained
|
||||||
solution will be unaccurate.
|
solution will be unaccurate.
|
||||||
|
|
||||||
The following parameters work for this application:
|
The following parameters work for this application:
|
||||||
@ -446,7 +446,7 @@ Here is explained in detail the code for the real time application:
|
|||||||
|
|
||||||
int iterationsCount = 500; // number of Ransac iterations.
|
int iterationsCount = 500; // number of Ransac iterations.
|
||||||
float reprojectionError = 2.0; // maximum allowed distance to consider it an inlier.
|
float reprojectionError = 2.0; // maximum allowed distance to consider it an inlier.
|
||||||
float confidence = 0.95; // ransac successful confidence.
|
float confidence = 0.95; // RANSAC successful confidence.
|
||||||
@endcode
|
@endcode
|
||||||
The following code corresponds to the *estimatePoseRANSAC()* function which belongs to the
|
The following code corresponds to the *estimatePoseRANSAC()* function which belongs to the
|
||||||
*PnPProblem class*. This function estimates the rotation and translation matrix given a set of
|
*PnPProblem class*. This function estimates the rotation and translation matrix given a set of
|
||||||
@ -458,7 +458,7 @@ Here is explained in detail the code for the real time application:
|
|||||||
void PnPProblem::estimatePoseRANSAC( const std::vector<cv::Point3f> &list_points3d, // list with model 3D coordinates
|
void PnPProblem::estimatePoseRANSAC( const std::vector<cv::Point3f> &list_points3d, // list with model 3D coordinates
|
||||||
const std::vector<cv::Point2f> &list_points2d, // list with scene 2D coordinates
|
const std::vector<cv::Point2f> &list_points2d, // list with scene 2D coordinates
|
||||||
int flags, cv::Mat &inliers, int iterationsCount, // PnP method; inliers container
|
int flags, cv::Mat &inliers, int iterationsCount, // PnP method; inliers container
|
||||||
float reprojectionError, float confidence ) // Ransac parameters
|
float reprojectionError, float confidence ) // RANSAC parameters
|
||||||
{
|
{
|
||||||
cv::Mat distCoeffs = cv::Mat::zeros(4, 1, CV_64FC1); // vector of distortion coefficients
|
cv::Mat distCoeffs = cv::Mat::zeros(4, 1, CV_64FC1); // vector of distortion coefficients
|
||||||
cv::Mat rvec = cv::Mat::zeros(3, 1, CV_64FC1); // output rotation vector
|
cv::Mat rvec = cv::Mat::zeros(3, 1, CV_64FC1); // output rotation vector
|
||||||
@ -479,8 +479,8 @@ Here is explained in detail the code for the real time application:
|
|||||||
}
|
}
|
||||||
@endcode
|
@endcode
|
||||||
In the following code are the 3th and 4th steps of the main algorithm. The first, calling the
|
In the following code are the 3th and 4th steps of the main algorithm. The first, calling the
|
||||||
above function and the second taking the output inliers vector from Ransac to get the 2D scene
|
above function and the second taking the output inliers vector from RANSAC to get the 2D scene
|
||||||
points for drawing purpose. As seen in the code we must be sure to apply Ransac if we have
|
points for drawing purpose. As seen in the code we must be sure to apply RANSAC if we have
|
||||||
matches, in the other case, the function @ref cv::solvePnPRansac crashes due to any OpenCV *bug*.
|
matches, in the other case, the function @ref cv::solvePnPRansac crashes due to any OpenCV *bug*.
|
||||||
@code{.cpp}
|
@code{.cpp}
|
||||||
if(good_matches.size() > 0) // None matches, then RANSAC crashes
|
if(good_matches.size() > 0) // None matches, then RANSAC crashes
|
||||||
@ -558,7 +558,7 @@ Here is explained in detail the code for the real time application:
|
|||||||
|
|
||||||
\f[X = (x,y,z,\dot x,\dot y,\dot z,\ddot x,\ddot y,\ddot z,\psi,\theta,\phi,\dot \psi,\dot \theta,\dot \phi,\ddot \psi,\ddot \theta,\ddot \phi)^T\f]
|
\f[X = (x,y,z,\dot x,\dot y,\dot z,\ddot x,\ddot y,\ddot z,\psi,\theta,\phi,\dot \psi,\dot \theta,\dot \phi,\ddot \psi,\ddot \theta,\ddot \phi)^T\f]
|
||||||
|
|
||||||
Secondly, we have to define the number of measuremnts which will be 6: from \f$R\f$ and \f$t\f$ we can
|
Secondly, we have to define the number of measurements which will be 6: from \f$R\f$ and \f$t\f$ we can
|
||||||
extract \f$(x,y,z)\f$ and \f$(\psi,\theta,\phi)\f$. In addition, we have to define the number of control
|
extract \f$(x,y,z)\f$ and \f$(\psi,\theta,\phi)\f$. In addition, we have to define the number of control
|
||||||
actions to apply to the system which in this case will be *zero*. Finally, we have to define the
|
actions to apply to the system which in this case will be *zero*. Finally, we have to define the
|
||||||
differential time between measurements which in this case is \f$1/T\f$, where *T* is the frame rate of
|
differential time between measurements which in this case is \f$1/T\f$, where *T* is the frame rate of
|
||||||
|
@ -37,6 +37,6 @@ Although we get most of our images in a 2D format they do come from a 3D world.
|
|||||||
*Author:* Vladislav Sovrasov
|
*Author:* Vladislav Sovrasov
|
||||||
|
|
||||||
Camera calibration by using either the chessboard, chAruco, asymmetrical circle or dual asymmetrical circle
|
Camera calibration by using either the chessboard, chAruco, asymmetrical circle or dual asymmetrical circle
|
||||||
pattern. Calibration process is continious, so you can see results after each new pattern shot.
|
pattern. Calibration process is continuous, so you can see results after each new pattern shot.
|
||||||
As an output you get average reprojection error, intrinsic camera parameters, distortion coefficients and
|
As an output you get average reprojection error, intrinsic camera parameters, distortion coefficients and
|
||||||
confidence intervals for all of evaluated variables.
|
confidence intervals for all of evaluated variables.
|
||||||
|
@ -396,7 +396,7 @@ and a rotation matrix.
|
|||||||
It optionally returns three rotation matrices, one for each axis, and the three Euler angles in
|
It optionally returns three rotation matrices, one for each axis, and the three Euler angles in
|
||||||
degrees (as the return value) that could be used in OpenGL. Note, there is always more than one
|
degrees (as the return value) that could be used in OpenGL. Note, there is always more than one
|
||||||
sequence of rotations about the three principal axes that results in the same orientation of an
|
sequence of rotations about the three principal axes that results in the same orientation of an
|
||||||
object, eg. see @cite Slabaugh . Returned tree rotation matrices and corresponding three Euler angules
|
object, eg. see @cite Slabaugh . Returned tree rotation matrices and corresponding three Euler angles
|
||||||
are only one of the possible solutions.
|
are only one of the possible solutions.
|
||||||
*/
|
*/
|
||||||
CV_EXPORTS_W Vec3d RQDecomp3x3( InputArray src, OutputArray mtxR, OutputArray mtxQ,
|
CV_EXPORTS_W Vec3d RQDecomp3x3( InputArray src, OutputArray mtxR, OutputArray mtxQ,
|
||||||
@ -583,7 +583,7 @@ projections, as well as the camera matrix and the distortion coefficients.
|
|||||||
it as, e.g., imagePoints, one must effectively copy it into a new array: imagePoints =
|
it as, e.g., imagePoints, one must effectively copy it into a new array: imagePoints =
|
||||||
np.ascontiguousarray(D[:,:2]).reshape((N,1,2))
|
np.ascontiguousarray(D[:,:2]).reshape((N,1,2))
|
||||||
- The methods **SOLVEPNP_DLS** and **SOLVEPNP_UPNP** cannot be used as the current implementations are
|
- The methods **SOLVEPNP_DLS** and **SOLVEPNP_UPNP** cannot be used as the current implementations are
|
||||||
unstable and sometimes give completly wrong results. If you pass one of these two
|
unstable and sometimes give completely wrong results. If you pass one of these two
|
||||||
flags, **SOLVEPNP_EPNP** method will be used instead.
|
flags, **SOLVEPNP_EPNP** method will be used instead.
|
||||||
- The minimum number of points is 4. In the case of **SOLVEPNP_P3P** and **SOLVEPNP_AP3P**
|
- The minimum number of points is 4. In the case of **SOLVEPNP_P3P** and **SOLVEPNP_AP3P**
|
||||||
methods, it is required to use exactly 4 points (the first 3 points are used to estimate all the solutions
|
methods, it is required to use exactly 4 points (the first 3 points are used to estimate all the solutions
|
||||||
@ -1371,9 +1371,9 @@ be floating-point (single or double precision).
|
|||||||
@param cameraMatrix Camera matrix \f$K = \vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}\f$ .
|
@param cameraMatrix Camera matrix \f$K = \vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}\f$ .
|
||||||
Note that this function assumes that points1 and points2 are feature points from cameras with the
|
Note that this function assumes that points1 and points2 are feature points from cameras with the
|
||||||
same camera matrix.
|
same camera matrix.
|
||||||
@param method Method for computing a fundamental matrix.
|
@param method Method for computing an essential matrix.
|
||||||
- **RANSAC** for the RANSAC algorithm.
|
- **RANSAC** for the RANSAC algorithm.
|
||||||
- **MEDS** for the LMedS algorithm.
|
- **LMEDS** for the LMedS algorithm.
|
||||||
@param prob Parameter used for the RANSAC or LMedS methods only. It specifies a desirable level of
|
@param prob Parameter used for the RANSAC or LMedS methods only. It specifies a desirable level of
|
||||||
confidence (probability) that the estimated matrix is correct.
|
confidence (probability) that the estimated matrix is correct.
|
||||||
@param threshold Parameter used for RANSAC. It is the maximum distance from a point to an epipolar
|
@param threshold Parameter used for RANSAC. It is the maximum distance from a point to an epipolar
|
||||||
@ -1655,7 +1655,7 @@ to 3D points with a very large Z value (currently set to 10000).
|
|||||||
depth. ddepth can also be set to CV_16S, CV_32S or CV_32F.
|
depth. ddepth can also be set to CV_16S, CV_32S or CV_32F.
|
||||||
|
|
||||||
The function transforms a single-channel disparity map to a 3-channel image representing a 3D
|
The function transforms a single-channel disparity map to a 3-channel image representing a 3D
|
||||||
surface. That is, for each pixel (x,y) andthe corresponding disparity d=disparity(x,y) , it
|
surface. That is, for each pixel (x,y) and the corresponding disparity d=disparity(x,y) , it
|
||||||
computes:
|
computes:
|
||||||
|
|
||||||
\f[\begin{array}{l} [X \; Y \; Z \; W]^T = \texttt{Q} *[x \; y \; \texttt{disparity} (x,y) \; 1]^T \\ \texttt{\_3dImage} (x,y) = (X/W, \; Y/W, \; Z/W) \end{array}\f]
|
\f[\begin{array}{l} [X \; Y \; Z \; W]^T = \texttt{Q} *[x \; y \; \texttt{disparity} (x,y) \; 1]^T \\ \texttt{\_3dImage} (x,y) = (X/W, \; Y/W, \; Z/W) \end{array}\f]
|
||||||
@ -1704,7 +1704,7 @@ CV_EXPORTS_W int estimateAffine3D(InputArray src, InputArray dst,
|
|||||||
@param from First input 2D point set.
|
@param from First input 2D point set.
|
||||||
@param to Second input 2D point set.
|
@param to Second input 2D point set.
|
||||||
@param inliers Output vector indicating which points are inliers.
|
@param inliers Output vector indicating which points are inliers.
|
||||||
@param method Robust method used to compute tranformation. The following methods are possible:
|
@param method Robust method used to compute transformation. The following methods are possible:
|
||||||
- cv::RANSAC - RANSAC-based robust method
|
- cv::RANSAC - RANSAC-based robust method
|
||||||
- cv::LMEDS - Least-Median robust method
|
- cv::LMEDS - Least-Median robust method
|
||||||
RANSAC is the default method.
|
RANSAC is the default method.
|
||||||
@ -1744,7 +1744,7 @@ two 2D point sets.
|
|||||||
@param from First input 2D point set.
|
@param from First input 2D point set.
|
||||||
@param to Second input 2D point set.
|
@param to Second input 2D point set.
|
||||||
@param inliers Output vector indicating which points are inliers.
|
@param inliers Output vector indicating which points are inliers.
|
||||||
@param method Robust method used to compute tranformation. The following methods are possible:
|
@param method Robust method used to compute transformation. The following methods are possible:
|
||||||
- cv::RANSAC - RANSAC-based robust method
|
- cv::RANSAC - RANSAC-based robust method
|
||||||
- cv::LMEDS - Least-Median robust method
|
- cv::LMEDS - Least-Median robust method
|
||||||
RANSAC is the default method.
|
RANSAC is the default method.
|
||||||
@ -2043,7 +2043,7 @@ namespace fisheye
|
|||||||
@param alpha The skew coefficient.
|
@param alpha The skew coefficient.
|
||||||
@param distorted Output array of image points, 1xN/Nx1 2-channel, or vector\<Point2f\> .
|
@param distorted Output array of image points, 1xN/Nx1 2-channel, or vector\<Point2f\> .
|
||||||
|
|
||||||
Note that the function assumes the camera matrix of the undistorted points to be indentity.
|
Note that the function assumes the camera matrix of the undistorted points to be identity.
|
||||||
This means if you want to transform back points undistorted with undistortPoints() you have to
|
This means if you want to transform back points undistorted with undistortPoints() you have to
|
||||||
multiply them with \f$P^{-1}\f$.
|
multiply them with \f$P^{-1}\f$.
|
||||||
*/
|
*/
|
||||||
|
@ -2997,7 +2997,7 @@ cvRQDecomp3x3( const CvMat *matrixM, CvMat *matrixR, CvMat *matrixQ,
|
|||||||
eulerAngles->z = acos(_Qz[0][0]) * (_Qz[0][1] >= 0 ? 1 : -1) * (180.0 / CV_PI);
|
eulerAngles->z = acos(_Qz[0][0]) * (_Qz[0][1] >= 0 ? 1 : -1) * (180.0 / CV_PI);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Calulate orthogonal matrix. */
|
/* Calculate orthogonal matrix. */
|
||||||
/*
|
/*
|
||||||
Q = QzT * QyT * QxT
|
Q = QzT * QyT * QxT
|
||||||
*/
|
*/
|
||||||
|
@ -171,7 +171,7 @@ public:
|
|||||||
float ww = 1.f/(Hf[6]*M[i].x + Hf[7]*M[i].y + 1.f);
|
float ww = 1.f/(Hf[6]*M[i].x + Hf[7]*M[i].y + 1.f);
|
||||||
float dx = (Hf[0]*M[i].x + Hf[1]*M[i].y + Hf[2])*ww - m[i].x;
|
float dx = (Hf[0]*M[i].x + Hf[1]*M[i].y + Hf[2])*ww - m[i].x;
|
||||||
float dy = (Hf[3]*M[i].x + Hf[4]*M[i].y + Hf[5])*ww - m[i].y;
|
float dy = (Hf[3]*M[i].x + Hf[4]*M[i].y + Hf[5])*ww - m[i].y;
|
||||||
err[i] = (float)(dx*dx + dy*dy);
|
err[i] = dx*dx + dy*dy;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -594,7 +594,7 @@ public:
|
|||||||
bool checkSubset( InputArray _ms1, InputArray, int count ) const
|
bool checkSubset( InputArray _ms1, InputArray, int count ) const
|
||||||
{
|
{
|
||||||
Mat ms1 = _ms1.getMat();
|
Mat ms1 = _ms1.getMat();
|
||||||
// check colinearity and also check that points are too close
|
// check collinearity and also check that points are too close
|
||||||
// only ms1 affects actual estimation stability
|
// only ms1 affects actual estimation stability
|
||||||
return !haveCollinearPoints(ms1, count);
|
return !haveCollinearPoints(ms1, count);
|
||||||
}
|
}
|
||||||
|
@ -1610,7 +1610,7 @@ cv::Mat cv::estimateRigidTransform( InputArray src1, InputArray src2, bool fullA
|
|||||||
Point2f a[RANSAC_SIZE0];
|
Point2f a[RANSAC_SIZE0];
|
||||||
Point2f b[RANSAC_SIZE0];
|
Point2f b[RANSAC_SIZE0];
|
||||||
|
|
||||||
// choose random 3 non-complanar points from A & B
|
// choose random 3 non-coplanar points from A & B
|
||||||
for( i = 0; i < RANSAC_SIZE0; i++ )
|
for( i = 0; i < RANSAC_SIZE0; i++ )
|
||||||
{
|
{
|
||||||
for( k1 = 0; k1 < RANSAC_MAX_ITERS; k1++ )
|
for( k1 = 0; k1 < RANSAC_MAX_ITERS; k1++ )
|
||||||
|
Loading…
Reference in New Issue
Block a user