camera_calibration_and_3d_reconstruction.rst 88.6 KB
Newer Older
1 2 3
Camera Calibration and 3D Reconstruction
========================================

4 5
.. highlight:: cpp

6
The functions in this section use a so-called pinhole camera model. In this model, a scene view is formed by projecting 3D points into the image plane
7 8 9 10
using a perspective transformation.

.. math::

11
    s  \; m' = A [R|t] M'
12 13 14 15 16

or

.. math::

17
    s  \vecthree{u}{v}{1} = \vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}
Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
18 19 20 21 22 23 24 25 26 27 28
    \begin{bmatrix}
    r_{11} & r_{12} & r_{13} & t_1  \\
    r_{21} & r_{22} & r_{23} & t_2  \\
    r_{31} & r_{32} & r_{33} & t_3
    \end{bmatrix}
    \begin{bmatrix}
    X \\
    Y \\
    Z \\
    1
    \end{bmatrix}
29

30 31
where:

32 33 34 35
   * :math:`(X, Y, Z)` are the coordinates of a 3D point in the world coordinate space
   * :math:`(u, v)` are the coordinates of the projection point in pixels
   * :math:`A` is a camera matrix, or a matrix of intrinsic parameters
   * :math:`(cx, cy)` is a principal point that is usually at the image center
36
   * :math:`fx, fy` are the focal lengths expressed in pixel units.
37

38

39 40
Thus, if an image from the camera is
scaled by a factor, all of these parameters should
41
be scaled (multiplied/divided, respectively) by the same factor. The
42 43 44
matrix of intrinsic parameters does not depend on the scene viewed. So,
once estimated, it can be re-used as long as the focal length is fixed (in
case of zoom lens). The joint rotation-translation matrix
45
:math:`[R|t]` is called a matrix of extrinsic parameters. It is used to describe the
46
camera motion around a static scene, or vice versa, rigid motion of an
47
object in front of a still camera. That is,
48 49
:math:`[R|t]` translates
coordinates of a point
50
:math:`(X, Y, Z)` to a coordinate system,
51
fixed with respect to the camera. The transformation above is equivalent
52 53
to the following (when
:math:`z \ne 0` ):
54 55 56

.. math::

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
57 58 59 60 61 62 63
    \begin{array}{l}
    \vecthree{x}{y}{z} = R  \vecthree{X}{Y}{Z} + t \\
    x' = x/z \\
    y' = y/z \\
    u = f_x*x' + c_x \\
    v = f_y*y' + c_y
    \end{array}
64 65 66 67 68 69 70

Real lenses usually have some distortion, mostly
radial distortion and slight tangential distortion. So, the above model
is extended as:

.. math::

71
    \begin{array}{l} \vecthree{x}{y}{z} = R  \vecthree{X}{Y}{Z} + t \\ x' = x/z \\ y' = y/z \\ x'' = x'  \frac{1 + k_1 r^2 + k_2 r^4 + k_3 r^6}{1 + k_4 r^2 + k_5 r^4 + k_6 r^6} + 2 p_1 x' y' + p_2(r^2 + 2 x'^2) + s_1 r^2 + s_2 r^4 \\ y'' = y'  \frac{1 + k_1 r^2 + k_2 r^4 + k_3 r^6}{1 + k_4 r^2 + k_5 r^4 + k_6 r^6} + p_1 (r^2 + 2 y'^2) + 2 p_2 x' y' + s_1 r^2 + s_2 r^4 \\ \text{where} \quad r^2 = x'^2 + y'^2  \\ u = f_x*x'' + c_x \\ v = f_y*y'' + c_y \end{array}
72

73 74 75 76 77 78 79 80
:math:`k_1`,
:math:`k_2`,
:math:`k_3`,
:math:`k_4`,
:math:`k_5`, and
:math:`k_6` are radial distortion coefficients.
:math:`p_1` and
:math:`p_2` are tangential distortion coefficients.
81 82 83
:math:`s_1`,
:math:`s_2`,
:math:`s_3`, and
84
:math:`s_4`, are the thin prism distortion coefficients.
85
Higher-order coefficients are not considered in OpenCV. In the functions below the coefficients are passed or returned as
86 87 88

.. math::

89
    (k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6],[s_1, s_2, s_3, s_4]])
90

91
vector. That is, if the vector contains four elements, it means that
92
:math:`k_3=0` .
93
The distortion coefficients do not depend on the scene viewed. Thus, they also belong to the intrinsic camera parameters. And they remain the same regardless of the captured image resolution.
94
If, for example, a camera has been calibrated on images of
95 96
``320 x 240`` resolution, absolutely the same distortion coefficients can
be used for ``640 x 480`` images from the same camera while
97 98 99 100
:math:`f_x`,
:math:`f_y`,
:math:`c_x`, and
:math:`c_y` need to be scaled appropriately.
101

102
The functions below use the above model to do the following:
103

104
 * Project 3D points to the image plane given intrinsic and extrinsic parameters.
105

106
 * Compute extrinsic parameters given intrinsic parameters, a few 3D points, and their projections.
107

108
 * Estimate intrinsic and extrinsic camera parameters from several views of a known calibration pattern (every view is described by several 3D-2D point correspondences).
109

110
 * Estimate the relative position and orientation of the stereo camera "heads" and compute the *rectification* transformation that makes the camera optical axes parallel.
111

112
.. note::
113

114 115 116 117 118 119
   * A calibration sample for 3 cameras in horizontal position can be found at opencv_source_code/samples/cpp/3calibration.cpp
   * A calibration sample based on a sequence of images can be found at opencv_source_code/samples/cpp/calibration.cpp
   * A calibration sample in order to do 3D reconstruction can be found at opencv_source_code/samples/cpp/build3dmodel.cpp
   * A calibration sample of an artificially generated camera and chessboard patterns can be found at opencv_source_code/samples/cpp/calibration_artificial.cpp
   * A calibration example on stereo calibration can be found at opencv_source_code/samples/cpp/stereo_calib.cpp
   * A calibration example on stereo matching can be found at opencv_source_code/samples/cpp/stereo_match.cpp
120

121
   * (Python) A camera calibration sample can be found at opencv_source_code/samples/python2/calibrate.py
122

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
123 124
calibrateCamera
---------------
125
Finds the camera intrinsic and extrinsic parameters from several views of a calibration pattern.
Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
126

127
.. ocv:function:: double calibrateCamera( InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints, Size imageSize, InputOutputArray cameraMatrix, InputOutputArray distCoeffs, OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs, int flags=0, TermCriteria criteria=TermCriteria( TermCriteria::COUNT + TermCriteria::EPS, 30, DBL_EPSILON) )
128

129
.. ocv:pyfunction:: cv2.calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, distCoeffs[, rvecs[, tvecs[, flags[, criteria]]]]) -> retval, cameraMatrix, distCoeffs, rvecs, tvecs
130

131
.. ocv:cfunction:: double cvCalibrateCamera2( const CvMat* object_points, const CvMat* image_points, const CvMat* point_counts, CvSize image_size, CvMat* camera_matrix, CvMat* distortion_coeffs, CvMat* rotation_vectors=NULL, CvMat* translation_vectors=NULL, int flags=0, CvTermCriteria term_crit=cvTermCriteria( CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,30,DBL_EPSILON) )
132

133
    :param objectPoints: In the new interface it is a vector of vectors of calibration pattern points in the calibration pattern coordinate space. The outer vector contains as many elements as the number of the pattern views. If the same calibration pattern is shown in each view and it is fully visible, all the vectors will be the same. Although, it is possible to use partially occluded patterns, or even different patterns in different views. Then, the vectors will be different. The points are 3D, but since they are in a pattern coordinate system, then, if the rig is planar, it may make sense to put the model to a XY coordinate plane so that Z-coordinate of each input object point is 0.
134

135 136 137
        In the old interface all the vectors of object points from different views are concatenated together.

    :param imagePoints: In the new interface it is a vector of vectors of the projections of calibration pattern points. ``imagePoints.size()`` and ``objectPoints.size()`` and ``imagePoints[i].size()`` must be equal to ``objectPoints[i].size()`` for each ``i``.
138

139
        In the old interface all the vectors of object points from different views are concatenated together.
140

141
    :param point_counts: In the old interface this is a vector of integers, containing as many elements, as the number of views of the calibration pattern. Each element is the number of points in each view. Usually, all the elements are the same and equal to the number of feature points on the calibration pattern.
142

143
    :param imageSize: Size of the image used only to initialize the intrinsic camera matrix.
144

145
    :param cameraMatrix: Output 3x3 floating-point camera matrix  :math:`A = \vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}` . If  ``CV_CALIB_USE_INTRINSIC_GUESS``  and/or  ``CV_CALIB_FIX_ASPECT_RATIO``  are specified, some or all of  ``fx, fy, cx, cy``  must be initialized before calling the function.
146

147
    :param distCoeffs: Output vector of distortion coefficients  :math:`(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6],[s_1, s_2, s_3, s_4]])`  of 4, 5, 8 or 12 elements.
148

149
    :param rvecs: Output  vector  of rotation vectors (see  :ocv:func:`Rodrigues` ) estimated for each pattern view. That is, each k-th rotation vector together with the corresponding k-th translation vector (see the next output parameter description) brings the calibration pattern from the model coordinate space (in which object points are specified) to the world coordinate space, that is, a real position of the calibration pattern in the k-th pattern view (k=0.. *M* -1).
150

151
    :param tvecs: Output vector of translation vectors estimated for each pattern view.
152

153
    :param flags: Different flags that may be zero or a combination of the following values:
154

155
            * **CV_CALIB_USE_INTRINSIC_GUESS** ``cameraMatrix``  contains valid initial values of  ``fx, fy, cx, cy``  that are optimized further. Otherwise, ``(cx, cy)``  is initially set to the image center ( ``imageSize``  is used), and focal distances are computed in a least-squares fashion. Note, that if intrinsic parameters are known, there is no need to use this function just to estimate extrinsic parameters. Use  :ocv:func:`solvePnP`  instead.
156

157
            * **CV_CALIB_FIX_PRINCIPAL_POINT** The principal point is not changed during the global optimization. It stays at the center or at a different location specified when    ``CV_CALIB_USE_INTRINSIC_GUESS``  is set too.
158

159
            * **CV_CALIB_FIX_ASPECT_RATIO** The functions considers only  ``fy``  as a free parameter. The ratio  ``fx/fy``  stays the same as in the input  ``cameraMatrix`` .   When  ``CV_CALIB_USE_INTRINSIC_GUESS``  is not set, the actual input values of  ``fx``  and  ``fy``  are ignored, only their ratio is computed and used further.
160

161
            * **CV_CALIB_ZERO_TANGENT_DIST** Tangential distortion coefficients  :math:`(p_1, p_2)`  are set to zeros and stay zero.
162

163
        * **CV_CALIB_FIX_K1,...,CV_CALIB_FIX_K6** The corresponding radial distortion coefficient is not changed during the optimization. If  ``CV_CALIB_USE_INTRINSIC_GUESS``  is set, the coefficient from the supplied  ``distCoeffs``  matrix is used. Otherwise, it is set to 0.
164

165
        * **CV_CALIB_RATIONAL_MODEL** Coefficients k4, k5, and k6 are enabled. To provide the backward compatibility, this extra flag should be explicitly specified to make the calibration function use the rational model and return 8 coefficients. If the flag is not set, the function computes  and returns  only 5 distortion coefficients.
166

alegarda's avatar
alegarda committed
167
        * **CALIB_THIN_PRISM_MODEL** Coefficients s1, s2, s3 and s4 are enabled. To provide the backward compatibility, this extra flag should be explicitly specified to make the calibration function use the thin prism model and return 12 coefficients. If the flag is not set, the function computes  and returns  only 5 distortion coefficients.
168

alegarda's avatar
alegarda committed
169
        * **CALIB_FIX_S1_S2_S3_S4** The thin prism distortion coefficients are not changed during the optimization. If  ``CV_CALIB_USE_INTRINSIC_GUESS``  is set, the coefficient from the supplied  ``distCoeffs``  matrix is used. Otherwise, it is set to 0.
170

171

172 173 174
    :param criteria: Termination criteria for the iterative optimization algorithm.

    :param term_crit: same as ``criteria``.
175

176
The function estimates the intrinsic camera
177
parameters and extrinsic parameters for each of the views. The algorithm is based on [Zhang2000]_ and [BouguetMCT]_. The coordinates of 3D object points and their corresponding 2D projections
178
in each view must be specified. That may be achieved by using an
179
object with a known geometry and easily detectable feature points.
180 181
Such an object is called a calibration rig or calibration pattern,
and OpenCV has built-in support for a chessboard as a calibration
182
rig (see
183
:ocv:func:`findChessboardCorners` ). Currently, initialization
184
of intrinsic parameters (when ``CV_CALIB_USE_INTRINSIC_GUESS`` is not set) is only implemented for planar calibration patterns
185
(where Z-coordinates of the object points must be all zeros). 3D
186
calibration rigs can also be used as long as initial ``cameraMatrix`` is provided.
187

188
The algorithm performs the following steps:
189 190

#.
191
    Compute the initial intrinsic parameters (the option only available for planar calibration patterns) or read them from the input parameters. The distortion coefficients are all set to zeros initially unless some of ``CV_CALIB_FIX_K?``     are specified.
192 193

#.
194
    Estimate the initial camera pose as if the intrinsic parameters have been already known. This is done using
195
    :ocv:func:`solvePnP` .
196
#.
197
    Run the global Levenberg-Marquardt optimization algorithm to minimize the reprojection error, that is, the total sum of squared distances between the observed feature points ``imagePoints``     and the projected (using the current estimates for camera parameters and the poses) object points ``objectPoints``. See :ocv:func:`projectPoints` for details.
198

199
The function returns the final re-projection error.
200

201
.. note::
202

203
    If you use a non-square (=non-NxN) grid and    :ocv:func:`findChessboardCorners` for calibration, and ``calibrateCamera`` returns bad values (zero distortion coefficients, an image center very far from ``(w/2-0.5,h/2-0.5)``, and/or large differences between :math:`f_x` and :math:`f_y` (ratios of 10:1 or more)), then you have probably used ``patternSize=cvSize(rows,cols)`` instead of using ``patternSize=cvSize(cols,rows)`` in :ocv:func:`findChessboardCorners` .
204

205
.. seealso::
206

207
   :ocv:func:`findChessboardCorners`,
208
   :ocv:func:`solvePnP`,
209
   :ocv:func:`initCameraMatrix2D`,
210 211
   :ocv:func:`stereoCalibrate`,
   :ocv:func:`undistort`
Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
212

213

214

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
215 216
calibrationMatrixValues
-----------------------
217 218
Computes useful camera characteristics from the camera matrix.

219
.. ocv:function:: void calibrationMatrixValues( InputArray cameraMatrix, Size imageSize, double apertureWidth, double apertureHeight, double& fovx, double& fovy, double& focalLength, Point2d& principalPoint, double& aspectRatio )
220

221
.. ocv:pyfunction:: cv2.calibrationMatrixValues(cameraMatrix, imageSize, apertureWidth, apertureHeight) -> fovx, fovy, focalLength, principalPoint, aspectRatio
222

223
    :param cameraMatrix: Input camera matrix that can be estimated by  :ocv:func:`calibrateCamera`  or  :ocv:func:`stereoCalibrate` .
224

225
    :param imageSize: Input image size in pixels.
226

StevenPuttemans's avatar
StevenPuttemans committed
227
    :param apertureWidth: Physical width in mm of the sensor.
228

StevenPuttemans's avatar
StevenPuttemans committed
229
    :param apertureHeight: Physical height in mm of the sensor.
230

231
    :param fovx: Output field of view in degrees along the horizontal sensor axis.
232

233
    :param fovy: Output field of view in degrees along the vertical sensor axis.
234

235
    :param focalLength: Focal length of the lens in mm.
236

StevenPuttemans's avatar
StevenPuttemans committed
237
    :param principalPoint: Principal point in mm.
238

239
    :param aspectRatio: :math:`f_y/f_x`
240

241 242
The function computes various useful camera characteristics from the previously estimated camera matrix.

StevenPuttemans's avatar
StevenPuttemans committed
243
.. note::
244

StevenPuttemans's avatar
StevenPuttemans committed
245
    Do keep in mind that the unity measure 'mm' stands for whatever unit of measure one chooses for the chessboard pitch (it can thus be any value).
246

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
247
composeRT
248
-------------
249
Combines two rotation-and-shift transformations.
250

251
.. ocv:function:: void composeRT( InputArray rvec1, InputArray tvec1, InputArray rvec2, InputArray tvec2, OutputArray rvec3, OutputArray tvec3, OutputArray dr3dr1=noArray(), OutputArray dr3dt1=noArray(), OutputArray dr3dr2=noArray(), OutputArray dr3dt2=noArray(), OutputArray dt3dr1=noArray(), OutputArray dt3dt1=noArray(), OutputArray dt3dr2=noArray(), OutputArray dt3dt2=noArray() )
252

253
.. ocv:pyfunction:: cv2.composeRT(rvec1, tvec1, rvec2, tvec2[, rvec3[, tvec3[, dr3dr1[, dr3dt1[, dr3dr2[, dr3dt2[, dt3dr1[, dt3dt1[, dt3dr2[, dt3dt2]]]]]]]]]]) -> rvec3, tvec3, dr3dr1, dr3dt1, dr3dr2, dr3dt2, dt3dr1, dt3dt1, dt3dr2, dt3dt2
254

255
    :param rvec1: First rotation vector.
256

257
    :param tvec1: First translation vector.
258

259
    :param rvec2: Second rotation vector.
260

261
    :param tvec2: Second translation vector.
262

263
    :param rvec3: Output rotation vector of the superposition.
264

265
    :param tvec3: Output translation vector of the superposition.
266

267
    :param d*d*: Optional output derivatives of  ``rvec3``  or  ``tvec3``  with regard to  ``rvec1``, ``rvec2``, ``tvec1`` and ``tvec2``, respectively.
268

269
The functions compute:
270 271 272

.. math::

273
    \begin{array}{l} \texttt{rvec3} =  \mathrm{rodrigues} ^{-1} \left ( \mathrm{rodrigues} ( \texttt{rvec2} )  \cdot \mathrm{rodrigues} ( \texttt{rvec1} ) \right )  \\ \texttt{tvec3} =  \mathrm{rodrigues} ( \texttt{rvec2} )  \cdot \texttt{tvec1} +  \texttt{tvec2} \end{array} ,
274

275
where :math:`\mathrm{rodrigues}` denotes a rotation vector to a rotation matrix transformation, and
276
:math:`\mathrm{rodrigues}^{-1}` denotes the inverse transformation. See :ocv:func:`Rodrigues` for details.
277

278 279
Also, the functions can compute the derivatives of the output vectors with regards to the input vectors (see :ocv:func:`matMulDeriv` ).
The functions are used inside :ocv:func:`stereoCalibrate` but can also be used in your own code where Levenberg-Marquardt or another gradient-based solver is used to optimize a function that contains a matrix multiplication.
280

281

282

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
283
computeCorrespondEpilines
284
-----------------------------
285 286
For points in an image of a stereo pair, computes the corresponding epilines in the other image.

287
.. ocv:function:: void computeCorrespondEpilines( InputArray points, int whichImage, InputArray F, OutputArray lines )
288

289
.. ocv:cfunction:: void cvComputeCorrespondEpilines( const CvMat* points, int which_image, const CvMat* fundamental_matrix, CvMat* correspondent_lines )
290

abidrahmank's avatar
abidrahmank committed
291 292
.. ocv:pyfunction:: cv2.computeCorrespondEpilines(points, whichImage, F[, lines]) -> lines

293
    :param points: Input points.  :math:`N \times 1`  or  :math:`1 \times N`  matrix of type  ``CV_32FC2``  or  ``vector<Point2f>`` .
294

295
    :param whichImage: Index of the image (1 or 2) that contains the  ``points`` .
296

297
    :param F: Fundamental matrix that can be estimated using  :ocv:func:`findFundamentalMat`         or  :ocv:func:`stereoRectify` .
298

299
    :param lines: Output vector of the epipolar lines corresponding to the points in the other image. Each line :math:`ax + by + c=0`  is encoded by 3 numbers  :math:`(a, b, c)` .
300

301
For every point in one of the two images of a stereo pair, the function finds the equation of the
302 303
corresponding epipolar line in the other image.

304
From the fundamental matrix definition (see
305
:ocv:func:`findFundamentalMat` ),
306 307
line
:math:`l^{(2)}_i` in the second image for the point
308
:math:`p^{(1)}_i` in the first image (when ``whichImage=1`` ) is computed as:
309 310 311

.. math::

312
    l^{(2)}_i = F p^{(1)}_i
313

314 315
And vice versa, when ``whichImage=2``,
:math:`l^{(1)}_i` is computed from
316
:math:`p^{(2)}_i` as:
317 318 319

.. math::

320
    l^{(1)}_i = F^T p^{(2)}_i
321

322
Line coefficients are defined up to a scale. They are normalized so that
323
:math:`a_i^2+b_i^2=1` .
324 325


326

327
convertPointsToHomogeneous
328 329
--------------------------
Converts points from Euclidean to homogeneous space.
330

331
.. ocv:function:: void convertPointsToHomogeneous( InputArray src, OutputArray dst )
332

333
.. ocv:pyfunction:: cv2.convertPointsToHomogeneous(src[, dst]) -> dst
334 335 336 337 338 339 340

    :param src: Input vector of ``N``-dimensional points.

    :param dst: Output vector of ``N+1``-dimensional points.

The function converts points from Euclidean to homogeneous space by appending 1's to the tuple of point coordinates. That is, each point ``(x1, x2, ..., xn)`` is converted to ``(x1, x2, ..., xn, 1)``.

341

342 343

convertPointsFromHomogeneous
344 345
----------------------------
Converts points from homogeneous to Euclidean space.
346

347
.. ocv:function:: void convertPointsFromHomogeneous( InputArray src, OutputArray dst )
348

349
.. ocv:pyfunction:: cv2.convertPointsFromHomogeneous(src[, dst]) -> dst
350 351 352 353 354 355 356

    :param src: Input vector of ``N``-dimensional points.

    :param dst: Output vector of ``N-1``-dimensional points.

The function converts points homogeneous to Euclidean space using perspective projection. That is, each point ``(x1, x2, ... x(n-1), xn)`` is converted to ``(x1/xn, x2/xn, ..., x(n-1)/xn)``. When ``xn=0``, the output point coordinates will be ``(0,0,0,...)``.

357

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
358 359 360

convertPointsHomogeneous
------------------------
361
Converts points to/from homogeneous coordinates.
Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
362

363
.. ocv:function:: void convertPointsHomogeneous( InputArray src, OutputArray dst )
364

365
.. ocv:cfunction:: void cvConvertPointsHomogeneous( const CvMat* src, CvMat* dst )
366

367
    :param src: Input array or vector of 2D, 3D, or 4D points.
368

369
    :param dst: Output vector of 2D, 3D, or 4D points.
370

371
The function converts 2D or 3D points from/to homogeneous coordinates by calling either :ocv:func:`convertPointsToHomogeneous` or :ocv:func:`convertPointsFromHomogeneous`.
372

373
.. note:: The function is obsolete. Use one of the previous two functions instead.
374

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
375

376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400

correctMatches
--------------
Refines coordinates of corresponding points.

.. ocv:function:: void correctMatches( InputArray F, InputArray points1, InputArray points2, OutputArray newPoints1, OutputArray newPoints2 )

.. ocv:pyfunction:: cv2.correctMatches(F, points1, points2[, newPoints1[, newPoints2]]) -> newPoints1, newPoints2

.. ocv:cfunction:: void cvCorrectMatches( CvMat* F, CvMat* points1, CvMat* points2, CvMat* new_points1, CvMat* new_points2 )

    :param F: 3x3 fundamental matrix.

    :param points1: 1xN array containing the first set of points.

    :param points2: 1xN array containing the second set of points.

    :param newPoints1: The optimized points1.

    :param newPoints2: The optimized points2.

The function implements the Optimal Triangulation Method (see Multiple View Geometry for details). For each given point correspondence points1[i] <-> points2[i], and a fundamental matrix F, it computes the corrected correspondences newPoints1[i] <-> newPoints2[i] that minimize the geometric error  :math:`d(points1[i], newPoints1[i])^2 + d(points2[i],newPoints2[i])^2`  (where  :math:`d(a,b)`  is the geometric distance between points  :math:`a`  and  :math:`b` ) subject to the epipolar constraint  :math:`newPoints2^T * F * newPoints1 = 0` .



Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
401
decomposeProjectionMatrix
402 403 404
--------------------------
Decomposes a projection matrix into a rotation matrix and a camera matrix.

405
.. ocv:function:: void decomposeProjectionMatrix( InputArray projMatrix, OutputArray cameraMatrix, OutputArray rotMatrix, OutputArray transVect, OutputArray rotMatrixX=noArray(), OutputArray rotMatrixY=noArray(), OutputArray rotMatrixZ=noArray(), OutputArray eulerAngles=noArray() )
406

407 408
.. ocv:pyfunction:: cv2.decomposeProjectionMatrix(projMatrix[, cameraMatrix[, rotMatrix[, transVect[, rotMatrixX[, rotMatrixY[, rotMatrixZ[, eulerAngles]]]]]]]) -> cameraMatrix, rotMatrix, transVect, rotMatrixX, rotMatrixY, rotMatrixZ, eulerAngles

409
.. ocv:cfunction:: void cvDecomposeProjectionMatrix( const CvMat * projMatr, CvMat * calibMatr, CvMat * rotMatr, CvMat * posVect, CvMat * rotMatrX=NULL, CvMat * rotMatrY=NULL, CvMat * rotMatrZ=NULL, CvPoint3D64f * eulerAngles=NULL )
410

411
    :param projMatrix: 3x4 input projection matrix P.
412

413
    :param cameraMatrix: Output 3x3 camera matrix K.
414

415
    :param rotMatrix: Output 3x3 external rotation matrix R.
416

417
    :param transVect: Output 4x1 translation vector T.
418

419
    :param rotMatrX: Optional 3x3 rotation matrix around x-axis.
420

421
    :param rotMatrY: Optional 3x3 rotation matrix around y-axis.
422

423
    :param rotMatrZ: Optional 3x3 rotation matrix around z-axis.
424

425
    :param eulerAngles: Optional three-element vector containing three Euler angles of rotation in degrees.
426

427
The function computes a decomposition of a projection matrix into a calibration and a rotation matrix and the position of a camera.
428

429
It optionally returns three rotation matrices, one for each axis, and three Euler angles that could be used in OpenGL. Note, there is always more than one sequence of rotations about the three principle axes that results in the same orientation of an object, eg. see [Slabaugh]_. Returned tree rotation matrices and corresponding three Euler angules are only one of the possible solutions.
430

431
The function is based on
432
:ocv:func:`RQDecomp3x3` .
433

434

435

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
436
drawChessboardCorners
437
-------------------------
438 439
Renders the detected chessboard corners.

440
.. ocv:function:: void drawChessboardCorners( InputOutputArray image, Size patternSize, InputArray corners, bool patternWasFound )
441

442
.. ocv:pyfunction:: cv2.drawChessboardCorners(image, patternSize, corners, patternWasFound) -> image
443

444
.. ocv:cfunction:: void cvDrawChessboardCorners( CvArr* image, CvSize pattern_size, CvPoint2D32f* corners, int count, int pattern_was_found )
445

446
    :param image: Destination image. It must be an 8-bit color image.
447

448
    :param patternSize: Number of inner corners per a chessboard row and column ``(patternSize = cv::Size(points_per_row,points_per_column))``.
449

450
    :param corners: Array of detected corners, the output of ``findChessboardCorners``.
451

452
    :param patternWasFound: Parameter indicating whether the complete board was found or not. The return value of :ocv:func:`findChessboardCorners` should be passed here.
453

454
The function draws individual chessboard corners detected either as red circles if the board was not found, or as colored corners connected with lines if the board was found.
455

456

457

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
458
findChessboardCorners
459
-------------------------
460 461
Finds the positions of internal corners of the chessboard.

462
.. ocv:function:: bool findChessboardCorners( InputArray image, Size patternSize, OutputArray corners, int flags=CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE )
463

464 465
.. ocv:pyfunction:: cv2.findChessboardCorners(image, patternSize[, corners[, flags]]) -> retval, corners

466
.. ocv:cfunction:: int cvFindChessboardCorners( const void* image, CvSize pattern_size, CvPoint2D32f* corners, int* corner_count=NULL, int flags=CV_CALIB_CB_ADAPTIVE_THRESH+CV_CALIB_CB_NORMALIZE_IMAGE )
467

468
    :param image: Source chessboard view. It must be an 8-bit grayscale or color image.
469

470
    :param patternSize: Number of inner corners per a chessboard row and column ``( patternSize = cvSize(points_per_row,points_per_colum) = cvSize(columns,rows) )``.
471

472
    :param corners: Output array of detected corners.
473

474
    :param flags: Various operation flags that can be zero or a combination of the following values:
475

476
            * **CV_CALIB_CB_ADAPTIVE_THRESH** Use adaptive thresholding to convert the image to black and white, rather than a fixed threshold level (computed from the average image brightness).
477

478
            * **CV_CALIB_CB_NORMALIZE_IMAGE** Normalize the image gamma with  :ocv:func:`equalizeHist`  before applying fixed or adaptive thresholding.
479

480
            * **CV_CALIB_CB_FILTER_QUADS** Use additional criteria (like contour area, perimeter, square-like shape) to filter out false quads extracted at the contour retrieval stage.
481

482
            * **CALIB_CB_FAST_CHECK** Run a fast check on the image that looks for chessboard corners, and shortcut the call if none is found. This can drastically speed up the call in the degenerate condition when no chessboard is observed.
483

484 485 486
The function attempts to determine
whether the input image is a view of the chessboard pattern and
locate the internal chessboard corners. The function returns a non-zero
487 488
value if all of the corners are found and they are placed
in a certain order (row by row, left to right in every row). Otherwise, if the function fails to find all the corners or reorder
489
them, it returns 0. For example, a regular chessboard has 8 x 8
490 491
squares and 7 x 7 internal corners, that is, points where the black squares touch each other.
The detected coordinates are approximate, and to determine their positions more accurately, the function calls :ocv:func:`cornerSubPix`.
492
You also may use the function :ocv:func:`cornerSubPix` with different parameters if returned coordinates are not accurate enough.
493

494
Sample usage of detecting and drawing chessboard corners: ::
495 496 497 498

    Size patternsize(8,6); //interior number of corners
    Mat gray = ....; //source image
    vector<Point2f> corners; //this will be filled by the detected corners
499 500

    //CALIB_CB_FAST_CHECK saves a lot of time on images
501
    //that do not contain any chessboard corners
502 503
    bool patternfound = findChessboardCorners(gray, patternsize, corners,
            CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE
504
            + CALIB_CB_FAST_CHECK);
505

506
    if(patternfound)
507
      cornerSubPix(gray, corners, Size(11, 11), Size(-1, -1),
508 509
        TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1));

510
    drawChessboardCorners(img, patternsize, Mat(corners), patternfound);
511

512
.. note:: The function requires white space (like a square-thick border, the wider the better) around the board to make the detection more robust in various environments. Otherwise, if there is no border and the background is dark, the outer black squares cannot be segmented properly and so the square grouping and ordering algorithm fails.
513

514

515

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
516
findCirclesGrid
517
-------------------
518
Finds centers in the grid of circles.
519

520
.. ocv:function:: bool findCirclesGrid( InputArray image, Size patternSize, OutputArray centers, int flags=CALIB_CB_SYMMETRIC_GRID, const Ptr<FeatureDetector> &blobDetector = makePtr<SimpleBlobDetector>() )
521

522
.. ocv:pyfunction:: cv2.findCirclesGrid(image, patternSize[, centers[, flags[, blobDetector]]]) -> retval, centers
523

524
    :param image: grid view of input circles; it must be an 8-bit grayscale or color image.
525

526
    :param patternSize: number of circles per row and column ``( patternSize = Size(points_per_row, points_per_colum) )``.
527

528
    :param centers: output array of detected centers.
529

530
    :param flags: various operation flags that can be one of the following values:
531

532
            * **CALIB_CB_SYMMETRIC_GRID** uses symmetric pattern of circles.
533

534
            * **CALIB_CB_ASYMMETRIC_GRID** uses asymmetric pattern of circles.
535

536
            * **CALIB_CB_CLUSTERING** uses a special algorithm for grid detection. It is more robust to perspective distortions but much more sensitive to background clutter.
537

538
    :param blobDetector: feature detector that finds blobs like dark circles on light background.
539

540 541

The function attempts to determine
542
whether the input image contains a grid of circles. If it is, the function locates centers of the circles. The function returns a
543
non-zero value if all of the centers have been found and they have been placed
544
in a certain order (row by row, left to right in every row). Otherwise, if the function fails to find all the corners or reorder
545 546
them, it returns 0.

547
Sample usage of detecting and drawing the centers of circles: ::
548 549 550 551

    Size patternsize(7,7); //number of centers
    Mat gray = ....; //source image
    vector<Point2f> centers; //this will be filled by the detected centers
552

553 554
    bool patternfound = findCirclesGrid(gray, patternsize, centers);

555
    drawChessboardCorners(img, patternsize, Mat(centers), patternfound);
556

557
.. note:: The function requires white space (like a square-thick border, the wider the better) around the board to make the detection more robust in various environments.
558

559

560

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
561
solvePnP
562
------------
563 564
Finds an object pose from 3D-2D point correspondences.

565
.. ocv:function:: bool solvePnP( InputArray objectPoints, InputArray imagePoints, InputArray cameraMatrix, InputArray distCoeffs, OutputArray rvec, OutputArray tvec, bool useExtrinsicGuess=false, int flags=ITERATIVE )
566

567
.. ocv:pyfunction:: cv2.solvePnP(objectPoints, imagePoints, cameraMatrix, distCoeffs[, rvec[, tvec[, useExtrinsicGuess[, flags]]]]) -> retval, rvec, tvec
568

569
.. ocv:cfunction:: void cvFindExtrinsicCameraParams2( const CvMat* object_points, const CvMat* image_points, const CvMat* camera_matrix, const CvMat* distortion_coeffs, CvMat* rotation_vector, CvMat* translation_vector, int use_extrinsic_guess=0 )
570

571
    :param objectPoints: Array of object points in the object coordinate space, 3xN/Nx3 1-channel or 1xN/Nx1 3-channel, where N is the number of points.  ``vector<Point3f>``  can be also passed here.
572

573
    :param imagePoints: Array of corresponding image points, 2xN/Nx2 1-channel or 1xN/Nx1 2-channel, where N is the number of points.  ``vector<Point2f>``  can be also passed here.
574

575
    :param cameraMatrix: Input camera matrix  :math:`A = \vecthreethree{fx}{0}{cx}{0}{fy}{cy}{0}{0}{1}` .
576

alegarda's avatar
alegarda committed
577
    :param distCoeffs: Input vector of distortion coefficients  :math:`(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6],[s_1, s_2, s_3, s_4]])`  of 4, 5, 8 or 12 elements. If the vector is NULL/empty, the zero distortion coefficients are assumed.
578

579
    :param rvec: Output rotation vector (see  :ocv:func:`Rodrigues` ) that, together with  ``tvec`` , brings points from the model coordinate system to the camera coordinate system.
580

581
    :param tvec: Output translation vector.
582

583
    :param useExtrinsicGuess: If true (1), the function uses the provided  ``rvec``  and  ``tvec``  values as initial approximations of the rotation and translation vectors, respectively, and further optimizes them.
584

585
    :param flags: Method for solving a PnP problem:
586

587 588 589
            *  **ITERATIVE** Iterative method is based on Levenberg-Marquardt optimization. In this case the function finds such a pose that minimizes reprojection error, that is the sum of squared distances between the observed projections ``imagePoints`` and the projected (using :ocv:func:`projectPoints` ) ``objectPoints`` .
            *  **P3P**  Method is based on the paper of X.S. Gao, X.-R. Hou, J. Tang, H.-F. Chang "Complete Solution Classification for the Perspective-Three-Point Problem". In this case the function requires exactly four object and image points.
            *  **EPNP** Method has been introduced by F.Moreno-Noguer, V.Lepetit and P.Fua in the paper "EPnP: Efficient Perspective-n-Point Camera Pose Estimation".
590

591
The function estimates the object pose given a set of object points, their corresponding image projections, as well as the camera matrix and the distortion coefficients.
592

593
.. note::
594

595
   * An example of how to use solvePnP for planar augmented reality can be found at opencv_source_code/samples/python2/plane_ar.py
596

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
597 598
solvePnPRansac
------------------
599
Finds an object pose from 3D-2D point correspondences using the RANSAC scheme.
Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
600

601
.. ocv:function:: void solvePnPRansac( InputArray objectPoints, InputArray imagePoints, InputArray cameraMatrix, InputArray distCoeffs, OutputArray rvec, OutputArray tvec, bool useExtrinsicGuess=false, int iterationsCount = 100, float reprojectionError = 8.0, int minInliersCount = 100, OutputArray inliers = noArray(), int flags = ITERATIVE )
602

603
.. ocv:pyfunction:: cv2.solvePnPRansac(objectPoints, imagePoints, cameraMatrix, distCoeffs[, rvec[, tvec[, useExtrinsicGuess[, iterationsCount[, reprojectionError[, minInliersCount[, inliers[, flags]]]]]]]]) -> rvec, tvec, inliers
604

605
    :param objectPoints: Array of object points in the object coordinate space, 3xN/Nx3 1-channel or 1xN/Nx1 3-channel, where N is the number of points.   ``vector<Point3f>``  can be also passed here.
606

607
    :param imagePoints: Array of corresponding image points, 2xN/Nx2 1-channel or 1xN/Nx1 2-channel, where N is the number of points.  ``vector<Point2f>``  can be also passed here.
608

609
    :param cameraMatrix: Input camera matrix  :math:`A = \vecthreethree{fx}{0}{cx}{0}{fy}{cy}{0}{0}{1}` .
610

alegarda's avatar
alegarda committed
611
    :param distCoeffs: Input vector of distortion coefficients  :math:`(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6],[s_1, s_2, s_3, s_4]])`  of 4, 5, 8 or 12 elements. If the vector is NULL/empty, the zero distortion coefficients are assumed.
612

613
    :param rvec: Output rotation vector (see  :ocv:func:`Rodrigues` ) that, together with  ``tvec`` , brings points from the model coordinate system to the camera coordinate system.
614

615
    :param tvec: Output translation vector.
616

617
    :param useExtrinsicGuess: If true (1), the function uses the provided  ``rvec``  and  ``tvec`` values as initial approximations of the rotation and translation vectors, respectively, and further optimizes them.
618

619 620
    :param iterationsCount: Number of iterations.

621
    :param reprojectionError: Inlier threshold value used by the RANSAC procedure. The parameter value is the maximum allowed distance between the observed and computed point projections to consider it an inlier.
622

623
    :param minInliersCount: Number of inliers. If the algorithm at some stage finds more inliers than ``minInliersCount`` , it finishes.
624

625
    :param inliers: Output vector that contains indices of inliers in ``objectPoints`` and ``imagePoints`` .
626

627 628
    :param flags: Method for solving a PnP problem (see  :ocv:func:`solvePnP` ).

629
The function estimates an object pose given a set of object points, their corresponding image projections, as well as the camera matrix and the distortion coefficients. This function finds such a pose that minimizes reprojection error, that is, the sum of squared distances between the observed projections ``imagePoints`` and the projected (using
630
:ocv:func:`projectPoints` ) ``objectPoints``. The use of RANSAC makes the function resistant to outliers. The function is parallelized with the TBB library.
631

632

633

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
634
findFundamentalMat
635
----------------------
636 637
Calculates a fundamental matrix from the corresponding points in two images.

638
.. ocv:function:: Mat findFundamentalMat( InputArray points1, InputArray points2, int method=FM_RANSAC, double param1=3., double param2=0.99, OutputArray mask=noArray() )
639

640 641
.. ocv:pyfunction:: cv2.findFundamentalMat(points1, points2[, method[, param1[, param2[, mask]]]]) -> retval, mask

642
.. ocv:cfunction:: int cvFindFundamentalMat( const CvMat* points1, const CvMat* points2, CvMat* fundamental_matrix, int method=CV_FM_RANSAC, double param1=3., double param2=0.99, CvMat* status=NULL )
643

644
    :param points1: Array of  ``N``  points from the first image. The point coordinates should be floating-point (single or double precision).
645

646
    :param points2: Array of the second image points of the same size and format as  ``points1`` .
647

648
    :param method: Method for computing a fundamental matrix.
649

650 651 652 653
            * **CV_FM_7POINT** for a 7-point algorithm.  :math:`N = 7`
            * **CV_FM_8POINT** for an 8-point algorithm.  :math:`N \ge 8`
            * **CV_FM_RANSAC** for the RANSAC algorithm.  :math:`N \ge 8`
            * **CV_FM_LMEDS** for the LMedS algorithm.  :math:`N \ge 8`
654

655
    :param param1: Parameter used for RANSAC. It is the maximum distance from a point to an epipolar line in pixels, beyond which the point is considered an outlier and is not used for computing the final fundamental matrix. It can be set to something like 1-3, depending on the accuracy of the point localization, image resolution, and the image noise.
656

657
    :param param2: Parameter used for the RANSAC or LMedS methods only. It specifies a desirable level of confidence (probability) that the estimated matrix is correct.
658

659
    :param status: Output array of N elements, every element of which is set to 0 for outliers and to 1 for the other points. The array is computed only in the RANSAC and LMedS methods. For other methods, it is set to all 1's.
660

661
The epipolar geometry is described by the following equation:
662 663 664

.. math::

665
    [p_2; 1]^T F [p_1; 1] = 0
666

667
where
668
:math:`F` is a fundamental matrix,
669 670
:math:`p_1` and
:math:`p_2` are corresponding points in the first and the second images, respectively.
671

672
The function calculates the fundamental matrix using one of four methods listed above and returns
673
the found fundamental matrix. Normally just one matrix is found. But in case of the 7-point algorithm, the function may return up to 3 solutions (
674
:math:`9 \times 3` matrix that stores all 3 matrices sequentially).
675 676

The calculated fundamental matrix may be passed further to
677
:ocv:func:`computeCorrespondEpilines` that finds the epipolar lines
678
corresponding to the specified points. It can also be passed to
679
:ocv:func:`stereoRectifyUncalibrated` to compute the rectification transformation. ::
680

681
    // Example. Estimation of fundamental matrix using the RANSAC algorithm
682 683 684
    int point_count = 100;
    vector<Point2f> points1(point_count);
    vector<Point2f> points2(point_count);
685

686 687 688 689 690 691
    // initialize the points here ... */
    for( int i = 0; i < point_count; i++ )
    {
        points1[i] = ...;
        points2[i] = ...;
    }
692

693 694 695
    Mat fundamental_matrix =
     findFundamentalMat(points1, points2, FM_RANSAC, 3, 0.99);

696 697 698 699
findEssentialMat
------------------
Calculates an essential matrix from the corresponding points in two images.

700
.. ocv:function:: Mat findEssentialMat( InputArray points1, InputArray points2, double focal=1.0, Point2d pp=Point2d(0, 0), int method=RANSAC, double prob=0.999, double threshold=1.0, OutputArray mask=noArray() )
701

702
    :param points1: Array of  ``N`` ``(N >= 5)`` 2D points from the first image. The point coordinates should be floating-point (single or double precision).
703 704 705

    :param points2: Array of the second image points of the same size and format as  ``points1`` .

706
    :param focal: focal length of the camera. Note that this function assumes that ``points1`` and ``points2`` are feature points from cameras with same focal length and principle point.
707

708
    :param pp: principle point of the camera.
709 710 711

    :param method: Method for computing a fundamental matrix.

712 713
            * **RANSAC** for the RANSAC algorithm.
            * **MEDS** for the LMedS algorithm.
714 715 716 717 718

    :param threshold: Parameter used for RANSAC. It is the maximum distance from a point to an epipolar line in pixels, beyond which the point is considered an outlier and is not used for computing the final fundamental matrix. It can be set to something like 1-3, depending on the accuracy of the point localization, image resolution, and the image noise.

    :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.

719
    :param mask: Output array of N elements, every element of which is set to 0 for outliers and to 1 for the other points. The array is computed only in the RANSAC and LMedS methods.
720

Bo Li's avatar
Bo Li committed
721
This function estimates essential matrix based on the five-point algorithm solver in [Nister03]_. [SteweniusCFS]_ is also a related.
722 723 724 725 726 727
The epipolar geometry is described by the following equation:

.. math::

    [p_2; 1]^T K^T E K [p_1; 1] = 0 \\

728
    K =
729 730 731 732 733 734 735 736 737 738
    \begin{bmatrix}
    f & 0 & x_{pp}  \\
    0 & f & y_{pp}  \\
    0 & 0 & 1
    \end{bmatrix}

where
:math:`E` is an essential matrix,
:math:`p_1` and
:math:`p_2` are corresponding points in the first and the second images, respectively.
739
The result of this function may be passed further to ``decomposeEssentialMat()`` or ``recoverPose()`` to recover the relative pose between cameras.
740 741 742

decomposeEssentialMat
-------------------------
743
Decompose an essential matrix to possible rotations and translation.
744 745 746

.. ocv:function:: void decomposeEssentialMat( InputArray E, OutputArray R1, OutputArray R2, OutputArray t )

747
    :param E: The input essential matrix.
748

749
    :param R1: One possible rotation matrix.
750

751
    :param R2: Another possible rotation matrix.
752

753
    :param t: One possible translation.
754

755 756 757 758 759 760
This function decompose an essential matrix ``E`` using svd decomposition [HartleyZ00]_. Generally 4 possible poses exists for a given ``E``.
They are
:math:`[R_1, t]`,
:math:`[R_1, -t]`,
:math:`[R_2, t]`,
:math:`[R_2, -t]`.
Bo Li's avatar
Bo Li committed
761
By decomposing ``E``, you can only get the direction of the translation, so the function returns unit ``t``.
762 763 764 765


recoverPose
---------------
766 767
Recover relative camera rotation and translation from an estimated essential matrix and the corresponding points in two images, using cheirality check.
Returns the number of inliers which pass the check.
768 769 770

.. ocv:function:: int recoverPose( InputArray E, InputArray points1, InputArray points2, OutputArray R, OutputArray t, double focal = 1.0, Point2d pp = Point2d(0, 0), InputOutputArray mask = noArray())

771
    :param E: The input essential matrix.
772 773 774 775 776

    :param points1: Array of  ``N``  2D points from the first image. The point coordinates should be floating-point (single or double precision).

    :param points2: Array of the second image points of the same size and format as  ``points1`` .

777
    :param R: Recovered relative rotation.
778

779
    :param t: Recoverd relative translation.
780

781
    :param focal: Focal length of the camera. Note that this function assumes that ``points1`` and ``points2`` are feature points from cameras with same focal length and principle point.
782

783
    :param pp: Principle point of the camera.
784

785 786 787 788
    :param mask: Input/output mask for inliers in ``points1`` and ``points2``.
                 If it is not empty, then it marks inliers in ``points1`` and ``points2`` for then given essential matrix ``E``.
                 Only these inliers will be used to recover pose.
                 In the output mask only inliers which pass the cheirality check.
789

790 791 792 793
This function decomposes an essential matrix using ``decomposeEssentialMat()`` and then verifies possible pose hypotheses by doing cheirality check.
The cheirality check basically means that the triangulated 3D points should have positive depth. Some details can be found from [Nister03]_.

This function can be used to process output ``E`` and ``mask`` from ``findEssentialMat()``.
794 795 796 797 798 799 800 801 802 803 804 805 806 807
In this scenario, ``points1`` and ``points2`` are the same input for ``findEssentialMat()``. ::

    // Example. Estimation of fundamental matrix using the RANSAC algorithm
    int point_count = 100;
    vector<Point2f> points1(point_count);
    vector<Point2f> points2(point_count);

    // initialize the points here ... */
    for( int i = 0; i < point_count; i++ )
    {
        points1[i] = ...;
        points2[i] = ...;
    }

808 809 810
    double focal = 1.0;
    cv::Point2d pp(0.0, 0.0);
    Mat E, R, t, mask;
811

812
    E = findEssentialMat(points1, points2, focal, pp, RANSAC, 0.999, 1.0, mask);
813 814
    recoverPose(E, points1, points2, R, t, focal, pp, mask);

815

816

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
817
findHomography
818
------------------
819 820
Finds a perspective transformation between two planes.

821
.. ocv:function:: Mat findHomography( InputArray srcPoints, InputArray dstPoints, int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray() )
822

823 824
.. ocv:pyfunction:: cv2.findHomography(srcPoints, dstPoints[, method[, ransacReprojThreshold[, mask]]]) -> retval, mask

825
.. ocv:cfunction:: int cvFindHomography( const CvMat* src_points, const CvMat* dst_points, CvMat* homography, int method=0, double ransacReprojThreshold=3, CvMat* mask=0 )
826

827
    :param srcPoints: Coordinates of the points in the original plane, a matrix of the type  ``CV_32FC2``  or ``vector<Point2f>`` .
828

829
    :param dstPoints: Coordinates of the points in the target plane, a matrix of the type  ``CV_32FC2``  or a  ``vector<Point2f>`` .
830

831
    :param method:  Method used to computed a homography matrix. The following methods are possible:
832

833
            * **0** - a regular method using all the points
834

835
            * **RANSAC** - RANSAC-based robust method
836

837
            * **LMEDS** - Least-Median robust method
838

839
    :param ransacReprojThreshold: Maximum allowed reprojection error to treat a point pair as an inlier (used in the RANSAC method only). That is, if
840

841
        .. math::
842

843
            \| \texttt{dstPoints} _i -  \texttt{convertPointsHomogeneous} ( \texttt{H} * \texttt{srcPoints} _i) \|  >  \texttt{ransacReprojThreshold}
844

845
        then the point  :math:`i`  is considered an outlier. If  ``srcPoints``  and  ``dstPoints``  are measured in pixels, it usually makes sense to set this parameter somewhere in the range of 1 to 10.
846

847
    :param mask: Optional output mask set by a robust method ( ``RANSAC``  or  ``LMEDS`` ).  Note that the input mask values are ignored.
848

849
The functions find and return the perspective transformation :math:`H` between the source and the destination planes:
850 851 852

.. math::

853 854
    s_i  \vecthree{x'_i}{y'_i}{1} \sim H  \vecthree{x_i}{y_i}{1}

855
so that the back-projection error
856 857

.. math::
858

859
    \sum _i \left ( x'_i- \frac{h_{11} x_i + h_{12} y_i + h_{13}}{h_{31} x_i + h_{32} y_i + h_{33}} \right )^2+ \left ( y'_i- \frac{h_{21} x_i + h_{22} y_i + h_{23}}{h_{31} x_i + h_{32} y_i + h_{33}} \right )^2
860

861
is minimized. If the parameter ``method`` is set to the default value 0, the function
862
uses all the point pairs to compute an initial homography estimate with a simple least-squares scheme.
863 864

However, if not all of the point pairs (
865
:math:`srcPoints_i`,:math:`dstPoints_i` ) fit the rigid perspective transformation (that is, there
866
are some outliers), this initial estimate will be poor.
867 868
In this case, you can use one of the two robust methods. Both methods, ``RANSAC`` and ``LMeDS`` , try many different random subsets
of the corresponding point pairs (of four pairs each), estimate
869
the homography matrix using this subset and a simple least-square
870
algorithm, and then compute the quality/goodness of the computed homography
871 872 873 874 875
(which is the number of inliers for RANSAC or the median re-projection
error for LMeDs). The best subset is then used to produce the initial
estimate of the homography matrix and the mask of inliers/outliers.

Regardless of the method, robust or not, the computed homography
876 877
matrix is refined further (using inliers only in case of a robust
method) with the Levenberg-Marquardt method to reduce the
878 879
re-projection error even more.

880 881 882
The method ``RANSAC`` can handle practically any ratio of outliers
but it needs a threshold to distinguish inliers from outliers.
The method ``LMeDS`` does not need any threshold but it works
883 884
correctly only when there are more than 50% of inliers. Finally,
if there are no outliers and the noise is rather small, use the default method (``method=0``).
885 886

The function is used to find initial intrinsic and extrinsic matrices.
887
Homography matrix is determined up to a scale. Thus, it is normalized so that
888
:math:`h_{33}=1` .
889

890
.. seealso::
891

892 893 894 895 896
    :ocv:func:`getAffineTransform`,
    :ocv:func:`getPerspectiveTransform`,
    :ocv:func:`estimateRigidTransform`,
    :ocv:func:`warpPerspective`,
    :ocv:func:`perspectiveTransform`
897

898
.. note::
899

900
   * A example on calculating a homography for image matching can be found at opencv_source_code/samples/cpp/video_homography.cpp
901

902 903
estimateAffine3D
--------------------
904 905
Computes an optimal affine transformation between two 3D point sets.

906
.. ocv:function:: int estimateAffine3D(InputArray src, InputArray dst, OutputArray out,  OutputArray inliers, double ransacThreshold = 3, double confidence = 0.99)
907

908
.. ocv:pyfunction:: cv2.estimateAffine3D(src, dst[, out[, inliers[, ransacThreshold[, confidence]]]]) -> retval, out, inliers
909

910
    :param src: First input 3D point set.
911

912
    :param dst: Second input 3D point set.
913 914 915

    :param out: Output 3D affine transformation matrix  :math:`3 \times 4` .

916
    :param inliers: Output vector indicating which points are inliers.
917 918

    :param ransacThreshold: Maximum reprojection error in the RANSAC algorithm to consider a point as an inlier.
919

920
    :param confidence: Confidence level, between 0 and 1, for the estimated transformation. Anything between 0.95 and 0.99 is usually good enough. Values too close to 1 can slow down the estimation significantly. Values lower than 0.8-0.9 can result in an incorrectly estimated transformation.
921 922 923 924

The function estimates an optimal 3D affine transformation between two 3D point sets using the RANSAC algorithm.


925 926 927 928
filterSpeckles
--------------
Filters off small noise blobs (speckles) in the disparity map

929
.. ocv:function:: void filterSpeckles( InputOutputArray img, double newVal, int maxSpeckleSize, double maxDiff, InputOutputArray buf=noArray() )
930

931
.. ocv:pyfunction:: cv2.filterSpeckles(img, newVal, maxSpeckleSize, maxDiff[, buf]) -> img, buf
932 933

    :param img: The input 16-bit signed disparity image
934

935
    :param newVal: The disparity value used to paint-off the speckles
936

937
    :param maxSpeckleSize: The maximum speckle size to consider it a speckle. Larger blobs are not affected by the algorithm
938

939
    :param maxDiff: Maximum difference between neighbor disparity pixels to put them into the same blob. Note that since StereoBM, StereoSGBM and may be other algorithms return a fixed-point disparity map, where disparity values are multiplied by 16, this scale factor should be taken into account when specifying this parameter value.
940

941
    :param buf: The optional temporary buffer to avoid memory allocation within the function.
942

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
943 944

getOptimalNewCameraMatrix
945
-----------------------------
946 947
Returns the new camera matrix based on the free scaling parameter.

948
.. ocv:function:: Mat getOptimalNewCameraMatrix( InputArray cameraMatrix, InputArray distCoeffs, Size imageSize, double alpha, Size newImgSize=Size(), Rect* validPixROI=0, bool centerPrincipalPoint=false )
949

950 951
.. ocv:pyfunction:: cv2.getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, alpha[, newImgSize[, centerPrincipalPoint]]) -> retval, validPixROI

952
.. ocv:cfunction:: void cvGetOptimalNewCameraMatrix( const CvMat* camera_matrix, const CvMat* dist_coeffs, CvSize image_size, double alpha, CvMat* new_camera_matrix, CvSize new_imag_size=cvSize(0,0), CvRect* valid_pixel_ROI=0, int center_principal_point=0 )
953

954
    :param cameraMatrix: Input camera matrix.
955

alegarda's avatar
alegarda committed
956
    :param distCoeffs: Input vector of distortion coefficients  :math:`(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6],[s_1, s_2, s_3, s_4]])`  of 4, 5, 8 or 12 elements. If the vector is NULL/empty, the zero distortion coefficients are assumed.
957

958
    :param imageSize: Original image size.
959

960 961
    :param alpha: Free scaling parameter between 0 (when all the pixels in the undistorted image are valid) and 1 (when all the source image pixels are retained in the undistorted image). See  :ocv:func:`stereoRectify` for details.

962
    :param new_camera_matrix: Output new camera matrix.
963

964
    :param new_imag_size: Image size after rectification. By default,it is set to  ``imageSize`` .
965

966
    :param validPixROI: Optional output rectangle that outlines all-good-pixels region in the undistorted image. See  ``roi1, roi2``  description in  :ocv:func:`stereoRectify` .
967 968

    :param centerPrincipalPoint: Optional flag that indicates whether in the new camera matrix the principal point should be at the image center or not. By default, the principal point is chosen to best fit a subset of the source image (determined by ``alpha``) to the corrected image.
969

970
The function computes and returns
971
the optimal new camera matrix based on the free scaling parameter. By varying  this parameter, you may retrieve only sensible pixels ``alpha=0`` , keep all the original image pixels if there is valuable information in the corners ``alpha=1`` , or get something in between. When ``alpha>0`` , the undistortion result is likely to have some black pixels corresponding to "virtual" pixels outside of the captured distorted image. The original camera matrix, distortion coefficients, the computed new camera matrix, and ``newImageSize`` should be passed to
972 973
:ocv:func:`initUndistortRectifyMap` to produce the maps for
:ocv:func:`remap` .
974

975

976

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
977
initCameraMatrix2D
978
----------------------
979 980
Finds an initial camera matrix from 3D-2D point correspondences.

981
.. ocv:function:: Mat initCameraMatrix2D( InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints, Size imageSize, double aspectRatio=1.0 )
982

983
.. ocv:pyfunction:: cv2.initCameraMatrix2D(objectPoints, imagePoints, imageSize[, aspectRatio]) -> retval
984

985
.. ocv:cfunction:: void cvInitIntrinsicParams2D( const CvMat* object_points, const CvMat* image_points, const CvMat* npoints, CvSize image_size, CvMat* camera_matrix, double aspect_ratio=1. )
986 987

    :param objectPoints: Vector of vectors of the calibration pattern points in the calibration pattern coordinate space. In the old interface all the per-view vectors are concatenated. See :ocv:func:`calibrateCamera` for details.
988 989 990

    :param imagePoints: Vector of vectors of the projections of the calibration pattern points. In the old interface all the per-view vectors are concatenated.

991
    :param npoints: The integer vector of point counters for each view.
992

993
    :param imageSize: Image size in pixels used to initialize the principal point.
994

995
    :param aspectRatio: If it is zero or negative, both  :math:`f_x`  and  :math:`f_y`  are estimated independently. Otherwise,  :math:`f_x = f_y * \texttt{aspectRatio}` .
996

997 998
The function estimates and returns an initial camera matrix for the camera calibration process.
Currently, the function only supports planar calibration patterns, which are patterns where each object point has z-coordinate =0.
999

1000

1001

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
1002
matMulDeriv
1003
---------------
1004
Computes partial derivatives of the matrix product for each multiplied matrix.
1005

1006
.. ocv:function:: void matMulDeriv( InputArray A, InputArray B, OutputArray dABdA, OutputArray dABdB )
1007

1008
.. ocv:pyfunction:: cv2.matMulDeriv(A, B[, dABdA[, dABdB]]) -> dABdA, dABdB
1009

1010
    :param A: First multiplied matrix.
1011

1012
    :param B: Second multiplied matrix.
1013

1014
    :param dABdA: First output derivative matrix  ``d(A*B)/dA``  of size  :math:`\texttt{A.rows*B.cols} \times {A.rows*A.cols}` .
1015

1016
    :param dABdB: Second output derivative matrix  ``d(A*B)/dB``  of size  :math:`\texttt{A.rows*B.cols} \times {B.rows*B.cols}` .
1017

1018 1019
The function computes partial derivatives of the elements of the matrix product
:math:`A*B` with regard to the elements of each of the two input matrices. The function is used to compute the Jacobian matrices in
1020
:ocv:func:`stereoCalibrate`  but can also be used in any other similar optimization function.
1021

1022

1023

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
1024
projectPoints
1025
-----------------
1026
Projects 3D points to an image plane.
1027

1028
.. ocv:function:: void projectPoints( InputArray objectPoints, InputArray rvec, InputArray tvec, InputArray cameraMatrix, InputArray distCoeffs, OutputArray imagePoints, OutputArray jacobian=noArray(), double aspectRatio=0 )
1029

1030 1031
.. ocv:pyfunction:: cv2.projectPoints(objectPoints, rvec, tvec, cameraMatrix, distCoeffs[, imagePoints[, jacobian[, aspectRatio]]]) -> imagePoints, jacobian

1032 1033
.. ocv:cfunction:: void cvProjectPoints2( const CvMat* object_points, const CvMat* rotation_vector, const CvMat* translation_vector, const CvMat* camera_matrix, const CvMat* distortion_coeffs, CvMat* image_points, CvMat* dpdrot=NULL, CvMat* dpdt=NULL, CvMat* dpdf=NULL, CvMat* dpdc=NULL, CvMat* dpddist=NULL, double aspect_ratio=0 )

1034
    :param objectPoints: Array of object points, 3xN/Nx3 1-channel or 1xN/Nx1 3-channel  (or  ``vector<Point3f>`` ), where N is the number of points in the view.
1035

1036
    :param rvec: Rotation vector. See  :ocv:func:`Rodrigues` for details.
1037

1038
    :param tvec: Translation vector.
1039

1040
    :param cameraMatrix: Camera matrix  :math:`A = \vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{_1}` .
1041

1042
    :param distCoeffs: Input vector of distortion coefficients  :math:`(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6],[s_1, s_2, s_3, s_4]])`  of 4, 5, 8 or 12 elements. If the vector is NULL/empty, the zero distortion coefficients are assumed.
1043

1044
    :param imagePoints: Output array of image points, 2xN/Nx2 1-channel or 1xN/Nx1 2-channel, or  ``vector<Point2f>`` .
1045

1046
    :param jacobian: Optional output 2Nx(10+<numDistCoeffs>) jacobian matrix of derivatives of image points with respect to components of the rotation vector, translation vector, focal lengths, coordinates of the principal point and the distortion coefficients. In the old interface different components of the jacobian are returned via different output parameters.
1047

1048
    :param aspectRatio: Optional "fixed aspect ratio" parameter. If the parameter is not 0, the function assumes that the aspect ratio (*fx/fy*) is fixed and correspondingly adjusts the jacobian matrix.
1049 1050 1051

The function computes projections of 3D
points to the image plane given intrinsic and extrinsic camera
1052
parameters. Optionally, the function computes Jacobians - matrices
1053 1054
of partial derivatives of image points coordinates (as functions of all the
input parameters) with respect to the particular parameters, intrinsic and/or
1055
extrinsic. The Jacobians are used during the global optimization
1056
in
1057 1058
:ocv:func:`calibrateCamera`,
:ocv:func:`solvePnP`, and
1059
:ocv:func:`stereoCalibrate` . The
1060
function itself can also be used to compute a re-projection error given the
1061 1062
current intrinsic and extrinsic parameters.

1063
.. note:: By setting ``rvec=tvec=(0,0,0)``  or by setting ``cameraMatrix`` to a 3x3 identity matrix, or by passing zero distortion coefficients, you can get various useful partial cases of the function. This means that you can compute the distorted coordinates for a sparse set of points or apply a perspective transformation (and also compute the derivatives) in the ideal zero-distortion setup.
1064

1065

1066

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
1067
reprojectImageTo3D
1068
----------------------
1069
Reprojects a disparity image to 3D space.
1070

1071
.. ocv:function:: void reprojectImageTo3D( InputArray disparity, OutputArray _3dImage, InputArray Q, bool handleMissingValues=false, int ddepth=-1 )
1072

1073 1074
.. ocv:pyfunction:: cv2.reprojectImageTo3D(disparity, Q[, _3dImage[, handleMissingValues[, ddepth]]]) -> _3dImage

1075
.. ocv:cfunction:: void cvReprojectImageTo3D( const CvArr* disparityImage, CvArr* _3dImage, const CvMat* Q, int handleMissingValues=0 )
1076

1077
    :param disparity: Input single-channel 8-bit unsigned, 16-bit signed, 32-bit signed or 32-bit floating-point disparity image.
1078

1079
    :param _3dImage: Output 3-channel floating-point image of the same size as  ``disparity`` . Each element of  ``_3dImage(x,y)``  contains 3D coordinates of the point  ``(x,y)``  computed from the disparity map.
1080

1081
    :param Q: :math:`4 \times 4`  perspective transformation matrix that can be obtained with  :ocv:func:`stereoRectify`.
1082

1083
    :param handleMissingValues: Indicates, whether the function should handle missing values (i.e. points where the disparity was not computed). If ``handleMissingValues=true``, then pixels with the minimal disparity that corresponds to the outliers (see  :ocv:funcx:`StereoMatcher::compute` ) are transformed to 3D points with a very large Z value (currently set to 10000).
1084

1085
    :param ddepth: The optional output array depth. If it is ``-1``, the output image will have ``CV_32F`` depth. ``ddepth`` can also be set to ``CV_16S``, ``CV_32S`` or ``CV_32F``.
1086

1087
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 computes:
1088 1089 1090

.. math::

1091
    \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}
1092

1093 1094
The matrix ``Q`` can be an arbitrary
:math:`4 \times 4` matrix (for example, the one computed by
1095 1096
:ocv:func:`stereoRectify`). To reproject a sparse set of points {(x,y,d),...} to 3D space, use
:ocv:func:`perspectiveTransform` .
1097

1098

1099

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
1100
RQDecomp3x3
1101
---------------
1102
Computes an RQ decomposition of 3x3 matrices.
1103

1104
.. ocv:function:: Vec3d RQDecomp3x3( InputArray src, OutputArray mtxR, OutputArray mtxQ, OutputArray Qx=noArray(), OutputArray Qy=noArray(), OutputArray Qz=noArray() )
1105

1106 1107
.. ocv:pyfunction:: cv2.RQDecomp3x3(src[, mtxR[, mtxQ[, Qx[, Qy[, Qz]]]]]) -> retval, mtxR, mtxQ, Qx, Qy, Qz

1108
.. ocv:cfunction:: void cvRQDecomp3x3( const CvMat * matrixM, CvMat * matrixR, CvMat * matrixQ, CvMat * matrixQx=NULL, CvMat * matrixQy=NULL, CvMat * matrixQz=NULL, CvPoint3D64f * eulerAngles=NULL )
1109

1110
    :param src: 3x3 input matrix.
1111

1112
    :param mtxR: Output 3x3 upper-triangular matrix.
1113

1114
    :param mtxQ: Output 3x3 orthogonal matrix.
1115

1116
    :param Qx: Optional output 3x3 rotation matrix around x-axis.
1117

1118
    :param Qy: Optional output 3x3 rotation matrix around y-axis.
1119

1120
    :param Qz: Optional output 3x3 rotation matrix around z-axis.
1121

1122
The function computes a RQ decomposition using the given rotations. This function is used in
1123
:ocv:func:`decomposeProjectionMatrix` to decompose the left 3x3 submatrix of a projection matrix into a camera and a rotation matrix.
1124

1125
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 sequence of rotations about the three principle axes that results in the same orientation of an object, eg. see [Slabaugh]_. Returned tree rotation matrices and corresponding three Euler angules are only one of the possible solutions.
1126

1127

1128

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
1129
Rodrigues
1130
-------------
1131 1132
Converts a rotation matrix to a rotation vector or vice versa.

1133
.. ocv:function:: void Rodrigues(InputArray src, OutputArray dst, OutputArray jacobian=noArray())
1134

1135 1136 1137 1138
.. ocv:pyfunction:: cv2.Rodrigues(src[, dst[, jacobian]]) -> dst, jacobian

.. ocv:cfunction:: int cvRodrigues2( const CvMat* src, CvMat* dst, CvMat* jacobian=0 )

1139
    :param src: Input rotation vector (3x1 or 1x3) or rotation matrix (3x3).
1140

1141
    :param dst: Output rotation matrix (3x3) or rotation vector (3x1 or 1x3), respectively.
1142

1143
    :param jacobian: Optional output Jacobian matrix, 3x9 or 9x3, which is a matrix of partial derivatives of the output array components with respect to the input array components.
1144 1145 1146

.. math::

1147
    \begin{array}{l} \theta \leftarrow norm(r) \\ r  \leftarrow r/ \theta \\ R =  \cos{\theta} I + (1- \cos{\theta} ) r r^T +  \sin{\theta} \vecthreethree{0}{-r_z}{r_y}{r_z}{0}{-r_x}{-r_y}{r_x}{0} \end{array}
1148

1149
Inverse transformation can be also done easily, since
1150 1151 1152

.. math::

1153
    \sin ( \theta ) \vecthreethree{0}{-r_z}{r_y}{r_z}{0}{-r_x}{-r_y}{r_x}{0} = \frac{R - R^T}{2}
1154

1155
A rotation vector is a convenient and most compact representation of a rotation matrix
1156
(since any rotation matrix has just 3 degrees of freedom). The representation is
1157
used in the global 3D geometry optimization procedures like
1158 1159 1160
:ocv:func:`calibrateCamera`,
:ocv:func:`stereoCalibrate`, or
:ocv:func:`solvePnP` .
1161

1162

1163 1164 1165
StereoMatcher
-------------
.. ocv:class:: StereoMatcher : public Algorithm
1166

1167
The base class for stereo correspondence algorithms.
1168

1169 1170 1171
StereoMatcher::compute
-----------------------
Computes disparity map for the specified stereo pair
1172

1173
.. ocv:function:: void StereoMatcher::compute( InputArray left, InputArray right, OutputArray disparity )
Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
1174

Andrey Kamaev's avatar
Andrey Kamaev committed
1175
.. ocv:pyfunction:: cv2.StereoBM.compute(left, right[, disparity]) -> disparity
Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
1176

1177
    :param left: Left 8-bit single-channel image.
1178

1179
    :param right: Right image of the same size and the same type as the left one.
1180

1181
    :param disparity: Output disparity map. It has the same size as the input images. Some algorithms, like StereoBM or StereoSGBM compute 16-bit fixed-point disparity map (where each disparity value has 4 fractional bits), whereas other algorithms output 32-bit floating-point disparity map.
1182 1183


1184 1185 1186
StereoBM
--------
.. ocv:class:: StereoBM : public StereoMatcher
1187

1188
Class for computing stereo correspondence using the block matching algorithm, introduced and contributed to OpenCV by K. Konolige.
1189

1190
.. Sample code:
Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
1191

1192
   (Ocl) An example for using the stereoBM matching algorithm can be found at opencv_source_code/samples/ocl/stereo_match.cpp
1193

1194 1195 1196
createStereoBM
------------------
Creates StereoBM object
Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
1197

1198
.. ocv:function:: Ptr<StereoBM> createStereoBM(int numDisparities=0, int blockSize=21)
Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
1199

Andrey Kamaev's avatar
Andrey Kamaev committed
1200
.. ocv:pyfunction:: cv2.createStereoBM([numDisparities[, blockSize]]) -> retval
Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
1201

1202
    :param numDisparities: the disparity search range. For each pixel algorithm will find the best disparity from 0 (default minimum disparity) to ``numDisparities``. The search range can then be shifted by changing the minimum disparity.
1203

1204
    :param blockSize: the linear size of the blocks compared by the algorithm. The size should be odd (as the block is centered at the current pixel). Larger block size implies smoother, though less accurate disparity map. Smaller block size gives more detailed disparity map, but there is higher chance for algorithm to find a wrong correspondence.
1205

1206
The function create ``StereoBM`` object. You can then call ``StereoBM::compute()`` to compute disparity for a specific stereo pair.
Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
1207

1208 1209 1210

StereoSGBM
----------
Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
1211

1212
.. ocv:class:: StereoSGBM : public StereoMatcher
1213

1214
The class implements the modified H. Hirschmuller algorithm [HH08]_ that differs from the original one as follows:
1215

1216
 * By default, the algorithm is single-pass, which means that you consider only 5 directions instead of 8. Set ``mode=StereoSGBM::MODE_HH`` in ``createStereoSGBM`` to run the full variant of the algorithm but beware that it may consume a lot of memory.
1217

1218
 * The algorithm matches blocks, not individual pixels. Though, setting ``blockSize=1`` reduces the blocks to single pixels.
1219

1220
 * Mutual information cost function is not implemented. Instead, a simpler Birchfield-Tomasi sub-pixel metric from [BT98]_ is used. Though, the color images are supported as well.
1221

1222
 * Some pre- and post- processing steps from K. Konolige algorithm ``StereoBM``  are included, for example: pre-filtering (``StereoBM::PREFILTER_XSOBEL`` type) and post-filtering (uniqueness check, quadratic interpolation and speckle filtering).
1223

1224
.. note::
1225

1226
   * (Python) An example illustrating the use of the StereoSGBM matching algorithm can be found at opencv_source_code/samples/python2/stereo_match.py
1227

1228
createStereoSGBM
1229
--------------------------
1230
Creates StereoSGBM object
1231

1232
.. ocv:function:: Ptr<StereoSGBM> createStereoSGBM( int minDisparity, int numDisparities, int blockSize, int P1=0, int P2=0, int disp12MaxDiff=0, int preFilterCap=0, int uniquenessRatio=0, int speckleWindowSize=0, int speckleRange=0, int mode=StereoSGBM::MODE_SGBM)
1233

Andrey Kamaev's avatar
Andrey Kamaev committed
1234
.. ocv:pyfunction:: cv2.createStereoSGBM(minDisparity, numDisparities, blockSize[, P1[, P2[, disp12MaxDiff[, preFilterCap[, uniquenessRatio[, speckleWindowSize[, speckleRange[, mode]]]]]]]]) -> retval
1235

1236
    :param minDisparity: Minimum possible disparity value. Normally, it is zero but sometimes rectification algorithms can shift images, so this parameter needs to be adjusted accordingly.
1237

1238
    :param numDisparities: Maximum disparity minus minimum disparity. The value is always greater than zero. In the current implementation, this parameter must be divisible by 16.
1239

1240
    :param blockSize: Matched block size. It must be an odd number  ``>=1`` . Normally, it should be somewhere in  the ``3..11``  range.
1241

1242
    :param P1: The first parameter controlling the disparity smoothness. See below.
1243

1244
    :param P2: The second parameter controlling the disparity smoothness. The larger the values are, the smoother the disparity is.  ``P1``  is the penalty on the disparity change by plus or minus 1 between neighbor pixels.  ``P2``  is the penalty on the disparity change by more than 1 between neighbor pixels. The algorithm requires  ``P2 > P1`` . See  ``stereo_match.cpp``  sample where some reasonably good  ``P1``  and  ``P2``  values are shown (like  ``8*number_of_image_channels*SADWindowSize*SADWindowSize``  and  ``32*number_of_image_channels*SADWindowSize*SADWindowSize`` , respectively).
1245

1246
    :param disp12MaxDiff: Maximum allowed difference (in integer pixel units) in the left-right disparity check. Set it to a non-positive value to disable the check.
1247

1248
    :param preFilterCap: Truncation value for the prefiltered image pixels. The algorithm first computes x-derivative at each pixel and clips its value by  ``[-preFilterCap, preFilterCap]``  interval. The result values are passed to the Birchfield-Tomasi pixel cost function.
1249

1250
    :param uniquenessRatio: Margin in percentage by which the best (minimum) computed cost function value should "win" the second best value to consider the found match correct. Normally, a value within the 5-15 range is good enough.
1251

1252
    :param speckleWindowSize: Maximum size of smooth disparity regions to consider their noise speckles and invalidate. Set it to 0 to disable speckle filtering. Otherwise, set it somewhere in the 50-200 range.
1253

1254
    :param speckleRange: Maximum disparity variation within each connected component. If you do speckle filtering, set the parameter to a positive value, it will be implicitly multiplied by 16. Normally, 1 or 2 is good enough.
1255

1256
    :param mode: Set it to  ``StereoSGBM::MODE_HH``  to run the full-scale two-pass dynamic programming algorithm. It will consume O(W*H*numDisparities) bytes, which is large for 640x480 stereo and huge for HD-size pictures. By default, it is set to ``false`` .
1257

1258
The first constructor initializes ``StereoSGBM`` with all the default parameters. So, you only have to set ``StereoSGBM::numDisparities`` at minimum. The second constructor enables you to set each parameter to a custom value.
1259

1260

1261

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
1262
stereoCalibrate
1263
-------------------
1264
Calibrates the stereo camera.
1265

Adrien BAK's avatar
Adrien BAK committed
1266
.. ocv:function:: double stereoCalibrate( InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints1, InputArrayOfArrays imagePoints2, InputOutputArray cameraMatrix1, InputOutputArray distCoeffs1, InputOutputArray cameraMatrix2, InputOutputArray distCoeffs2, Size imageSize, OutputArray R, OutputArray T, OutputArray E, OutputArray F, int flags=CALIB_FIX_INTRINSIC ,TermCriteria criteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 1e-6))
1267

Adrien BAK's avatar
Adrien BAK committed
1268
.. ocv:pyfunction:: cv2.stereoCalibrate(objectPoints, imagePoints1, imagePoints2, cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, imageSize[, R[, T[, E[, F[, flags[, criteria]]]]]]) -> retval, cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, R, T, E, F
1269

Adrien BAK's avatar
Adrien BAK committed
1270
.. ocv:cfunction:: double cvStereoCalibrate( const CvMat* object_points, const CvMat* image_points1, const CvMat* image_points2, const CvMat* npoints, CvMat* camera_matrix1, CvMat* dist_coeffs1, CvMat* camera_matrix2, CvMat* dist_coeffs2, CvSize image_size, CvMat* R, CvMat* T, CvMat* E=0, CvMat* F=0, int flags=CV_CALIB_FIX_INTRINSIC, CvTermCriteria term_crit=cvTermCriteria( CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,30,1e-6) )
1271

1272
    :param objectPoints: Vector of vectors of the calibration pattern points.
1273

1274
    :param imagePoints1: Vector of vectors of the projections of the calibration pattern points, observed by the first camera.
1275

1276
    :param imagePoints2: Vector of vectors of the projections of the calibration pattern points, observed by the second camera.
1277

1278
    :param cameraMatrix1: Input/output first camera matrix:  :math:`\vecthreethree{f_x^{(j)}}{0}{c_x^{(j)}}{0}{f_y^{(j)}}{c_y^{(j)}}{0}{0}{1}` , :math:`j = 0,\, 1` . If any of  ``CV_CALIB_USE_INTRINSIC_GUESS`` , ``CV_CALIB_FIX_ASPECT_RATIO`` , ``CV_CALIB_FIX_INTRINSIC`` , or  ``CV_CALIB_FIX_FOCAL_LENGTH``  are specified, some or all of the matrix components must be initialized. See the flags description for details.
1279

alegarda's avatar
alegarda committed
1280
    :param distCoeffs1: Input/output vector of distortion coefficients  :math:`(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6],[s_1, s_2, s_3, s_4]])`  of 4, 5, 8 ot 12 elements. The output vector length depends on the flags.
1281

1282
    :param cameraMatrix2: Input/output second camera matrix. The parameter is similar to ``cameraMatrix1`` .
1283

1284
    :param distCoeffs2: Input/output lens distortion coefficients for the second camera. The parameter is similar to  ``distCoeffs1`` .
1285

1286
    :param imageSize: Size of the image used only to initialize intrinsic camera matrix.
1287

1288
    :param R: Output rotation matrix between the 1st and the 2nd camera coordinate systems.
1289

1290
    :param T: Output translation vector between the coordinate systems of the cameras.
1291

1292
    :param E: Output essential matrix.
1293

1294
    :param F: Output fundamental matrix.
1295

1296
    :param term_crit: Termination criteria for the iterative optimization algorithm.
1297

1298
    :param flags: Different flags that may be zero or a combination of the following values:
1299

1300
            * **CV_CALIB_FIX_INTRINSIC** Fix ``cameraMatrix?`` and  ``distCoeffs?``  so that only  ``R, T, E`` ,  and  ``F`` matrices are estimated.
1301

1302
            * **CV_CALIB_USE_INTRINSIC_GUESS** Optimize some or all of the intrinsic parameters according to the specified flags. Initial values are provided by the user.
1303

1304
            * **CV_CALIB_FIX_PRINCIPAL_POINT** Fix the principal points during the optimization.
1305

1306
            * **CV_CALIB_FIX_FOCAL_LENGTH** Fix :math:`f^{(j)}_x`  and  :math:`f^{(j)}_y` .
1307

1308
            * **CV_CALIB_FIX_ASPECT_RATIO** Optimize :math:`f^{(j)}_y` . Fix the ratio  :math:`f^{(j)}_x/f^{(j)}_y` .
1309

1310
            * **CV_CALIB_SAME_FOCAL_LENGTH** Enforce  :math:`f^{(0)}_x=f^{(1)}_x`  and  :math:`f^{(0)}_y=f^{(1)}_y` .
1311

1312
            * **CV_CALIB_ZERO_TANGENT_DIST** Set tangential distortion coefficients for each camera to zeros and fix there.
1313

1314
            * **CV_CALIB_FIX_K1,...,CV_CALIB_FIX_K6** Do not change the corresponding radial distortion coefficient during the optimization. If  ``CV_CALIB_USE_INTRINSIC_GUESS``  is set, the coefficient from the supplied  ``distCoeffs``  matrix is used. Otherwise, it is set to 0.
1315

1316
            * **CV_CALIB_RATIONAL_MODEL** Enable coefficients k4, k5, and k6. To provide the backward compatibility, this extra flag should be explicitly specified to make the calibration function use the rational model and return 8 coefficients. If the flag is not set, the function computes  and returns only 5 distortion coefficients.
1317

alegarda's avatar
alegarda committed
1318
            * **CALIB_THIN_PRISM_MODEL** Coefficients s1, s2, s3 and s4 are enabled. To provide the backward compatibility, this extra flag should be explicitly specified to make the calibration function use the thin prism model and return 12 coefficients. If the flag is not set, the function computes  and returns  only 5 distortion coefficients.
1319

alegarda's avatar
alegarda committed
1320
            * **CALIB_FIX_S1_S2_S3_S4** The thin prism distortion coefficients are not changed during the optimization. If  ``CV_CALIB_USE_INTRINSIC_GUESS``  is set, the coefficient from the supplied  ``distCoeffs``  matrix is used. Otherwise, it is set to 0.
1321

1322
The function estimates transformation between two cameras making a stereo pair. If you have a stereo camera where the relative position and orientation of two cameras is fixed, and if you computed poses of an object relative to the first camera and to the second camera, (R1, T1) and (R2, T2), respectively (this can be done with
1323
:ocv:func:`solvePnP` ), then those poses definitely relate to each other. This means that, given (
1324 1325 1326
:math:`R_1`,:math:`T_1` ), it should be possible to compute (
:math:`R_2`,:math:`T_2` ). You only need to know the position and orientation of the second camera relative to the first camera. This is what the described function does. It computes (
:math:`R`,:math:`T` ) so that:
1327

1328 1329 1330 1331 1332 1333
.. math::

    R_2=R*R_1
    T_2=R*T_1 + T,

Optionally, it computes the essential matrix E:
1334 1335 1336

.. math::

1337
    E= \vecthreethree{0}{-T_2}{T_1}{T_2}{0}{-T_0}{-T_1}{T_0}{0} *R
1338

1339 1340 1341
where
:math:`T_i` are components of the translation vector
:math:`T` :
1342
:math:`T=[T_0, T_1, T_2]^T` . And the function can also compute the fundamental matrix F:
1343

1344
.. math::
1345

1346 1347
    F = cameraMatrix2^{-T} E cameraMatrix1^{-1}

1348
Besides the stereo-related information, the function can also perform a full calibration of each of two cameras. However, due to the high dimensionality of the parameter space and noise in the input data, the function can diverge from the correct solution. If the intrinsic parameters can be estimated with high accuracy for each of the cameras individually (for example, using
1349
:ocv:func:`calibrateCamera` ), you are recommended to do so and then pass ``CV_CALIB_FIX_INTRINSIC`` flag to the function along with the computed intrinsic parameters. Otherwise, if all the parameters are estimated at once, it makes sense to restrict some parameters, for example, pass ``CV_CALIB_SAME_FOCAL_LENGTH`` and ``CV_CALIB_ZERO_TANGENT_DIST`` flags, which is usually a reasonable assumption.
1350

1351
Similarly to :ocv:func:`calibrateCamera` , the function minimizes the total re-projection error for all the points in all the available views from both cameras. The function returns the final value of the re-projection error.
1352

1353

1354

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
1355
stereoRectify
1356
-----------------
1357
Computes rectification transforms for each head of a calibrated stereo camera.
1358

1359 1360 1361
.. ocv:function:: void stereoRectify( InputArray cameraMatrix1, InputArray distCoeffs1, InputArray cameraMatrix2, InputArray distCoeffs2, Size imageSize, InputArray R, InputArray T, OutputArray R1, OutputArray R2, OutputArray P1, OutputArray P2, OutputArray Q, int flags=CALIB_ZERO_DISPARITY, double alpha=-1, Size newImageSize=Size(), Rect* validPixROI1=0, Rect* validPixROI2=0 )

.. ocv:cfunction:: void cvStereoRectify( const CvMat* camera_matrix1, const CvMat* camera_matrix2, const CvMat* dist_coeffs1, const CvMat* dist_coeffs2, CvSize image_size, const CvMat* R, const CvMat* T, CvMat* R1, CvMat* R2, CvMat* P1, CvMat* P2, CvMat* Q=0, int flags=CV_CALIB_ZERO_DISPARITY, double alpha=-1, CvSize new_image_size=cvSize(0,0), CvRect* valid_pix_ROI1=0, CvRect* valid_pix_ROI2=0 )
1362

1363
    :param cameraMatrix1: First camera matrix.
1364

1365
    :param cameraMatrix2: Second camera matrix.
1366

1367
    :param distCoeffs1: First camera distortion parameters.
1368

1369
    :param distCoeffs2: Second camera distortion parameters.
1370

1371
    :param imageSize: Size of the image used for stereo calibration.
1372

1373
    :param R: Rotation matrix between the coordinate systems of the first and the second cameras.
1374

1375
    :param T: Translation vector between coordinate systems of the cameras.
1376

1377
    :param R1: Output  3x3 rectification transform (rotation matrix) for the first camera.
1378

1379
    :param R2: Output  3x3 rectification transform (rotation matrix) for the second camera.
1380

1381
    :param P1: Output  3x4 projection matrix in the new (rectified) coordinate systems for the first camera.
1382

1383
    :param P2: Output  3x4 projection matrix in the new (rectified) coordinate systems for the second camera.
1384

1385
    :param Q: Output  :math:`4 \times 4`  disparity-to-depth mapping matrix (see  :ocv:func:`reprojectImageTo3D` ).
1386

1387
    :param flags: Operation flags that may be zero or  ``CV_CALIB_ZERO_DISPARITY`` . If the flag is set, the function makes the principal points of each camera have the same pixel coordinates in the rectified views. And if the flag is not set, the function may still shift the images in the horizontal or vertical direction (depending on the orientation of epipolar lines) to maximize the useful image area.
1388

1389
    :param alpha: Free scaling parameter. If it is -1  or absent, the function performs the default scaling. Otherwise, the parameter should be between 0 and 1.  ``alpha=0``  means that the rectified images are zoomed and shifted so that only valid pixels are visible (no black areas after rectification).  ``alpha=1``  means that the rectified image is decimated and shifted so that all the pixels from the original images from the cameras are retained in the rectified images (no source image pixels are lost). Obviously, any intermediate value yields an intermediate result between those two extreme cases.
1390

1391
    :param newImageSize: New image resolution after rectification. The same size should be passed to  :ocv:func:`initUndistortRectifyMap` (see the  ``stereo_calib.cpp``  sample in OpenCV samples directory). When (0,0) is passed (default), it is set to the original  ``imageSize`` . Setting it to larger value can help you preserve details in the original image, especially when there is a big radial distortion.
1392

1393
    :param validPixROI1: Optional output rectangles inside the rectified images where all the pixels are valid. If  ``alpha=0`` , the ROIs cover the whole images. Otherwise, they are likely to be smaller (see the picture below).
1394

1395
    :param validPixROI2: Optional output rectangles inside the rectified images where all the pixels are valid. If  ``alpha=0`` , the ROIs cover the whole images. Otherwise, they are likely to be smaller (see the picture below).
1396

1397
The function computes the rotation matrices for each camera that (virtually) make both camera image planes the same plane. Consequently, this makes all the epipolar lines parallel and thus simplifies the dense stereo correspondence problem. The function takes the matrices computed by
1398
:ocv:func:`stereoCalibrate` as input. As output, it provides two rotation matrices and also two projection matrices in the new coordinates. The function distinguishes the following two cases:
1399 1400

#.
1401
    **Horizontal stereo**: the first and the second camera views are shifted relative to each other mainly along the x axis (with possible small vertical shift). In the rectified images, the corresponding epipolar lines in the left and right cameras are horizontal and have the same y-coordinate. P1 and P2 look like:
1402

1403
    .. math::
1404 1405 1406

        \texttt{P1} = \begin{bmatrix} f & 0 & cx_1 & 0 \\ 0 & f & cy & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix}

1407
    .. math::
1408 1409 1410 1411

        \texttt{P2} = \begin{bmatrix} f & 0 & cx_2 & T_x*f \\ 0 & f & cy & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} ,

    where
1412
    :math:`T_x`     is a horizontal shift between the cameras and
1413
    :math:`cx_1=cx_2`     if ``CV_CALIB_ZERO_DISPARITY``     is set.
1414 1415

#.
1416
    **Vertical stereo**: the first and the second camera views are shifted relative to each other mainly in vertical direction (and probably a bit in the horizontal direction too). The epipolar lines in the rectified images are vertical and have the same x-coordinate. P1 and P2 look like:
1417

1418 1419
    .. math::

1420
        \texttt{P1} = \begin{bmatrix} f & 0 & cx & 0 \\ 0 & f & cy_1 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix}
1421

1422
    .. math::
1423

1424
        \texttt{P2} = \begin{bmatrix} f & 0 & cx & 0 \\ 0 & f & cy_2 & T_y*f \\ 0 & 0 & 1 & 0 \end{bmatrix} ,
1425

1426
    where
1427
    :math:`T_y`     is a vertical shift between the cameras and
1428
    :math:`cy_1=cy_2`     if ``CALIB_ZERO_DISPARITY``     is set.
1429

1430
As you can see, the first three columns of ``P1`` and ``P2`` will effectively be the new "rectified" camera matrices.
1431
The matrices, together with ``R1`` and ``R2`` , can then be passed to
1432
:ocv:func:`initUndistortRectifyMap` to initialize the rectification map for each camera.
1433

1434
See below the screenshot from the ``stereo_calib.cpp`` sample. Some red horizontal lines pass through the corresponding image regions. This means that the images are well rectified, which is what most stereo correspondence algorithms rely on. The green rectangles are ``roi1`` and ``roi2`` . You see that their interiors are all valid pixels.
1435

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
1436
.. image:: pics/stereo_undistort.jpg
1437

1438

1439

Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
1440
stereoRectifyUncalibrated
1441
-----------------------------
1442
Computes a rectification transform for an uncalibrated stereo camera.
1443

1444
.. ocv:function:: bool stereoRectifyUncalibrated( InputArray points1, InputArray points2, InputArray F, Size imgSize, OutputArray H1, OutputArray H2, double threshold=5 )
1445

1446 1447
.. ocv:pyfunction:: cv2.stereoRectifyUncalibrated(points1, points2, F, imgSize[, H1[, H2[, threshold]]]) -> retval, H1, H2

1448
.. ocv:cfunction:: int cvStereoRectifyUncalibrated( const CvMat* points1, const CvMat* points2, const CvMat* F, CvSize img_size, CvMat* H1, CvMat* H2, double threshold=5 )
1449

1450
    :param points1: Array of feature points in the first image.
1451

1452
    :param points2: The corresponding points in the second image. The same formats as in  :ocv:func:`findFundamentalMat` are supported.
1453

1454
    :param F: Input fundamental matrix. It can be computed from the same set of point pairs using  :ocv:func:`findFundamentalMat` .
1455

1456
    :param imgSize: Size of the image.
1457

1458
    :param H1: Output rectification homography matrix for the first image.
1459

1460
    :param H2: Output rectification homography matrix for the second image.
1461

1462
    :param threshold: Optional threshold used to filter out the outliers. If the parameter is greater than zero, all the point pairs that do not comply with the epipolar geometry (that is, the points for which  :math:`|\texttt{points2[i]}^T*\texttt{F}*\texttt{points1[i]}|>\texttt{threshold}` ) are rejected prior to computing the homographies. Otherwise,all the points are considered inliers.
1463

1464
The function computes the rectification transformations without knowing intrinsic parameters of the cameras and their relative position in the space, which explains the suffix "uncalibrated". Another related difference from
1465
:ocv:func:`stereoRectify` is that the function outputs not the rectification transformations in the object (3D) space, but the planar perspective transformations encoded by the homography matrices ``H1`` and ``H2`` . The function implements the algorithm
1466 1467 1468 1469 1470 1471
[Hartley99]_.

.. note::

    While the algorithm does not need to know the intrinsic parameters of the cameras, it heavily depends on the epipolar geometry. Therefore, if the camera lenses have a significant distortion, it would be better to correct it before computing the fundamental matrix and calling this function. For example, distortion coefficients can be estimated for each head of stereo camera separately by using :ocv:func:`calibrateCamera` . Then, the images can be corrected using :ocv:func:`undistort` , or just the point coordinates can be corrected with :ocv:func:`undistortPoints` .

1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486

triangulatePoints
-----------------
Reconstructs points by triangulation.

.. ocv:function:: void triangulatePoints( InputArray projMatr1, InputArray projMatr2, InputArray projPoints1, InputArray projPoints2, OutputArray points4D )

.. ocv:pyfunction:: cv2.triangulatePoints(projMatr1, projMatr2, projPoints1, projPoints2[, points4D]) -> points4D

.. ocv:cfunction:: void cvTriangulatePoints(CvMat* projMatr1, CvMat* projMatr2, CvMat* projPoints1, CvMat* projPoints2, CvMat* points4D)

    :param projMatr1: 3x4 projection matrix of the first camera.

    :param projMatr2: 3x4 projection matrix of the second camera.

1487
    :param projPoints1: 2xN array of feature points in the first image. In case of c++ version it can be also a vector of feature points or two-channel matrix of size 1xN or Nx1.
1488

1489
    :param projPoints2: 2xN array of corresponding points in the second image. In case of c++ version it can be also a vector of feature points or two-channel matrix of size 1xN or Nx1.
1490 1491 1492

    :param points4D: 4xN array of reconstructed points in homogeneous coordinates.

1493
The function reconstructs 3-dimensional points (in homogeneous coordinates) by using their observations with a stereo camera. Projections matrices can be obtained from :ocv:func:`stereoRectify`.
1494

StevenPuttemans's avatar
StevenPuttemans committed
1495 1496 1497 1498
.. note::

    Keep in mind that all input data should be of float type in order for this function to work.

1499 1500 1501
.. seealso::

    :ocv:func:`reprojectImageTo3D`
1502 1503 1504 1505 1506 1507 1508 1509


.. [BT98] Birchfield, S. and Tomasi, C. A pixel dissimilarity measure that is insensitive to image sampling. IEEE Transactions on Pattern Analysis and Machine Intelligence. 1998.

.. [BouguetMCT] J.Y.Bouguet. MATLAB calibration tool. http://www.vision.caltech.edu/bouguetj/calib_doc/

.. [Hartley99] Hartley, R.I., Theory and Practice of Projective Rectification. IJCV 35 2, pp 115-127 (1999)

1510
.. [HartleyZ00] Hartley, R. and Zisserman, A. Multiple View Geomtry in Computer Vision, Cambridge University Press, 2000.
1511

1512 1513
.. [HH08] Hirschmuller, H. Stereo Processing by Semiglobal Matching and Mutual Information, PAMI(30), No. 2, February 2008, pp. 328-341.

1514
.. [Nister03] Nistér, D. An efficient solution to the five-point relative pose problem, CVPR 2003.
1515 1516 1517

.. [SteweniusCFS] Stewénius, H., Calibrated Fivepoint solver. http://www.vis.uky.edu/~stewe/FIVEPOINT/

Dominik Rose's avatar
Dominik Rose committed
1518
.. [Slabaugh] Slabaugh, G.G. Computing Euler angles from a rotation matrix. http://www.soi.city.ac.uk/~sbbh653/publications/euler.pdf (verified: 2013-04-15)
1519

1520
.. [Zhang2000] Z. Zhang. A Flexible New Technique for Camera Calibration. IEEE Transactions on Pattern Analysis and Machine Intelligence, 22(11):1330-1334, 2000.