1/*M///////////////////////////////////////////////////////////////////////////////////////
2//
3//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4//
5//  By downloading, copying, installing or using the software you agree to this license.
6//  If you do not agree to this license, do not download, install,
7//  copy or use the software.
8//
9//
10//                           License Agreement
11//                For Open Source Computer Vision Library
12//
13// Copyright (C) 2000-2015, Intel Corporation, all rights reserved.
14// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
15// Copyright (C) 2015, OpenCV Foundation, all rights reserved.
16// Copyright (C) 2015, Itseez Inc., all rights reserved.
17// Third party copyrights are property of their respective owners.
18//
19// Redistribution and use in source and binary forms, with or without modification,
20// are permitted provided that the following conditions are met:
21//
22//   * Redistribution's of source code must retain the above copyright notice,
23//     this list of conditions and the following disclaimer.
24//
25//   * Redistribution's in binary form must reproduce the above copyright notice,
26//     this list of conditions and the following disclaimer in the documentation
27//     and/or other materials provided with the distribution.
28//
29//   * The name of the copyright holders may not be used to endorse or promote products
30//     derived from this software without specific prior written permission.
31//
32// This software is provided by the copyright holders and contributors "as is" and
33// any express or implied warranties, including, but not limited to, the implied
34// warranties of merchantability and fitness for a particular purpose are disclaimed.
35// In no event shall the Intel Corporation or contributors be liable for any direct,
36// indirect, incidental, special, exemplary, or consequential damages
37// (including, but not limited to, procurement of substitute goods or services;
38// loss of use, data, or profits; or business interruption) however caused
39// and on any theory of liability, whether in contract, strict liability,
40// or tort (including negligence or otherwise) arising in any way out of
41// the use of this software, even if advised of the possibility of such damage.
42//
43//M*/
44
45#ifndef __OPENCV_CORE_HPP__
46#define __OPENCV_CORE_HPP__
47
48#ifndef __cplusplus
49#  error core.hpp header must be compiled as C++
50#endif
51
52#include "opencv2/core/cvdef.h"
53#include "opencv2/core/version.hpp"
54#include "opencv2/core/base.hpp"
55#include "opencv2/core/cvstd.hpp"
56#include "opencv2/core/traits.hpp"
57#include "opencv2/core/matx.hpp"
58#include "opencv2/core/types.hpp"
59#include "opencv2/core/mat.hpp"
60#include "opencv2/core/persistence.hpp"
61
62/**
63@defgroup core Core functionality
64@{
65    @defgroup core_basic Basic structures
66    @defgroup core_c C structures and operations
67    @{
68        @defgroup core_c_glue Connections with C++
69    @}
70    @defgroup core_array Operations on arrays
71    @defgroup core_xml XML/YAML Persistence
72    @defgroup core_cluster Clustering
73    @defgroup core_utils Utility and system functions and macros
74    @{
75        @defgroup core_utils_neon NEON utilities
76    @}
77    @defgroup core_opengl OpenGL interoperability
78    @defgroup core_ipp Intel IPP Asynchronous C/C++ Converters
79    @defgroup core_optim Optimization Algorithms
80    @defgroup core_directx DirectX interoperability
81    @defgroup core_eigen Eigen support
82    @defgroup core_opencl OpenCL support
83@}
84 */
85
86namespace cv {
87
88//! @addtogroup core_utils
89//! @{
90
91/*! @brief Class passed to an error.
92
93This class encapsulates all or almost all necessary
94information about the error happened in the program. The exception is
95usually constructed and thrown implicitly via CV_Error and CV_Error_ macros.
96@see error
97 */
98class CV_EXPORTS Exception : public std::exception
99{
100public:
101    /*!
102     Default constructor
103     */
104    Exception();
105    /*!
106     Full constructor. Normally the constuctor is not called explicitly.
107     Instead, the macros CV_Error(), CV_Error_() and CV_Assert() are used.
108    */
109    Exception(int _code, const String& _err, const String& _func, const String& _file, int _line);
110    virtual ~Exception() throw();
111
112    /*!
113     \return the error description and the context as a text string.
114    */
115    virtual const char *what() const throw();
116    void formatMessage();
117
118    String msg; ///< the formatted error message
119
120    int code; ///< error code @see CVStatus
121    String err; ///< error description
122    String func; ///< function name. Available only when the compiler supports getting it
123    String file; ///< source file name where the error has occured
124    int line; ///< line number in the source file where the error has occured
125};
126
127/*! @brief Signals an error and raises the exception.
128
129By default the function prints information about the error to stderr,
130then it either stops if cv::setBreakOnError() had been called before or raises the exception.
131It is possible to alternate error processing by using cv::redirectError().
132@param exc the exception raisen.
133@deprecated drop this version
134 */
135CV_EXPORTS void error( const Exception& exc );
136
137enum SortFlags { SORT_EVERY_ROW    = 0, //!< each matrix row is sorted independently
138                 SORT_EVERY_COLUMN = 1, //!< each matrix column is sorted
139                                        //!< independently; this flag and the previous one are
140                                        //!< mutually exclusive.
141                 SORT_ASCENDING    = 0, //!< each matrix row is sorted in the ascending
142                                        //!< order.
143                 SORT_DESCENDING   = 16 //!< each matrix row is sorted in the
144                                        //!< descending order; this flag and the previous one are also
145                                        //!< mutually exclusive.
146               };
147
148//! @} core_utils
149
150//! @addtogroup core
151//! @{
152
153//! Covariation flags
154enum CovarFlags {
155    /** The output covariance matrix is calculated as:
156       \f[\texttt{scale}   \cdot  [  \texttt{vects}  [0]-  \texttt{mean}  , \texttt{vects}  [1]-  \texttt{mean}  ,...]^T  \cdot  [ \texttt{vects}  [0]- \texttt{mean}  , \texttt{vects}  [1]- \texttt{mean}  ,...],\f]
157       The covariance matrix will be nsamples x nsamples. Such an unusual covariance matrix is used
158       for fast PCA of a set of very large vectors (see, for example, the EigenFaces technique for
159       face recognition). Eigenvalues of this "scrambled" matrix match the eigenvalues of the true
160       covariance matrix. The "true" eigenvectors can be easily calculated from the eigenvectors of
161       the "scrambled" covariance matrix. */
162    COVAR_SCRAMBLED = 0,
163    /**The output covariance matrix is calculated as:
164        \f[\texttt{scale}   \cdot  [  \texttt{vects}  [0]-  \texttt{mean}  , \texttt{vects}  [1]-  \texttt{mean}  ,...]  \cdot  [ \texttt{vects}  [0]- \texttt{mean}  , \texttt{vects}  [1]- \texttt{mean}  ,...]^T,\f]
165        covar will be a square matrix of the same size as the total number of elements in each input
166        vector. One and only one of COVAR_SCRAMBLED and COVAR_NORMAL must be specified.*/
167    COVAR_NORMAL    = 1,
168    /** If the flag is specified, the function does not calculate mean from
169        the input vectors but, instead, uses the passed mean vector. This is useful if mean has been
170        pre-calculated or known in advance, or if the covariance matrix is calculated by parts. In
171        this case, mean is not a mean vector of the input sub-set of vectors but rather the mean
172        vector of the whole set.*/
173    COVAR_USE_AVG   = 2,
174    /** If the flag is specified, the covariance matrix is scaled. In the
175        "normal" mode, scale is 1./nsamples . In the "scrambled" mode, scale is the reciprocal of the
176        total number of elements in each input vector. By default (if the flag is not specified), the
177        covariance matrix is not scaled ( scale=1 ).*/
178    COVAR_SCALE     = 4,
179    /** If the flag is
180        specified, all the input vectors are stored as rows of the samples matrix. mean should be a
181        single-row vector in this case.*/
182    COVAR_ROWS      = 8,
183    /** If the flag is
184        specified, all the input vectors are stored as columns of the samples matrix. mean should be a
185        single-column vector in this case.*/
186    COVAR_COLS      = 16
187};
188
189//! k-Means flags
190enum KmeansFlags {
191    /** Select random initial centers in each attempt.*/
192    KMEANS_RANDOM_CENTERS     = 0,
193    /** Use kmeans++ center initialization by Arthur and Vassilvitskii [Arthur2007].*/
194    KMEANS_PP_CENTERS         = 2,
195    /** During the first (and possibly the only) attempt, use the
196        user-supplied labels instead of computing them from the initial centers. For the second and
197        further attempts, use the random or semi-random centers. Use one of KMEANS_\*_CENTERS flag
198        to specify the exact method.*/
199    KMEANS_USE_INITIAL_LABELS = 1
200};
201
202//! type of line
203enum LineTypes {
204    FILLED  = -1,
205    LINE_4  = 4, //!< 4-connected line
206    LINE_8  = 8, //!< 8-connected line
207    LINE_AA = 16 //!< antialiased line
208};
209
210//! Only a subset of Hershey fonts
211//! <http://sources.isc.org/utils/misc/hershey-font.txt> are supported
212enum HersheyFonts {
213    FONT_HERSHEY_SIMPLEX        = 0, //!< normal size sans-serif font
214    FONT_HERSHEY_PLAIN          = 1, //!< small size sans-serif font
215    FONT_HERSHEY_DUPLEX         = 2, //!< normal size sans-serif font (more complex than FONT_HERSHEY_SIMPLEX)
216    FONT_HERSHEY_COMPLEX        = 3, //!< normal size serif font
217    FONT_HERSHEY_TRIPLEX        = 4, //!< normal size serif font (more complex than FONT_HERSHEY_COMPLEX)
218    FONT_HERSHEY_COMPLEX_SMALL  = 5, //!< smaller version of FONT_HERSHEY_COMPLEX
219    FONT_HERSHEY_SCRIPT_SIMPLEX = 6, //!< hand-writing style font
220    FONT_HERSHEY_SCRIPT_COMPLEX = 7, //!< more complex variant of FONT_HERSHEY_SCRIPT_SIMPLEX
221    FONT_ITALIC                 = 16 //!< flag for italic font
222};
223
224enum ReduceTypes { REDUCE_SUM = 0, //!< the output is the sum of all rows/columns of the matrix.
225                   REDUCE_AVG = 1, //!< the output is the mean vector of all rows/columns of the matrix.
226                   REDUCE_MAX = 2, //!< the output is the maximum (column/row-wise) of all rows/columns of the matrix.
227                   REDUCE_MIN = 3  //!< the output is the minimum (column/row-wise) of all rows/columns of the matrix.
228                 };
229
230
231/** @brief Swaps two matrices
232*/
233CV_EXPORTS void swap(Mat& a, Mat& b);
234/** @overload */
235CV_EXPORTS void swap( UMat& a, UMat& b );
236
237//! @} core
238
239//! @addtogroup core_array
240//! @{
241
242/** @brief Computes the source location of an extrapolated pixel.
243
244The function computes and returns the coordinate of a donor pixel corresponding to the specified
245extrapolated pixel when using the specified extrapolation border mode. For example, if you use
246cv::BORDER_WRAP mode in the horizontal direction, cv::BORDER_REFLECT_101 in the vertical direction and
247want to compute value of the "virtual" pixel Point(-5, 100) in a floating-point image img , it
248looks like:
249@code{.cpp}
250    float val = img.at<float>(borderInterpolate(100, img.rows, cv::BORDER_REFLECT_101),
251                              borderInterpolate(-5, img.cols, cv::BORDER_WRAP));
252@endcode
253Normally, the function is not called directly. It is used inside filtering functions and also in
254copyMakeBorder.
255@param p 0-based coordinate of the extrapolated pixel along one of the axes, likely \<0 or \>= len
256@param len Length of the array along the corresponding axis.
257@param borderType Border type, one of the cv::BorderTypes, except for cv::BORDER_TRANSPARENT and
258cv::BORDER_ISOLATED . When borderType==cv::BORDER_CONSTANT , the function always returns -1, regardless
259of p and len.
260
261@sa copyMakeBorder
262*/
263CV_EXPORTS_W int borderInterpolate(int p, int len, int borderType);
264
265/** @brief Forms a border around an image.
266
267The function copies the source image into the middle of the destination image. The areas to the
268left, to the right, above and below the copied source image will be filled with extrapolated
269pixels. This is not what filtering functions based on it do (they extrapolate pixels on-fly), but
270what other more complex functions, including your own, may do to simplify image boundary handling.
271
272The function supports the mode when src is already in the middle of dst . In this case, the
273function does not copy src itself but simply constructs the border, for example:
274
275@code{.cpp}
276    // let border be the same in all directions
277    int border=2;
278    // constructs a larger image to fit both the image and the border
279    Mat gray_buf(rgb.rows + border*2, rgb.cols + border*2, rgb.depth());
280    // select the middle part of it w/o copying data
281    Mat gray(gray_canvas, Rect(border, border, rgb.cols, rgb.rows));
282    // convert image from RGB to grayscale
283    cvtColor(rgb, gray, COLOR_RGB2GRAY);
284    // form a border in-place
285    copyMakeBorder(gray, gray_buf, border, border,
286                   border, border, BORDER_REPLICATE);
287    // now do some custom filtering ...
288    ...
289@endcode
290@note When the source image is a part (ROI) of a bigger image, the function will try to use the
291pixels outside of the ROI to form a border. To disable this feature and always do extrapolation, as
292if src was not a ROI, use borderType | BORDER_ISOLATED.
293
294@param src Source image.
295@param dst Destination image of the same type as src and the size Size(src.cols+left+right,
296src.rows+top+bottom) .
297@param top
298@param bottom
299@param left
300@param right Parameter specifying how many pixels in each direction from the source image rectangle
301to extrapolate. For example, top=1, bottom=1, left=1, right=1 mean that 1 pixel-wide border needs
302to be built.
303@param borderType Border type. See borderInterpolate for details.
304@param value Border value if borderType==BORDER_CONSTANT .
305
306@sa  borderInterpolate
307*/
308CV_EXPORTS_W void copyMakeBorder(InputArray src, OutputArray dst,
309                                 int top, int bottom, int left, int right,
310                                 int borderType, const Scalar& value = Scalar() );
311
312/** @brief Calculates the per-element sum of two arrays or an array and a scalar.
313
314The function add calculates:
315- Sum of two arrays when both input arrays have the same size and the same number of channels:
316\f[\texttt{dst}(I) =  \texttt{saturate} ( \texttt{src1}(I) +  \texttt{src2}(I)) \quad \texttt{if mask}(I) \ne0\f]
317- Sum of an array and a scalar when src2 is constructed from Scalar or has the same number of
318elements as `src1.channels()`:
319\f[\texttt{dst}(I) =  \texttt{saturate} ( \texttt{src1}(I) +  \texttt{src2} ) \quad \texttt{if mask}(I) \ne0\f]
320- Sum of a scalar and an array when src1 is constructed from Scalar or has the same number of
321elements as `src2.channels()`:
322\f[\texttt{dst}(I) =  \texttt{saturate} ( \texttt{src1} +  \texttt{src2}(I) ) \quad \texttt{if mask}(I) \ne0\f]
323where `I` is a multi-dimensional index of array elements. In case of multi-channel arrays, each
324channel is processed independently.
325
326The first function in the list above can be replaced with matrix expressions:
327@code{.cpp}
328    dst = src1 + src2;
329    dst += src1; // equivalent to add(dst, src1, dst);
330@endcode
331The input arrays and the output array can all have the same or different depths. For example, you
332can add a 16-bit unsigned array to a 8-bit signed array and store the sum as a 32-bit
333floating-point array. Depth of the output array is determined by the dtype parameter. In the second
334and third cases above, as well as in the first case, when src1.depth() == src2.depth(), dtype can
335be set to the default -1. In this case, the output array will have the same depth as the input
336array, be it src1, src2 or both.
337@note Saturation is not applied when the output array has the depth CV_32S. You may even get
338result of an incorrect sign in the case of overflow.
339@param src1 first input array or a scalar.
340@param src2 second input array or a scalar.
341@param dst output array that has the same size and number of channels as the input array(s); the
342depth is defined by dtype or src1/src2.
343@param mask optional operation mask - 8-bit single channel array, that specifies elements of the
344output array to be changed.
345@param dtype optional depth of the output array (see the discussion below).
346@sa subtract, addWeighted, scaleAdd, Mat::convertTo
347*/
348CV_EXPORTS_W void add(InputArray src1, InputArray src2, OutputArray dst,
349                      InputArray mask = noArray(), int dtype = -1);
350
351/** @brief Calculates the per-element difference between two arrays or array and a scalar.
352
353The function subtract calculates:
354- Difference between two arrays, when both input arrays have the same size and the same number of
355channels:
356    \f[\texttt{dst}(I) =  \texttt{saturate} ( \texttt{src1}(I) -  \texttt{src2}(I)) \quad \texttt{if mask}(I) \ne0\f]
357- Difference between an array and a scalar, when src2 is constructed from Scalar or has the same
358number of elements as `src1.channels()`:
359    \f[\texttt{dst}(I) =  \texttt{saturate} ( \texttt{src1}(I) -  \texttt{src2} ) \quad \texttt{if mask}(I) \ne0\f]
360- Difference between a scalar and an array, when src1 is constructed from Scalar or has the same
361number of elements as `src2.channels()`:
362    \f[\texttt{dst}(I) =  \texttt{saturate} ( \texttt{src1} -  \texttt{src2}(I) ) \quad \texttt{if mask}(I) \ne0\f]
363- The reverse difference between a scalar and an array in the case of `SubRS`:
364    \f[\texttt{dst}(I) =  \texttt{saturate} ( \texttt{src2} -  \texttt{src1}(I) ) \quad \texttt{if mask}(I) \ne0\f]
365where I is a multi-dimensional index of array elements. In case of multi-channel arrays, each
366channel is processed independently.
367
368The first function in the list above can be replaced with matrix expressions:
369@code{.cpp}
370    dst = src1 - src2;
371    dst -= src1; // equivalent to subtract(dst, src1, dst);
372@endcode
373The input arrays and the output array can all have the same or different depths. For example, you
374can subtract to 8-bit unsigned arrays and store the difference in a 16-bit signed array. Depth of
375the output array is determined by dtype parameter. In the second and third cases above, as well as
376in the first case, when src1.depth() == src2.depth(), dtype can be set to the default -1. In this
377case the output array will have the same depth as the input array, be it src1, src2 or both.
378@note Saturation is not applied when the output array has the depth CV_32S. You may even get
379result of an incorrect sign in the case of overflow.
380@param src1 first input array or a scalar.
381@param src2 second input array or a scalar.
382@param dst output array of the same size and the same number of channels as the input array.
383@param mask optional operation mask; this is an 8-bit single channel array that specifies elements
384of the output array to be changed.
385@param dtype optional depth of the output array
386@sa  add, addWeighted, scaleAdd, Mat::convertTo
387  */
388CV_EXPORTS_W void subtract(InputArray src1, InputArray src2, OutputArray dst,
389                           InputArray mask = noArray(), int dtype = -1);
390
391
392/** @brief Calculates the per-element scaled product of two arrays.
393
394The function multiply calculates the per-element product of two arrays:
395
396\f[\texttt{dst} (I)= \texttt{saturate} ( \texttt{scale} \cdot \texttt{src1} (I)  \cdot \texttt{src2} (I))\f]
397
398There is also a @ref MatrixExpressions -friendly variant of the first function. See Mat::mul .
399
400For a not-per-element matrix product, see gemm .
401
402@note Saturation is not applied when the output array has the depth
403CV_32S. You may even get result of an incorrect sign in the case of
404overflow.
405@param src1 first input array.
406@param src2 second input array of the same size and the same type as src1.
407@param dst output array of the same size and type as src1.
408@param scale optional scale factor.
409@param dtype optional depth of the output array
410@sa add, subtract, divide, scaleAdd, addWeighted, accumulate, accumulateProduct, accumulateSquare,
411Mat::convertTo
412*/
413CV_EXPORTS_W void multiply(InputArray src1, InputArray src2,
414                           OutputArray dst, double scale = 1, int dtype = -1);
415
416/** @brief Performs per-element division of two arrays or a scalar by an array.
417
418The functions divide divide one array by another:
419\f[\texttt{dst(I) = saturate(src1(I)*scale/src2(I))}\f]
420or a scalar by an array when there is no src1 :
421\f[\texttt{dst(I) = saturate(scale/src2(I))}\f]
422
423When src2(I) is zero, dst(I) will also be zero. Different channels of
424multi-channel arrays are processed independently.
425
426@note Saturation is not applied when the output array has the depth CV_32S. You may even get
427result of an incorrect sign in the case of overflow.
428@param src1 first input array.
429@param src2 second input array of the same size and type as src1.
430@param scale scalar factor.
431@param dst output array of the same size and type as src2.
432@param dtype optional depth of the output array; if -1, dst will have depth src2.depth(), but in
433case of an array-by-array division, you can only pass -1 when src1.depth()==src2.depth().
434@sa  multiply, add, subtract
435*/
436CV_EXPORTS_W void divide(InputArray src1, InputArray src2, OutputArray dst,
437                         double scale = 1, int dtype = -1);
438
439/** @overload */
440CV_EXPORTS_W void divide(double scale, InputArray src2,
441                         OutputArray dst, int dtype = -1);
442
443/** @brief Calculates the sum of a scaled array and another array.
444
445The function scaleAdd is one of the classical primitive linear algebra operations, known as DAXPY
446or SAXPY in [BLAS](http://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms). It calculates
447the sum of a scaled array and another array:
448\f[\texttt{dst} (I)= \texttt{scale} \cdot \texttt{src1} (I) +  \texttt{src2} (I)\f]
449The function can also be emulated with a matrix expression, for example:
450@code{.cpp}
451    Mat A(3, 3, CV_64F);
452    ...
453    A.row(0) = A.row(1)*2 + A.row(2);
454@endcode
455@param src1 first input array.
456@param alpha scale factor for the first array.
457@param src2 second input array of the same size and type as src1.
458@param dst output array of the same size and type as src1.
459@sa add, addWeighted, subtract, Mat::dot, Mat::convertTo
460*/
461CV_EXPORTS_W void scaleAdd(InputArray src1, double alpha, InputArray src2, OutputArray dst);
462
463/** @brief Calculates the weighted sum of two arrays.
464
465The function addWeighted calculates the weighted sum of two arrays as follows:
466\f[\texttt{dst} (I)= \texttt{saturate} ( \texttt{src1} (I)* \texttt{alpha} +  \texttt{src2} (I)* \texttt{beta} +  \texttt{gamma} )\f]
467where I is a multi-dimensional index of array elements. In case of multi-channel arrays, each
468channel is processed independently.
469The function can be replaced with a matrix expression:
470@code{.cpp}
471    dst = src1*alpha + src2*beta + gamma;
472@endcode
473@note Saturation is not applied when the output array has the depth CV_32S. You may even get
474result of an incorrect sign in the case of overflow.
475@param src1 first input array.
476@param alpha weight of the first array elements.
477@param src2 second input array of the same size and channel number as src1.
478@param beta weight of the second array elements.
479@param gamma scalar added to each sum.
480@param dst output array that has the same size and number of channels as the input arrays.
481@param dtype optional depth of the output array; when both input arrays have the same depth, dtype
482can be set to -1, which will be equivalent to src1.depth().
483@sa  add, subtract, scaleAdd, Mat::convertTo
484*/
485CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2,
486                              double beta, double gamma, OutputArray dst, int dtype = -1);
487
488/** @brief Scales, calculates absolute values, and converts the result to 8-bit.
489
490On each element of the input array, the function convertScaleAbs
491performs three operations sequentially: scaling, taking an absolute
492value, conversion to an unsigned 8-bit type:
493\f[\texttt{dst} (I)= \texttt{saturate\_cast<uchar>} (| \texttt{src} (I)* \texttt{alpha} +  \texttt{beta} |)\f]
494In case of multi-channel arrays, the function processes each channel
495independently. When the output is not 8-bit, the operation can be
496emulated by calling the Mat::convertTo method (or by using matrix
497expressions) and then by calculating an absolute value of the result.
498For example:
499@code{.cpp}
500    Mat_<float> A(30,30);
501    randu(A, Scalar(-100), Scalar(100));
502    Mat_<float> B = A*5 + 3;
503    B = abs(B);
504    // Mat_<float> B = abs(A*5+3) will also do the job,
505    // but it will allocate a temporary matrix
506@endcode
507@param src input array.
508@param dst output array.
509@param alpha optional scale factor.
510@param beta optional delta added to the scaled values.
511@sa  Mat::convertTo, cv::abs(const Mat&)
512*/
513CV_EXPORTS_W void convertScaleAbs(InputArray src, OutputArray dst,
514                                  double alpha = 1, double beta = 0);
515
516/** @brief Performs a look-up table transform of an array.
517
518The function LUT fills the output array with values from the look-up table. Indices of the entries
519are taken from the input array. That is, the function processes each element of src as follows:
520\f[\texttt{dst} (I)  \leftarrow \texttt{lut(src(I) + d)}\f]
521where
522\f[d =  \fork{0}{if \texttt{src} has depth \texttt{CV\_8U}}{128}{if \texttt{src} has depth \texttt{CV\_8S}}\f]
523@param src input array of 8-bit elements.
524@param lut look-up table of 256 elements; in case of multi-channel input array, the table should
525either have a single channel (in this case the same table is used for all channels) or the same
526number of channels as in the input array.
527@param dst output array of the same size and number of channels as src, and the same depth as lut.
528@sa  convertScaleAbs, Mat::convertTo
529*/
530CV_EXPORTS_W void LUT(InputArray src, InputArray lut, OutputArray dst);
531
532/** @brief Calculates the sum of array elements.
533
534The functions sum calculate and return the sum of array elements,
535independently for each channel.
536@param src input array that must have from 1 to 4 channels.
537@sa  countNonZero, mean, meanStdDev, norm, minMaxLoc, reduce
538*/
539CV_EXPORTS_AS(sumElems) Scalar sum(InputArray src);
540
541/** @brief Counts non-zero array elements.
542
543The function returns the number of non-zero elements in src :
544\f[\sum _{I: \; \texttt{src} (I) \ne0 } 1\f]
545@param src single-channel array.
546@sa  mean, meanStdDev, norm, minMaxLoc, calcCovarMatrix
547*/
548CV_EXPORTS_W int countNonZero( InputArray src );
549
550/** @brief Returns the list of locations of non-zero pixels
551
552Given a binary matrix (likely returned from an operation such
553as threshold(), compare(), >, ==, etc, return all of
554the non-zero indices as a cv::Mat or std::vector<cv::Point> (x,y)
555For example:
556@code{.cpp}
557    cv::Mat binaryImage; // input, binary image
558    cv::Mat locations;   // output, locations of non-zero pixels
559    cv::findNonZero(binaryImage, locations);
560
561    // access pixel coordinates
562    Point pnt = locations.at<Point>(i);
563@endcode
564or
565@code{.cpp}
566    cv::Mat binaryImage; // input, binary image
567    vector<Point> locations;   // output, locations of non-zero pixels
568    cv::findNonZero(binaryImage, locations);
569
570    // access pixel coordinates
571    Point pnt = locations[i];
572@endcode
573@param src single-channel array (type CV_8UC1)
574@param idx the output array, type of cv::Mat or std::vector<Point>, corresponding to non-zero indices in the input
575*/
576CV_EXPORTS_W void findNonZero( InputArray src, OutputArray idx );
577
578/** @brief Calculates an average (mean) of array elements.
579
580The function mean calculates the mean value M of array elements,
581independently for each channel, and return it:
582\f[\begin{array}{l} N =  \sum _{I: \; \texttt{mask} (I) \ne 0} 1 \\ M_c =  \left ( \sum _{I: \; \texttt{mask} (I) \ne 0}{ \texttt{mtx} (I)_c} \right )/N \end{array}\f]
583When all the mask elements are 0's, the functions return Scalar::all(0)
584@param src input array that should have from 1 to 4 channels so that the result can be stored in
585Scalar_ .
586@param mask optional operation mask.
587@sa  countNonZero, meanStdDev, norm, minMaxLoc
588*/
589CV_EXPORTS_W Scalar mean(InputArray src, InputArray mask = noArray());
590
591/** Calculates a mean and standard deviation of array elements.
592
593The function meanStdDev calculates the mean and the standard deviation M
594of array elements independently for each channel and returns it via the
595output parameters:
596\f[\begin{array}{l} N =  \sum _{I, \texttt{mask} (I)  \ne 0} 1 \\ \texttt{mean} _c =  \frac{\sum_{ I: \; \texttt{mask}(I) \ne 0} \texttt{src} (I)_c}{N} \\ \texttt{stddev} _c =  \sqrt{\frac{\sum_{ I: \; \texttt{mask}(I) \ne 0} \left ( \texttt{src} (I)_c -  \texttt{mean} _c \right )^2}{N}} \end{array}\f]
597When all the mask elements are 0's, the functions return
598mean=stddev=Scalar::all(0).
599@note The calculated standard deviation is only the diagonal of the
600complete normalized covariance matrix. If the full matrix is needed, you
601can reshape the multi-channel array M x N to the single-channel array
602M\*N x mtx.channels() (only possible when the matrix is continuous) and
603then pass the matrix to calcCovarMatrix .
604@param src input array that should have from 1 to 4 channels so that the results can be stored in
605Scalar_ 's.
606@param mean output parameter: calculated mean value.
607@param stddev output parameter: calculateded standard deviation.
608@param mask optional operation mask.
609@sa  countNonZero, mean, norm, minMaxLoc, calcCovarMatrix
610*/
611CV_EXPORTS_W void meanStdDev(InputArray src, OutputArray mean, OutputArray stddev,
612                             InputArray mask=noArray());
613
614/** @brief Calculates an absolute array norm, an absolute difference norm, or a
615relative difference norm.
616
617The functions norm calculate an absolute norm of src1 (when there is no
618src2 ):
619
620\f[norm =  \forkthree{\|\texttt{src1}\|_{L_{\infty}} =  \max _I | \texttt{src1} (I)|}{if  \(\texttt{normType} = \texttt{NORM\_INF}\) }
621{ \| \texttt{src1} \| _{L_1} =  \sum _I | \texttt{src1} (I)|}{if  \(\texttt{normType} = \texttt{NORM\_L1}\) }
622{ \| \texttt{src1} \| _{L_2} =  \sqrt{\sum_I \texttt{src1}(I)^2} }{if  \(\texttt{normType} = \texttt{NORM\_L2}\) }\f]
623
624or an absolute or relative difference norm if src2 is there:
625
626\f[norm =  \forkthree{\|\texttt{src1}-\texttt{src2}\|_{L_{\infty}} =  \max _I | \texttt{src1} (I) -  \texttt{src2} (I)|}{if  \(\texttt{normType} = \texttt{NORM\_INF}\) }
627{ \| \texttt{src1} - \texttt{src2} \| _{L_1} =  \sum _I | \texttt{src1} (I) -  \texttt{src2} (I)|}{if  \(\texttt{normType} = \texttt{NORM\_L1}\) }
628{ \| \texttt{src1} - \texttt{src2} \| _{L_2} =  \sqrt{\sum_I (\texttt{src1}(I) - \texttt{src2}(I))^2} }{if  \(\texttt{normType} = \texttt{NORM\_L2}\) }\f]
629
630or
631
632\f[norm =  \forkthree{\frac{\|\texttt{src1}-\texttt{src2}\|_{L_{\infty}}    }{\|\texttt{src2}\|_{L_{\infty}} }}{if  \(\texttt{normType} = \texttt{NORM\_RELATIVE\_INF}\) }
633{ \frac{\|\texttt{src1}-\texttt{src2}\|_{L_1} }{\|\texttt{src2}\|_{L_1}} }{if  \(\texttt{normType} = \texttt{NORM\_RELATIVE\_L1}\) }
634{ \frac{\|\texttt{src1}-\texttt{src2}\|_{L_2} }{\|\texttt{src2}\|_{L_2}} }{if  \(\texttt{normType} = \texttt{NORM\_RELATIVE\_L2}\) }\f]
635
636The functions norm return the calculated norm.
637
638When the mask parameter is specified and it is not empty, the norm is
639calculated only over the region specified by the mask.
640
641A multi-channel input arrays are treated as a single-channel, that is,
642the results for all channels are combined.
643
644@param src1 first input array.
645@param normType type of the norm (see cv::NormTypes).
646@param mask optional operation mask; it must have the same size as src1 and CV_8UC1 type.
647*/
648CV_EXPORTS_W double norm(InputArray src1, int normType = NORM_L2, InputArray mask = noArray());
649
650/** @overload
651@param src1 first input array.
652@param src2 second input array of the same size and the same type as src1.
653@param normType type of the norm (cv::NormTypes).
654@param mask optional operation mask; it must have the same size as src1 and CV_8UC1 type.
655*/
656CV_EXPORTS_W double norm(InputArray src1, InputArray src2,
657                         int normType = NORM_L2, InputArray mask = noArray());
658/** @overload
659@param src first input array.
660@param normType type of the norm (see cv::NormTypes).
661*/
662CV_EXPORTS double norm( const SparseMat& src, int normType );
663
664/** @brief computes PSNR image/video quality metric
665
666see http://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio for details
667@todo document
668  */
669CV_EXPORTS_W double PSNR(InputArray src1, InputArray src2);
670
671/** @brief naive nearest neighbor finder
672
673see http://en.wikipedia.org/wiki/Nearest_neighbor_search
674@todo document
675  */
676CV_EXPORTS_W void batchDistance(InputArray src1, InputArray src2,
677                                OutputArray dist, int dtype, OutputArray nidx,
678                                int normType = NORM_L2, int K = 0,
679                                InputArray mask = noArray(), int update = 0,
680                                bool crosscheck = false);
681
682/** @brief Normalizes the norm or value range of an array.
683
684The functions normalize scale and shift the input array elements so that
685\f[\| \texttt{dst} \| _{L_p}= \texttt{alpha}\f]
686(where p=Inf, 1 or 2) when normType=NORM_INF, NORM_L1, or NORM_L2, respectively; or so that
687\f[\min _I  \texttt{dst} (I)= \texttt{alpha} , \, \, \max _I  \texttt{dst} (I)= \texttt{beta}\f]
688
689when normType=NORM_MINMAX (for dense arrays only). The optional mask specifies a sub-array to be
690normalized. This means that the norm or min-n-max are calculated over the sub-array, and then this
691sub-array is modified to be normalized. If you want to only use the mask to calculate the norm or
692min-max but modify the whole array, you can use norm and Mat::convertTo.
693
694In case of sparse matrices, only the non-zero values are analyzed and transformed. Because of this,
695the range transformation for sparse matrices is not allowed since it can shift the zero level.
696
697@param src input array.
698@param dst output array of the same size as src .
699@param alpha norm value to normalize to or the lower range boundary in case of the range
700normalization.
701@param beta upper range boundary in case of the range normalization; it is not used for the norm
702normalization.
703@param norm_type normalization type (see cv::NormTypes).
704@param dtype when negative, the output array has the same type as src; otherwise, it has the same
705number of channels as src and the depth =CV_MAT_DEPTH(dtype).
706@param mask optional operation mask.
707@sa norm, Mat::convertTo, SparseMat::convertTo
708*/
709CV_EXPORTS_W void normalize( InputArray src, InputOutputArray dst, double alpha = 1, double beta = 0,
710                             int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());
711
712/** @overload
713@param src input array.
714@param dst output array of the same size as src .
715@param alpha norm value to normalize to or the lower range boundary in case of the range
716normalization.
717@param normType normalization type (see cv::NormTypes).
718*/
719CV_EXPORTS void normalize( const SparseMat& src, SparseMat& dst, double alpha, int normType );
720
721/** @brief Finds the global minimum and maximum in an array.
722
723The functions minMaxLoc find the minimum and maximum element values and their positions. The
724extremums are searched across the whole array or, if mask is not an empty array, in the specified
725array region.
726
727The functions do not work with multi-channel arrays. If you need to find minimum or maximum
728elements across all the channels, use Mat::reshape first to reinterpret the array as
729single-channel. Or you may extract the particular channel using either extractImageCOI , or
730mixChannels , or split .
731@param src input single-channel array.
732@param minVal pointer to the returned minimum value; NULL is used if not required.
733@param maxVal pointer to the returned maximum value; NULL is used if not required.
734@param minLoc pointer to the returned minimum location (in 2D case); NULL is used if not required.
735@param maxLoc pointer to the returned maximum location (in 2D case); NULL is used if not required.
736@param mask optional mask used to select a sub-array.
737@sa max, min, compare, inRange, extractImageCOI, mixChannels, split, Mat::reshape
738*/
739CV_EXPORTS_W void minMaxLoc(InputArray src, CV_OUT double* minVal,
740                            CV_OUT double* maxVal = 0, CV_OUT Point* minLoc = 0,
741                            CV_OUT Point* maxLoc = 0, InputArray mask = noArray());
742
743
744/** @brief Finds the global minimum and maximum in an array
745
746The function minMaxIdx finds the minimum and maximum element values and their positions. The
747extremums are searched across the whole array or, if mask is not an empty array, in the specified
748array region. The function does not work with multi-channel arrays. If you need to find minimum or
749maximum elements across all the channels, use Mat::reshape first to reinterpret the array as
750single-channel. Or you may extract the particular channel using either extractImageCOI , or
751mixChannels , or split . In case of a sparse matrix, the minimum is found among non-zero elements
752only.
753@note When minIdx is not NULL, it must have at least 2 elements (as well as maxIdx), even if src is
754a single-row or single-column matrix. In OpenCV (following MATLAB) each array has at least 2
755dimensions, i.e. single-column matrix is Mx1 matrix (and therefore minIdx/maxIdx will be
756(i1,0)/(i2,0)) and single-row matrix is 1xN matrix (and therefore minIdx/maxIdx will be
757(0,j1)/(0,j2)).
758@param src input single-channel array.
759@param minVal pointer to the returned minimum value; NULL is used if not required.
760@param maxVal pointer to the returned maximum value; NULL is used if not required.
761@param minIdx pointer to the returned minimum location (in nD case); NULL is used if not required;
762Otherwise, it must point to an array of src.dims elements, the coordinates of the minimum element
763in each dimension are stored there sequentially.
764@param maxIdx pointer to the returned maximum location (in nD case). NULL is used if not required.
765@param mask specified array region
766*/
767CV_EXPORTS void minMaxIdx(InputArray src, double* minVal, double* maxVal = 0,
768                          int* minIdx = 0, int* maxIdx = 0, InputArray mask = noArray());
769
770/** @overload
771@param a input single-channel array.
772@param minVal pointer to the returned minimum value; NULL is used if not required.
773@param maxVal pointer to the returned maximum value; NULL is used if not required.
774@param minIdx pointer to the returned minimum location (in nD case); NULL is used if not required;
775Otherwise, it must point to an array of src.dims elements, the coordinates of the minimum element
776in each dimension are stored there sequentially.
777@param maxIdx pointer to the returned maximum location (in nD case). NULL is used if not required.
778*/
779CV_EXPORTS void minMaxLoc(const SparseMat& a, double* minVal,
780                          double* maxVal, int* minIdx = 0, int* maxIdx = 0);
781
782/** @brief Reduces a matrix to a vector.
783
784The function reduce reduces the matrix to a vector by treating the matrix rows/columns as a set of
7851D vectors and performing the specified operation on the vectors until a single row/column is
786obtained. For example, the function can be used to compute horizontal and vertical projections of a
787raster image. In case of REDUCE_SUM and REDUCE_AVG , the output may have a larger element
788bit-depth to preserve accuracy. And multi-channel arrays are also supported in these two reduction
789modes.
790@param src input 2D matrix.
791@param dst output vector. Its size and type is defined by dim and dtype parameters.
792@param dim dimension index along which the matrix is reduced. 0 means that the matrix is reduced to
793a single row. 1 means that the matrix is reduced to a single column.
794@param rtype reduction operation that could be one of cv::ReduceTypes
795@param dtype when negative, the output vector will have the same type as the input matrix,
796otherwise, its type will be CV_MAKE_TYPE(CV_MAT_DEPTH(dtype), src.channels()).
797@sa repeat
798*/
799CV_EXPORTS_W void reduce(InputArray src, OutputArray dst, int dim, int rtype, int dtype = -1);
800
801/** @brief Creates one multichannel array out of several single-channel ones.
802
803The functions merge merge several arrays to make a single multi-channel array. That is, each
804element of the output array will be a concatenation of the elements of the input arrays, where
805elements of i-th input array are treated as mv[i].channels()-element vectors.
806
807The function split does the reverse operation. If you need to shuffle channels in some other
808advanced way, use mixChannels .
809@param mv input array of matrices to be merged; all the matrices in mv must have the same
810size and the same depth.
811@param count number of input matrices when mv is a plain C array; it must be greater than zero.
812@param dst output array of the same size and the same depth as mv[0]; The number of channels will
813be the total number of channels in the matrix array.
814@sa  mixChannels, split, Mat::reshape
815*/
816CV_EXPORTS void merge(const Mat* mv, size_t count, OutputArray dst);
817
818/** @overload
819@param mv input vector of matrices to be merged; all the matrices in mv must have the same
820size and the same depth.
821@param dst output array of the same size and the same depth as mv[0]; The number of channels will
822be the total number of channels in the matrix array.
823  */
824CV_EXPORTS_W void merge(InputArrayOfArrays mv, OutputArray dst);
825
826/** @brief Divides a multi-channel array into several single-channel arrays.
827
828The functions split split a multi-channel array into separate single-channel arrays:
829\f[\texttt{mv} [c](I) =  \texttt{src} (I)_c\f]
830If you need to extract a single channel or do some other sophisticated channel permutation, use
831mixChannels .
832@param src input multi-channel array.
833@param mvbegin output array; the number of arrays must match src.channels(); the arrays themselves are
834reallocated, if needed.
835@sa merge, mixChannels, cvtColor
836*/
837CV_EXPORTS void split(const Mat& src, Mat* mvbegin);
838
839/** @overload
840@param m input multi-channel array.
841@param mv output vector of arrays; the arrays themselves are reallocated, if needed.
842*/
843CV_EXPORTS_W void split(InputArray m, OutputArrayOfArrays mv);
844
845/** @brief Copies specified channels from input arrays to the specified channels of
846output arrays.
847
848The functions mixChannels provide an advanced mechanism for shuffling image channels.
849
850split and merge and some forms of cvtColor are partial cases of mixChannels .
851
852In the example below, the code splits a 4-channel RGBA image into a 3-channel BGR (with R and B
853channels swapped) and a separate alpha-channel image:
854@code{.cpp}
855    Mat rgba( 100, 100, CV_8UC4, Scalar(1,2,3,4) );
856    Mat bgr( rgba.rows, rgba.cols, CV_8UC3 );
857    Mat alpha( rgba.rows, rgba.cols, CV_8UC1 );
858
859    // forming an array of matrices is a quite efficient operation,
860    // because the matrix data is not copied, only the headers
861    Mat out[] = { bgr, alpha };
862    // rgba[0] -> bgr[2], rgba[1] -> bgr[1],
863    // rgba[2] -> bgr[0], rgba[3] -> alpha[0]
864    int from_to[] = { 0,2, 1,1, 2,0, 3,3 };
865    mixChannels( &rgba, 1, out, 2, from_to, 4 );
866@endcode
867@note Unlike many other new-style C++ functions in OpenCV (see the introduction section and
868Mat::create ), mixChannels requires the output arrays to be pre-allocated before calling the
869function.
870@param src input array or vector of matricesl; all of the matrices must have the same size and the
871same depth.
872@param nsrcs number of matrices in src.
873@param dst output array or vector of matrices; all the matrices *must be allocated*; their size and
874depth must be the same as in src[0].
875@param ndsts number of matrices in dst.
876@param fromTo array of index pairs specifying which channels are copied and where; fromTo[k\*2] is
877a 0-based index of the input channel in src, fromTo[k\*2+1] is an index of the output channel in
878dst; the continuous channel numbering is used: the first input image channels are indexed from 0 to
879src[0].channels()-1, the second input image channels are indexed from src[0].channels() to
880src[0].channels() + src[1].channels()-1, and so on, the same scheme is used for the output image
881channels; as a special case, when fromTo[k\*2] is negative, the corresponding output channel is
882filled with zero .
883@param npairs number of index pairs in fromTo.
884@sa split, merge, cvtColor
885*/
886CV_EXPORTS void mixChannels(const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts,
887                            const int* fromTo, size_t npairs);
888
889/** @overload
890@param src input array or vector of matricesl; all of the matrices must have the same size and the
891same depth.
892@param dst output array or vector of matrices; all the matrices *must be allocated*; their size and
893depth must be the same as in src[0].
894@param fromTo array of index pairs specifying which channels are copied and where; fromTo[k\*2] is
895a 0-based index of the input channel in src, fromTo[k\*2+1] is an index of the output channel in
896dst; the continuous channel numbering is used: the first input image channels are indexed from 0 to
897src[0].channels()-1, the second input image channels are indexed from src[0].channels() to
898src[0].channels() + src[1].channels()-1, and so on, the same scheme is used for the output image
899channels; as a special case, when fromTo[k\*2] is negative, the corresponding output channel is
900filled with zero .
901@param npairs number of index pairs in fromTo.
902*/
903CV_EXPORTS void mixChannels(InputArrayOfArrays src, InputOutputArrayOfArrays dst,
904                            const int* fromTo, size_t npairs);
905
906/** @overload
907@param src input array or vector of matricesl; all of the matrices must have the same size and the
908same depth.
909@param dst output array or vector of matrices; all the matrices *must be allocated*; their size and
910depth must be the same as in src[0].
911@param fromTo array of index pairs specifying which channels are copied and where; fromTo[k\*2] is
912a 0-based index of the input channel in src, fromTo[k\*2+1] is an index of the output channel in
913dst; the continuous channel numbering is used: the first input image channels are indexed from 0 to
914src[0].channels()-1, the second input image channels are indexed from src[0].channels() to
915src[0].channels() + src[1].channels()-1, and so on, the same scheme is used for the output image
916channels; as a special case, when fromTo[k\*2] is negative, the corresponding output channel is
917filled with zero .
918*/
919CV_EXPORTS_W void mixChannels(InputArrayOfArrays src, InputOutputArrayOfArrays dst,
920                              const std::vector<int>& fromTo);
921
922/** @brief extracts a single channel from src (coi is 0-based index)
923@todo document
924*/
925CV_EXPORTS_W void extractChannel(InputArray src, OutputArray dst, int coi);
926
927/** @brief inserts a single channel to dst (coi is 0-based index)
928@todo document
929*/
930CV_EXPORTS_W void insertChannel(InputArray src, InputOutputArray dst, int coi);
931
932/** @brief Flips a 2D array around vertical, horizontal, or both axes.
933
934The function flip flips the array in one of three different ways (row
935and column indices are 0-based):
936\f[\texttt{dst} _{ij} =
937\left\{
938\begin{array}{l l}
939\texttt{src} _{\texttt{src.rows}-i-1,j} & if\;  \texttt{flipCode} = 0 \\
940\texttt{src} _{i, \texttt{src.cols} -j-1} & if\;  \texttt{flipCode} > 0 \\
941\texttt{src} _{ \texttt{src.rows} -i-1, \texttt{src.cols} -j-1} & if\; \texttt{flipCode} < 0 \\
942\end{array}
943\right.\f]
944The example scenarios of using the function are the following:
945*   Vertical flipping of the image (flipCode == 0) to switch between
946    top-left and bottom-left image origin. This is a typical operation
947    in video processing on Microsoft Windows\* OS.
948*   Horizontal flipping of the image with the subsequent horizontal
949    shift and absolute difference calculation to check for a
950    vertical-axis symmetry (flipCode \> 0).
951*   Simultaneous horizontal and vertical flipping of the image with
952    the subsequent shift and absolute difference calculation to check
953    for a central symmetry (flipCode \< 0).
954*   Reversing the order of point arrays (flipCode \> 0 or
955    flipCode == 0).
956@param src input array.
957@param dst output array of the same size and type as src.
958@param flipCode a flag to specify how to flip the array; 0 means
959flipping around the x-axis and positive value (for example, 1) means
960flipping around y-axis. Negative value (for example, -1) means flipping
961around both axes.
962@sa transpose , repeat , completeSymm
963*/
964CV_EXPORTS_W void flip(InputArray src, OutputArray dst, int flipCode);
965
966/** @brief Fills the output array with repeated copies of the input array.
967
968The functions repeat duplicate the input array one or more times along each of the two axes:
969\f[\texttt{dst} _{ij}= \texttt{src} _{i\mod src.rows, \; j\mod src.cols }\f]
970The second variant of the function is more convenient to use with @ref MatrixExpressions.
971@param src input array to replicate.
972@param dst output array of the same type as src.
973@param ny Flag to specify how many times the src is repeated along the
974vertical axis.
975@param nx Flag to specify how many times the src is repeated along the
976horizontal axis.
977@sa reduce
978*/
979CV_EXPORTS_W void repeat(InputArray src, int ny, int nx, OutputArray dst);
980
981/** @overload
982@param src input array to replicate.
983@param ny Flag to specify how many times the src is repeated along the
984vertical axis.
985@param nx Flag to specify how many times the src is repeated along the
986horizontal axis.
987  */
988CV_EXPORTS Mat repeat(const Mat& src, int ny, int nx);
989
990/** @brief Applies horizontal concatenation to given matrices.
991
992The function horizontally concatenates two or more cv::Mat matrices (with the same number of rows).
993@code{.cpp}
994    cv::Mat matArray[] = { cv::Mat(4, 1, CV_8UC1, cv::Scalar(1)),
995                           cv::Mat(4, 1, CV_8UC1, cv::Scalar(2)),
996                           cv::Mat(4, 1, CV_8UC1, cv::Scalar(3)),};
997
998    cv::Mat out;
999    cv::hconcat( matArray, 3, out );
1000    //out:
1001    //[1, 2, 3;
1002    // 1, 2, 3;
1003    // 1, 2, 3;
1004    // 1, 2, 3]
1005@endcode
1006@param src input array or vector of matrices. all of the matrices must have the same number of rows and the same depth.
1007@param nsrc number of matrices in src.
1008@param dst output array. It has the same number of rows and depth as the src, and the sum of cols of the src.
1009@sa cv::vconcat(const Mat*, size_t, OutputArray), @sa cv::vconcat(InputArrayOfArrays, OutputArray) and @sa cv::vconcat(InputArray, InputArray, OutputArray)
1010*/
1011CV_EXPORTS void hconcat(const Mat* src, size_t nsrc, OutputArray dst);
1012/** @overload
1013 @code{.cpp}
1014    cv::Mat_<float> A = (cv::Mat_<float>(3, 2) << 1, 4,
1015                                                  2, 5,
1016                                                  3, 6);
1017    cv::Mat_<float> B = (cv::Mat_<float>(3, 2) << 7, 10,
1018                                                  8, 11,
1019                                                  9, 12);
1020
1021    cv::Mat C;
1022    cv::hconcat(A, B, C);
1023    //C:
1024    //[1, 4, 7, 10;
1025    // 2, 5, 8, 11;
1026    // 3, 6, 9, 12]
1027 @endcode
1028 @param src1 first input array to be considered for horizontal concatenation.
1029 @param src2 second input array to be considered for horizontal concatenation.
1030 @param dst output array. It has the same number of rows and depth as the src1 and src2, and the sum of cols of the src1 and src2.
1031 */
1032CV_EXPORTS void hconcat(InputArray src1, InputArray src2, OutputArray dst);
1033/** @overload
1034 @code{.cpp}
1035    std::vector<cv::Mat> matrices = { cv::Mat(4, 1, CV_8UC1, cv::Scalar(1)),
1036                                      cv::Mat(4, 1, CV_8UC1, cv::Scalar(2)),
1037                                      cv::Mat(4, 1, CV_8UC1, cv::Scalar(3)),};
1038
1039    cv::Mat out;
1040    cv::hconcat( matrices, out );
1041    //out:
1042    //[1, 2, 3;
1043    // 1, 2, 3;
1044    // 1, 2, 3;
1045    // 1, 2, 3]
1046 @endcode
1047 @param src input array or vector of matrices. all of the matrices must have the same number of rows and the same depth.
1048 @param dst output array. It has the same number of rows and depth as the src, and the sum of cols of the src.
1049same depth.
1050 */
1051CV_EXPORTS_W void hconcat(InputArrayOfArrays src, OutputArray dst);
1052
1053/** @brief Applies vertical concatenation to given matrices.
1054
1055The function vertically concatenates two or more cv::Mat matrices (with the same number of cols).
1056@code{.cpp}
1057    cv::Mat matArray[] = { cv::Mat(1, 4, CV_8UC1, cv::Scalar(1)),
1058                           cv::Mat(1, 4, CV_8UC1, cv::Scalar(2)),
1059                           cv::Mat(1, 4, CV_8UC1, cv::Scalar(3)),};
1060
1061    cv::Mat out;
1062    cv::vconcat( matArray, 3, out );
1063    //out:
1064    //[1,   1,   1,   1;
1065    // 2,   2,   2,   2;
1066    // 3,   3,   3,   3]
1067@endcode
1068@param src input array or vector of matrices. all of the matrices must have the same number of cols and the same depth.
1069@param nsrc number of matrices in src.
1070@param dst output array. It has the same number of cols and depth as the src, and the sum of rows of the src.
1071@sa cv::hconcat(const Mat*, size_t, OutputArray), @sa cv::hconcat(InputArrayOfArrays, OutputArray) and @sa cv::hconcat(InputArray, InputArray, OutputArray)
1072*/
1073CV_EXPORTS void vconcat(const Mat* src, size_t nsrc, OutputArray dst);
1074/** @overload
1075 @code{.cpp}
1076    cv::Mat_<float> A = (cv::Mat_<float>(3, 2) << 1, 7,
1077                                                  2, 8,
1078                                                  3, 9);
1079    cv::Mat_<float> B = (cv::Mat_<float>(3, 2) << 4, 10,
1080                                                  5, 11,
1081                                                  6, 12);
1082
1083    cv::Mat C;
1084    cv::vconcat(A, B, C);
1085    //C:
1086    //[1, 7;
1087    // 2, 8;
1088    // 3, 9;
1089    // 4, 10;
1090    // 5, 11;
1091    // 6, 12]
1092 @endcode
1093 @param src1 first input array to be considered for vertical concatenation.
1094 @param src2 second input array to be considered for vertical concatenation.
1095 @param dst output array. It has the same number of cols and depth as the src1 and src2, and the sum of rows of the src1 and src2.
1096 */
1097CV_EXPORTS void vconcat(InputArray src1, InputArray src2, OutputArray dst);
1098/** @overload
1099 @code{.cpp}
1100    std::vector<cv::Mat> matrices = { cv::Mat(1, 4, CV_8UC1, cv::Scalar(1)),
1101                                      cv::Mat(1, 4, CV_8UC1, cv::Scalar(2)),
1102                                      cv::Mat(1, 4, CV_8UC1, cv::Scalar(3)),};
1103
1104    cv::Mat out;
1105    cv::vconcat( matrices, out );
1106    //out:
1107    //[1,   1,   1,   1;
1108    // 2,   2,   2,   2;
1109    // 3,   3,   3,   3]
1110 @endcode
1111 @param src input array or vector of matrices. all of the matrices must have the same number of cols and the same depth
1112 @param dst output array. It has the same number of cols and depth as the src, and the sum of rows of the src.
1113same depth.
1114 */
1115CV_EXPORTS_W void vconcat(InputArrayOfArrays src, OutputArray dst);
1116
1117/** @brief computes bitwise conjunction of the two arrays (dst = src1 & src2)
1118Calculates the per-element bit-wise conjunction of two arrays or an
1119array and a scalar.
1120
1121The function calculates the per-element bit-wise logical conjunction for:
1122*   Two arrays when src1 and src2 have the same size:
1123    \f[\texttt{dst} (I) =  \texttt{src1} (I)  \wedge \texttt{src2} (I) \quad \texttt{if mask} (I) \ne0\f]
1124*   An array and a scalar when src2 is constructed from Scalar or has
1125    the same number of elements as `src1.channels()`:
1126    \f[\texttt{dst} (I) =  \texttt{src1} (I)  \wedge \texttt{src2} \quad \texttt{if mask} (I) \ne0\f]
1127*   A scalar and an array when src1 is constructed from Scalar or has
1128    the same number of elements as `src2.channels()`:
1129    \f[\texttt{dst} (I) =  \texttt{src1}  \wedge \texttt{src2} (I) \quad \texttt{if mask} (I) \ne0\f]
1130In case of floating-point arrays, their machine-specific bit
1131representations (usually IEEE754-compliant) are used for the operation.
1132In case of multi-channel arrays, each channel is processed
1133independently. In the second and third cases above, the scalar is first
1134converted to the array type.
1135@param src1 first input array or a scalar.
1136@param src2 second input array or a scalar.
1137@param dst output array that has the same size and type as the input
1138arrays.
1139@param mask optional operation mask, 8-bit single channel array, that
1140specifies elements of the output array to be changed.
1141*/
1142CV_EXPORTS_W void bitwise_and(InputArray src1, InputArray src2,
1143                              OutputArray dst, InputArray mask = noArray());
1144
1145/** @brief Calculates the per-element bit-wise disjunction of two arrays or an
1146array and a scalar.
1147
1148The function calculates the per-element bit-wise logical disjunction for:
1149*   Two arrays when src1 and src2 have the same size:
1150    \f[\texttt{dst} (I) =  \texttt{src1} (I)  \vee \texttt{src2} (I) \quad \texttt{if mask} (I) \ne0\f]
1151*   An array and a scalar when src2 is constructed from Scalar or has
1152    the same number of elements as `src1.channels()`:
1153    \f[\texttt{dst} (I) =  \texttt{src1} (I)  \vee \texttt{src2} \quad \texttt{if mask} (I) \ne0\f]
1154*   A scalar and an array when src1 is constructed from Scalar or has
1155    the same number of elements as `src2.channels()`:
1156    \f[\texttt{dst} (I) =  \texttt{src1}  \vee \texttt{src2} (I) \quad \texttt{if mask} (I) \ne0\f]
1157In case of floating-point arrays, their machine-specific bit
1158representations (usually IEEE754-compliant) are used for the operation.
1159In case of multi-channel arrays, each channel is processed
1160independently. In the second and third cases above, the scalar is first
1161converted to the array type.
1162@param src1 first input array or a scalar.
1163@param src2 second input array or a scalar.
1164@param dst output array that has the same size and type as the input
1165arrays.
1166@param mask optional operation mask, 8-bit single channel array, that
1167specifies elements of the output array to be changed.
1168*/
1169CV_EXPORTS_W void bitwise_or(InputArray src1, InputArray src2,
1170                             OutputArray dst, InputArray mask = noArray());
1171
1172/** @brief Calculates the per-element bit-wise "exclusive or" operation on two
1173arrays or an array and a scalar.
1174
1175The function calculates the per-element bit-wise logical "exclusive-or"
1176operation for:
1177*   Two arrays when src1 and src2 have the same size:
1178    \f[\texttt{dst} (I) =  \texttt{src1} (I)  \oplus \texttt{src2} (I) \quad \texttt{if mask} (I) \ne0\f]
1179*   An array and a scalar when src2 is constructed from Scalar or has
1180    the same number of elements as `src1.channels()`:
1181    \f[\texttt{dst} (I) =  \texttt{src1} (I)  \oplus \texttt{src2} \quad \texttt{if mask} (I) \ne0\f]
1182*   A scalar and an array when src1 is constructed from Scalar or has
1183    the same number of elements as `src2.channels()`:
1184    \f[\texttt{dst} (I) =  \texttt{src1}  \oplus \texttt{src2} (I) \quad \texttt{if mask} (I) \ne0\f]
1185In case of floating-point arrays, their machine-specific bit
1186representations (usually IEEE754-compliant) are used for the operation.
1187In case of multi-channel arrays, each channel is processed
1188independently. In the 2nd and 3rd cases above, the scalar is first
1189converted to the array type.
1190@param src1 first input array or a scalar.
1191@param src2 second input array or a scalar.
1192@param dst output array that has the same size and type as the input
1193arrays.
1194@param mask optional operation mask, 8-bit single channel array, that
1195specifies elements of the output array to be changed.
1196*/
1197CV_EXPORTS_W void bitwise_xor(InputArray src1, InputArray src2,
1198                              OutputArray dst, InputArray mask = noArray());
1199
1200/** @brief  Inverts every bit of an array.
1201
1202The function calculates per-element bit-wise inversion of the input
1203array:
1204\f[\texttt{dst} (I) =  \neg \texttt{src} (I)\f]
1205In case of a floating-point input array, its machine-specific bit
1206representation (usually IEEE754-compliant) is used for the operation. In
1207case of multi-channel arrays, each channel is processed independently.
1208@param src input array.
1209@param dst output array that has the same size and type as the input
1210array.
1211@param mask optional operation mask, 8-bit single channel array, that
1212specifies elements of the output array to be changed.
1213*/
1214CV_EXPORTS_W void bitwise_not(InputArray src, OutputArray dst,
1215                              InputArray mask = noArray());
1216
1217/** @brief Calculates the per-element absolute difference between two arrays or between an array and a scalar.
1218
1219The function absdiff calculates:
1220*   Absolute difference between two arrays when they have the same
1221    size and type:
1222    \f[\texttt{dst}(I) =  \texttt{saturate} (| \texttt{src1}(I) -  \texttt{src2}(I)|)\f]
1223*   Absolute difference between an array and a scalar when the second
1224    array is constructed from Scalar or has as many elements as the
1225    number of channels in `src1`:
1226    \f[\texttt{dst}(I) =  \texttt{saturate} (| \texttt{src1}(I) -  \texttt{src2} |)\f]
1227*   Absolute difference between a scalar and an array when the first
1228    array is constructed from Scalar or has as many elements as the
1229    number of channels in `src2`:
1230    \f[\texttt{dst}(I) =  \texttt{saturate} (| \texttt{src1} -  \texttt{src2}(I) |)\f]
1231    where I is a multi-dimensional index of array elements. In case of
1232    multi-channel arrays, each channel is processed independently.
1233@note Saturation is not applied when the arrays have the depth CV_32S.
1234You may even get a negative value in the case of overflow.
1235@param src1 first input array or a scalar.
1236@param src2 second input array or a scalar.
1237@param dst output array that has the same size and type as input arrays.
1238@sa cv::abs(const Mat&)
1239*/
1240CV_EXPORTS_W void absdiff(InputArray src1, InputArray src2, OutputArray dst);
1241
1242/** @brief  Checks if array elements lie between the elements of two other arrays.
1243
1244The function checks the range as follows:
1245-   For every element of a single-channel input array:
1246    \f[\texttt{dst} (I)= \texttt{lowerb} (I)_0  \leq \texttt{src} (I)_0 \leq  \texttt{upperb} (I)_0\f]
1247-   For two-channel arrays:
1248    \f[\texttt{dst} (I)= \texttt{lowerb} (I)_0  \leq \texttt{src} (I)_0 \leq  \texttt{upperb} (I)_0  \land \texttt{lowerb} (I)_1  \leq \texttt{src} (I)_1 \leq  \texttt{upperb} (I)_1\f]
1249-   and so forth.
1250
1251That is, dst (I) is set to 255 (all 1 -bits) if src (I) is within the
1252specified 1D, 2D, 3D, ... box and 0 otherwise.
1253
1254When the lower and/or upper boundary parameters are scalars, the indexes
1255(I) at lowerb and upperb in the above formulas should be omitted.
1256@param src first input array.
1257@param lowerb inclusive lower boundary array or a scalar.
1258@param upperb inclusive upper boundary array or a scalar.
1259@param dst output array of the same size as src and CV_8U type.
1260*/
1261CV_EXPORTS_W void inRange(InputArray src, InputArray lowerb,
1262                          InputArray upperb, OutputArray dst);
1263
1264/** @brief Performs the per-element comparison of two arrays or an array and scalar value.
1265
1266The function compares:
1267*   Elements of two arrays when src1 and src2 have the same size:
1268    \f[\texttt{dst} (I) =  \texttt{src1} (I)  \,\texttt{cmpop}\, \texttt{src2} (I)\f]
1269*   Elements of src1 with a scalar src2 when src2 is constructed from
1270    Scalar or has a single element:
1271    \f[\texttt{dst} (I) =  \texttt{src1}(I) \,\texttt{cmpop}\,  \texttt{src2}\f]
1272*   src1 with elements of src2 when src1 is constructed from Scalar or
1273    has a single element:
1274    \f[\texttt{dst} (I) =  \texttt{src1}  \,\texttt{cmpop}\, \texttt{src2} (I)\f]
1275When the comparison result is true, the corresponding element of output
1276array is set to 255. The comparison operations can be replaced with the
1277equivalent matrix expressions:
1278@code{.cpp}
1279    Mat dst1 = src1 >= src2;
1280    Mat dst2 = src1 < 8;
1281    ...
1282@endcode
1283@param src1 first input array or a scalar; when it is an array, it must have a single channel.
1284@param src2 second input array or a scalar; when it is an array, it must have a single channel.
1285@param dst output array of type ref CV_8U that has the same size and the same number of channels as
1286    the input arrays.
1287@param cmpop a flag, that specifies correspondence between the arrays (cv::CmpTypes)
1288@sa checkRange, min, max, threshold
1289*/
1290CV_EXPORTS_W void compare(InputArray src1, InputArray src2, OutputArray dst, int cmpop);
1291
1292/** @brief Calculates per-element minimum of two arrays or an array and a scalar.
1293
1294The functions min calculate the per-element minimum of two arrays:
1295\f[\texttt{dst} (I)= \min ( \texttt{src1} (I), \texttt{src2} (I))\f]
1296or array and a scalar:
1297\f[\texttt{dst} (I)= \min ( \texttt{src1} (I), \texttt{value} )\f]
1298@param src1 first input array.
1299@param src2 second input array of the same size and type as src1.
1300@param dst output array of the same size and type as src1.
1301@sa max, compare, inRange, minMaxLoc
1302*/
1303CV_EXPORTS_W void min(InputArray src1, InputArray src2, OutputArray dst);
1304/** @overload
1305needed to avoid conflicts with const _Tp& std::min(const _Tp&, const _Tp&, _Compare)
1306*/
1307CV_EXPORTS void min(const Mat& src1, const Mat& src2, Mat& dst);
1308/** @overload
1309needed to avoid conflicts with const _Tp& std::min(const _Tp&, const _Tp&, _Compare)
1310*/
1311CV_EXPORTS void min(const UMat& src1, const UMat& src2, UMat& dst);
1312
1313/** @brief Calculates per-element maximum of two arrays or an array and a scalar.
1314
1315The functions max calculate the per-element maximum of two arrays:
1316\f[\texttt{dst} (I)= \max ( \texttt{src1} (I), \texttt{src2} (I))\f]
1317or array and a scalar:
1318\f[\texttt{dst} (I)= \max ( \texttt{src1} (I), \texttt{value} )\f]
1319@param src1 first input array.
1320@param src2 second input array of the same size and type as src1 .
1321@param dst output array of the same size and type as src1.
1322@sa  min, compare, inRange, minMaxLoc, @ref MatrixExpressions
1323*/
1324CV_EXPORTS_W void max(InputArray src1, InputArray src2, OutputArray dst);
1325/** @overload
1326needed to avoid conflicts with const _Tp& std::min(const _Tp&, const _Tp&, _Compare)
1327*/
1328CV_EXPORTS void max(const Mat& src1, const Mat& src2, Mat& dst);
1329/** @overload
1330needed to avoid conflicts with const _Tp& std::min(const _Tp&, const _Tp&, _Compare)
1331*/
1332CV_EXPORTS void max(const UMat& src1, const UMat& src2, UMat& dst);
1333
1334/** @brief Calculates a square root of array elements.
1335
1336The functions sqrt calculate a square root of each input array element.
1337In case of multi-channel arrays, each channel is processed
1338independently. The accuracy is approximately the same as of the built-in
1339std::sqrt .
1340@param src input floating-point array.
1341@param dst output array of the same size and type as src.
1342*/
1343CV_EXPORTS_W void sqrt(InputArray src, OutputArray dst);
1344
1345/** @brief Raises every array element to a power.
1346
1347The function pow raises every element of the input array to power :
1348\f[\texttt{dst} (I) =  \fork{\texttt{src}(I)^power}{if \texttt{power} is integer}{|\texttt{src}(I)|^power}{otherwise}\f]
1349
1350So, for a non-integer power exponent, the absolute values of input array
1351elements are used. However, it is possible to get true values for
1352negative values using some extra operations. In the example below,
1353computing the 5th root of array src shows:
1354@code{.cpp}
1355    Mat mask = src < 0;
1356    pow(src, 1./5, dst);
1357    subtract(Scalar::all(0), dst, dst, mask);
1358@endcode
1359For some values of power, such as integer values, 0.5 and -0.5,
1360specialized faster algorithms are used.
1361
1362Special values (NaN, Inf) are not handled.
1363@param src input array.
1364@param power exponent of power.
1365@param dst output array of the same size and type as src.
1366@sa sqrt, exp, log, cartToPolar, polarToCart
1367*/
1368CV_EXPORTS_W void pow(InputArray src, double power, OutputArray dst);
1369
1370/** @brief Calculates the exponent of every array element.
1371
1372The function exp calculates the exponent of every element of the input
1373array:
1374\f[\texttt{dst} [I] = e^{ src(I) }\f]
1375
1376The maximum relative error is about 7e-6 for single-precision input and
1377less than 1e-10 for double-precision input. Currently, the function
1378converts denormalized values to zeros on output. Special values (NaN,
1379Inf) are not handled.
1380@param src input array.
1381@param dst output array of the same size and type as src.
1382@sa log , cartToPolar , polarToCart , phase , pow , sqrt , magnitude
1383*/
1384CV_EXPORTS_W void exp(InputArray src, OutputArray dst);
1385
1386/** @brief Calculates the natural logarithm of every array element.
1387
1388The function log calculates the natural logarithm of the absolute value
1389of every element of the input array:
1390\f[\texttt{dst} (I) =  \fork{\log |\texttt{src}(I)|}{if \(\texttt{src}(I) \ne 0\) }{\texttt{C}}{otherwise}\f]
1391
1392where C is a large negative number (about -700 in the current
1393implementation). The maximum relative error is about 7e-6 for
1394single-precision input and less than 1e-10 for double-precision input.
1395Special values (NaN, Inf) are not handled.
1396@param src input array.
1397@param dst output array of the same size and type as src .
1398@sa exp, cartToPolar, polarToCart, phase, pow, sqrt, magnitude
1399*/
1400CV_EXPORTS_W void log(InputArray src, OutputArray dst);
1401
1402/** @brief Calculates x and y coordinates of 2D vectors from their magnitude and angle.
1403
1404The function polarToCart calculates the Cartesian coordinates of each 2D
1405vector represented by the corresponding elements of magnitude and angle:
1406\f[\begin{array}{l} \texttt{x} (I) =  \texttt{magnitude} (I) \cos ( \texttt{angle} (I)) \\ \texttt{y} (I) =  \texttt{magnitude} (I) \sin ( \texttt{angle} (I)) \\ \end{array}\f]
1407
1408The relative accuracy of the estimated coordinates is about 1e-6.
1409@param magnitude input floating-point array of magnitudes of 2D vectors;
1410it can be an empty matrix (=Mat()), in this case, the function assumes
1411that all the magnitudes are =1; if it is not empty, it must have the
1412same size and type as angle.
1413@param angle input floating-point array of angles of 2D vectors.
1414@param x output array of x-coordinates of 2D vectors; it has the same
1415size and type as angle.
1416@param y output array of y-coordinates of 2D vectors; it has the same
1417size and type as angle.
1418@param angleInDegrees when true, the input angles are measured in
1419degrees, otherwise, they are measured in radians.
1420@sa cartToPolar, magnitude, phase, exp, log, pow, sqrt
1421*/
1422CV_EXPORTS_W void polarToCart(InputArray magnitude, InputArray angle,
1423                              OutputArray x, OutputArray y, bool angleInDegrees = false);
1424
1425/** @brief Calculates the magnitude and angle of 2D vectors.
1426
1427The function cartToPolar calculates either the magnitude, angle, or both
1428for every 2D vector (x(I),y(I)):
1429\f[\begin{array}{l} \texttt{magnitude} (I)= \sqrt{\texttt{x}(I)^2+\texttt{y}(I)^2} , \\ \texttt{angle} (I)= \texttt{atan2} ( \texttt{y} (I), \texttt{x} (I))[ \cdot180 / \pi ] \end{array}\f]
1430
1431The angles are calculated with accuracy about 0.3 degrees. For the point
1432(0,0), the angle is set to 0.
1433@param x array of x-coordinates; this must be a single-precision or
1434double-precision floating-point array.
1435@param y array of y-coordinates, that must have the same size and same type as x.
1436@param magnitude output array of magnitudes of the same size and type as x.
1437@param angle output array of angles that has the same size and type as
1438x; the angles are measured in radians (from 0 to 2\*Pi) or in degrees (0 to 360 degrees).
1439@param angleInDegrees a flag, indicating whether the angles are measured
1440in radians (which is by default), or in degrees.
1441@sa Sobel, Scharr
1442*/
1443CV_EXPORTS_W void cartToPolar(InputArray x, InputArray y,
1444                              OutputArray magnitude, OutputArray angle,
1445                              bool angleInDegrees = false);
1446
1447/** @brief Calculates the rotation angle of 2D vectors.
1448
1449The function phase calculates the rotation angle of each 2D vector that
1450is formed from the corresponding elements of x and y :
1451\f[\texttt{angle} (I) =  \texttt{atan2} ( \texttt{y} (I), \texttt{x} (I))\f]
1452
1453The angle estimation accuracy is about 0.3 degrees. When x(I)=y(I)=0 ,
1454the corresponding angle(I) is set to 0.
1455@param x input floating-point array of x-coordinates of 2D vectors.
1456@param y input array of y-coordinates of 2D vectors; it must have the
1457same size and the same type as x.
1458@param angle output array of vector angles; it has the same size and
1459same type as x .
1460@param angleInDegrees when true, the function calculates the angle in
1461degrees, otherwise, they are measured in radians.
1462*/
1463CV_EXPORTS_W void phase(InputArray x, InputArray y, OutputArray angle,
1464                        bool angleInDegrees = false);
1465
1466/** @brief Calculates the magnitude of 2D vectors.
1467
1468The function magnitude calculates the magnitude of 2D vectors formed
1469from the corresponding elements of x and y arrays:
1470\f[\texttt{dst} (I) =  \sqrt{\texttt{x}(I)^2 + \texttt{y}(I)^2}\f]
1471@param x floating-point array of x-coordinates of the vectors.
1472@param y floating-point array of y-coordinates of the vectors; it must
1473have the same size as x.
1474@param magnitude output array of the same size and type as x.
1475@sa cartToPolar, polarToCart, phase, sqrt
1476*/
1477CV_EXPORTS_W void magnitude(InputArray x, InputArray y, OutputArray magnitude);
1478
1479/** @brief Checks every element of an input array for invalid values.
1480
1481The functions checkRange check that every array element is neither NaN nor infinite. When minVal \<
1482-DBL_MAX and maxVal \< DBL_MAX, the functions also check that each value is between minVal and
1483maxVal. In case of multi-channel arrays, each channel is processed independently. If some values
1484are out of range, position of the first outlier is stored in pos (when pos != NULL). Then, the
1485functions either return false (when quiet=true) or throw an exception.
1486@param a input array.
1487@param quiet a flag, indicating whether the functions quietly return false when the array elements
1488are out of range or they throw an exception.
1489@param pos optional output parameter, when not NULL, must be a pointer to array of src.dims
1490elements.
1491@param minVal inclusive lower boundary of valid values range.
1492@param maxVal exclusive upper boundary of valid values range.
1493*/
1494CV_EXPORTS_W bool checkRange(InputArray a, bool quiet = true, CV_OUT Point* pos = 0,
1495                            double minVal = -DBL_MAX, double maxVal = DBL_MAX);
1496
1497/** @brief converts NaN's to the given number
1498*/
1499CV_EXPORTS_W void patchNaNs(InputOutputArray a, double val = 0);
1500
1501/** @brief Performs generalized matrix multiplication.
1502
1503The function performs generalized matrix multiplication similar to the
1504gemm functions in BLAS level 3. For example,
1505`gemm(src1, src2, alpha, src3, beta, dst, GEMM_1_T + GEMM_3_T)`
1506corresponds to
1507\f[\texttt{dst} =  \texttt{alpha} \cdot \texttt{src1} ^T  \cdot \texttt{src2} +  \texttt{beta} \cdot \texttt{src3} ^T\f]
1508
1509In case of complex (two-channel) data, performed a complex matrix
1510multiplication.
1511
1512The function can be replaced with a matrix expression. For example, the
1513above call can be replaced with:
1514@code{.cpp}
1515    dst = alpha*src1.t()*src2 + beta*src3.t();
1516@endcode
1517@param src1 first multiplied input matrix that could be real(CV_32FC1,
1518CV_64FC1) or complex(CV_32FC2, CV_64FC2).
1519@param src2 second multiplied input matrix of the same type as src1.
1520@param alpha weight of the matrix product.
1521@param src3 third optional delta matrix added to the matrix product; it
1522should have the same type as src1 and src2.
1523@param beta weight of src3.
1524@param dst output matrix; it has the proper size and the same type as
1525input matrices.
1526@param flags operation flags (cv::GemmFlags)
1527@sa mulTransposed , transform
1528*/
1529CV_EXPORTS_W void gemm(InputArray src1, InputArray src2, double alpha,
1530                       InputArray src3, double beta, OutputArray dst, int flags = 0);
1531
1532/** @brief Calculates the product of a matrix and its transposition.
1533
1534The function mulTransposed calculates the product of src and its
1535transposition:
1536\f[\texttt{dst} = \texttt{scale} ( \texttt{src} - \texttt{delta} )^T ( \texttt{src} - \texttt{delta} )\f]
1537if aTa=true , and
1538\f[\texttt{dst} = \texttt{scale} ( \texttt{src} - \texttt{delta} ) ( \texttt{src} - \texttt{delta} )^T\f]
1539otherwise. The function is used to calculate the covariance matrix. With
1540zero delta, it can be used as a faster substitute for general matrix
1541product A\*B when B=A'
1542@param src input single-channel matrix. Note that unlike gemm, the
1543function can multiply not only floating-point matrices.
1544@param dst output square matrix.
1545@param aTa Flag specifying the multiplication ordering. See the
1546description below.
1547@param delta Optional delta matrix subtracted from src before the
1548multiplication. When the matrix is empty ( delta=noArray() ), it is
1549assumed to be zero, that is, nothing is subtracted. If it has the same
1550size as src , it is simply subtracted. Otherwise, it is "repeated" (see
1551repeat ) to cover the full src and then subtracted. Type of the delta
1552matrix, when it is not empty, must be the same as the type of created
1553output matrix. See the dtype parameter description below.
1554@param scale Optional scale factor for the matrix product.
1555@param dtype Optional type of the output matrix. When it is negative,
1556the output matrix will have the same type as src . Otherwise, it will be
1557type=CV_MAT_DEPTH(dtype) that should be either CV_32F or CV_64F .
1558@sa calcCovarMatrix, gemm, repeat, reduce
1559*/
1560CV_EXPORTS_W void mulTransposed( InputArray src, OutputArray dst, bool aTa,
1561                                 InputArray delta = noArray(),
1562                                 double scale = 1, int dtype = -1 );
1563
1564/** @brief Transposes a matrix.
1565
1566The function transpose transposes the matrix src :
1567\f[\texttt{dst} (i,j) =  \texttt{src} (j,i)\f]
1568@note No complex conjugation is done in case of a complex matrix. It it
1569should be done separately if needed.
1570@param src input array.
1571@param dst output array of the same type as src.
1572*/
1573CV_EXPORTS_W void transpose(InputArray src, OutputArray dst);
1574
1575/** @brief Performs the matrix transformation of every array element.
1576
1577The function transform performs the matrix transformation of every
1578element of the array src and stores the results in dst :
1579\f[\texttt{dst} (I) =  \texttt{m} \cdot \texttt{src} (I)\f]
1580(when m.cols=src.channels() ), or
1581\f[\texttt{dst} (I) =  \texttt{m} \cdot [ \texttt{src} (I); 1]\f]
1582(when m.cols=src.channels()+1 )
1583
1584Every element of the N -channel array src is interpreted as N -element
1585vector that is transformed using the M x N or M x (N+1) matrix m to
1586M-element vector - the corresponding element of the output array dst .
1587
1588The function may be used for geometrical transformation of
1589N -dimensional points, arbitrary linear color space transformation (such
1590as various kinds of RGB to YUV transforms), shuffling the image
1591channels, and so forth.
1592@param src input array that must have as many channels (1 to 4) as
1593m.cols or m.cols-1.
1594@param dst output array of the same size and depth as src; it has as
1595many channels as m.rows.
1596@param m transformation 2x2 or 2x3 floating-point matrix.
1597@sa perspectiveTransform, getAffineTransform, estimateRigidTransform, warpAffine, warpPerspective
1598*/
1599CV_EXPORTS_W void transform(InputArray src, OutputArray dst, InputArray m );
1600
1601/** @brief Performs the perspective matrix transformation of vectors.
1602
1603The function perspectiveTransform transforms every element of src by
1604treating it as a 2D or 3D vector, in the following way:
1605\f[(x, y, z)  \rightarrow (x'/w, y'/w, z'/w)\f]
1606where
1607\f[(x', y', z', w') =  \texttt{mat} \cdot \begin{bmatrix} x & y & z & 1  \end{bmatrix}\f]
1608and
1609\f[w =  \fork{w'}{if \(w' \ne 0\)}{\infty}{otherwise}\f]
1610
1611Here a 3D vector transformation is shown. In case of a 2D vector
1612transformation, the z component is omitted.
1613
1614@note The function transforms a sparse set of 2D or 3D vectors. If you
1615want to transform an image using perspective transformation, use
1616warpPerspective . If you have an inverse problem, that is, you want to
1617compute the most probable perspective transformation out of several
1618pairs of corresponding points, you can use getPerspectiveTransform or
1619findHomography .
1620@param src input two-channel or three-channel floating-point array; each
1621element is a 2D/3D vector to be transformed.
1622@param dst output array of the same size and type as src.
1623@param m 3x3 or 4x4 floating-point transformation matrix.
1624@sa  transform, warpPerspective, getPerspectiveTransform, findHomography
1625*/
1626CV_EXPORTS_W void perspectiveTransform(InputArray src, OutputArray dst, InputArray m );
1627
1628/** @brief Copies the lower or the upper half of a square matrix to another half.
1629
1630The function completeSymm copies the lower half of a square matrix to
1631its another half. The matrix diagonal remains unchanged:
1632*   \f$\texttt{mtx}_{ij}=\texttt{mtx}_{ji}\f$ for \f$i > j\f$ if
1633    lowerToUpper=false
1634*   \f$\texttt{mtx}_{ij}=\texttt{mtx}_{ji}\f$ for \f$i < j\f$ if
1635    lowerToUpper=true
1636@param mtx input-output floating-point square matrix.
1637@param lowerToUpper operation flag; if true, the lower half is copied to
1638the upper half. Otherwise, the upper half is copied to the lower half.
1639@sa flip, transpose
1640*/
1641CV_EXPORTS_W void completeSymm(InputOutputArray mtx, bool lowerToUpper = false);
1642
1643/** @brief Initializes a scaled identity matrix.
1644
1645The function setIdentity initializes a scaled identity matrix:
1646\f[\texttt{mtx} (i,j)= \fork{\texttt{value}}{ if \(i=j\)}{0}{otherwise}\f]
1647
1648The function can also be emulated using the matrix initializers and the
1649matrix expressions:
1650@code
1651    Mat A = Mat::eye(4, 3, CV_32F)*5;
1652    // A will be set to [[5, 0, 0], [0, 5, 0], [0, 0, 5], [0, 0, 0]]
1653@endcode
1654@param mtx matrix to initialize (not necessarily square).
1655@param s value to assign to diagonal elements.
1656@sa Mat::zeros, Mat::ones, Mat::setTo, Mat::operator=
1657*/
1658CV_EXPORTS_W void setIdentity(InputOutputArray mtx, const Scalar& s = Scalar(1));
1659
1660/** @brief Returns the determinant of a square floating-point matrix.
1661
1662The function determinant calculates and returns the determinant of the
1663specified matrix. For small matrices ( mtx.cols=mtx.rows\<=3 ), the
1664direct method is used. For larger matrices, the function uses LU
1665factorization with partial pivoting.
1666
1667For symmetric positively-determined matrices, it is also possible to use
1668eigen decomposition to calculate the determinant.
1669@param mtx input matrix that must have CV_32FC1 or CV_64FC1 type and
1670square size.
1671@sa trace, invert, solve, eigen, @ref MatrixExpressions
1672*/
1673CV_EXPORTS_W double determinant(InputArray mtx);
1674
1675/** @brief Returns the trace of a matrix.
1676
1677The function trace returns the sum of the diagonal elements of the
1678matrix mtx .
1679\f[\mathrm{tr} ( \texttt{mtx} ) =  \sum _i  \texttt{mtx} (i,i)\f]
1680@param mtx input matrix.
1681*/
1682CV_EXPORTS_W Scalar trace(InputArray mtx);
1683
1684/** @brief Finds the inverse or pseudo-inverse of a matrix.
1685
1686The function invert inverts the matrix src and stores the result in dst
1687. When the matrix src is singular or non-square, the function calculates
1688the pseudo-inverse matrix (the dst matrix) so that norm(src\*dst - I) is
1689minimal, where I is an identity matrix.
1690
1691In case of the DECOMP_LU method, the function returns non-zero value if
1692the inverse has been successfully calculated and 0 if src is singular.
1693
1694In case of the DECOMP_SVD method, the function returns the inverse
1695condition number of src (the ratio of the smallest singular value to the
1696largest singular value) and 0 if src is singular. The SVD method
1697calculates a pseudo-inverse matrix if src is singular.
1698
1699Similarly to DECOMP_LU, the method DECOMP_CHOLESKY works only with
1700non-singular square matrices that should also be symmetrical and
1701positively defined. In this case, the function stores the inverted
1702matrix in dst and returns non-zero. Otherwise, it returns 0.
1703
1704@param src input floating-point M x N matrix.
1705@param dst output matrix of N x M size and the same type as src.
1706@param flags inversion method (cv::DecompTypes)
1707@sa solve, SVD
1708*/
1709CV_EXPORTS_W double invert(InputArray src, OutputArray dst, int flags = DECOMP_LU);
1710
1711/** @brief Solves one or more linear systems or least-squares problems.
1712
1713The function solve solves a linear system or least-squares problem (the
1714latter is possible with SVD or QR methods, or by specifying the flag
1715DECOMP_NORMAL ):
1716\f[\texttt{dst} =  \arg \min _X \| \texttt{src1} \cdot \texttt{X} -  \texttt{src2} \|\f]
1717
1718If DECOMP_LU or DECOMP_CHOLESKY method is used, the function returns 1
1719if src1 (or \f$\texttt{src1}^T\texttt{src1}\f$ ) is non-singular. Otherwise,
1720it returns 0. In the latter case, dst is not valid. Other methods find a
1721pseudo-solution in case of a singular left-hand side part.
1722
1723@note If you want to find a unity-norm solution of an under-defined
1724singular system \f$\texttt{src1}\cdot\texttt{dst}=0\f$ , the function solve
1725will not do the work. Use SVD::solveZ instead.
1726
1727@param src1 input matrix on the left-hand side of the system.
1728@param src2 input matrix on the right-hand side of the system.
1729@param dst output solution.
1730@param flags solution (matrix inversion) method (cv::DecompTypes)
1731@sa invert, SVD, eigen
1732*/
1733CV_EXPORTS_W bool solve(InputArray src1, InputArray src2,
1734                        OutputArray dst, int flags = DECOMP_LU);
1735
1736/** @brief Sorts each row or each column of a matrix.
1737
1738The function sort sorts each matrix row or each matrix column in
1739ascending or descending order. So you should pass two operation flags to
1740get desired behaviour. If you want to sort matrix rows or columns
1741lexicographically, you can use STL std::sort generic function with the
1742proper comparison predicate.
1743
1744@param src input single-channel array.
1745@param dst output array of the same size and type as src.
1746@param flags operation flags, a combination of cv::SortFlags
1747@sa sortIdx, randShuffle
1748*/
1749CV_EXPORTS_W void sort(InputArray src, OutputArray dst, int flags);
1750
1751/** @brief Sorts each row or each column of a matrix.
1752
1753The function sortIdx sorts each matrix row or each matrix column in the
1754ascending or descending order. So you should pass two operation flags to
1755get desired behaviour. Instead of reordering the elements themselves, it
1756stores the indices of sorted elements in the output array. For example:
1757@code
1758    Mat A = Mat::eye(3,3,CV_32F), B;
1759    sortIdx(A, B, SORT_EVERY_ROW + SORT_ASCENDING);
1760    // B will probably contain
1761    // (because of equal elements in A some permutations are possible):
1762    // [[1, 2, 0], [0, 2, 1], [0, 1, 2]]
1763@endcode
1764@param src input single-channel array.
1765@param dst output integer array of the same size as src.
1766@param flags operation flags that could be a combination of cv::SortFlags
1767@sa sort, randShuffle
1768*/
1769CV_EXPORTS_W void sortIdx(InputArray src, OutputArray dst, int flags);
1770
1771/** @brief Finds the real roots of a cubic equation.
1772
1773The function solveCubic finds the real roots of a cubic equation:
1774-   if coeffs is a 4-element vector:
1775\f[\texttt{coeffs} [0] x^3 +  \texttt{coeffs} [1] x^2 +  \texttt{coeffs} [2] x +  \texttt{coeffs} [3] = 0\f]
1776-   if coeffs is a 3-element vector:
1777\f[x^3 +  \texttt{coeffs} [0] x^2 +  \texttt{coeffs} [1] x +  \texttt{coeffs} [2] = 0\f]
1778
1779The roots are stored in the roots array.
1780@param coeffs equation coefficients, an array of 3 or 4 elements.
1781@param roots output array of real roots that has 1 or 3 elements.
1782*/
1783CV_EXPORTS_W int solveCubic(InputArray coeffs, OutputArray roots);
1784
1785/** @brief Finds the real or complex roots of a polynomial equation.
1786
1787The function solvePoly finds real and complex roots of a polynomial equation:
1788\f[\texttt{coeffs} [n] x^{n} +  \texttt{coeffs} [n-1] x^{n-1} + ... +  \texttt{coeffs} [1] x +  \texttt{coeffs} [0] = 0\f]
1789@param coeffs array of polynomial coefficients.
1790@param roots output (complex) array of roots.
1791@param maxIters maximum number of iterations the algorithm does.
1792*/
1793CV_EXPORTS_W double solvePoly(InputArray coeffs, OutputArray roots, int maxIters = 300);
1794
1795/** @brief Calculates eigenvalues and eigenvectors of a symmetric matrix.
1796
1797The functions eigen calculate just eigenvalues, or eigenvalues and eigenvectors of the symmetric
1798matrix src:
1799@code
1800    src*eigenvectors.row(i).t() = eigenvalues.at<srcType>(i)*eigenvectors.row(i).t()
1801@endcode
1802@note in the new and the old interfaces different ordering of eigenvalues and eigenvectors
1803parameters is used.
1804@param src input matrix that must have CV_32FC1 or CV_64FC1 type, square size and be symmetrical
1805(src ^T^ == src).
1806@param eigenvalues output vector of eigenvalues of the same type as src; the eigenvalues are stored
1807in the descending order.
1808@param eigenvectors output matrix of eigenvectors; it has the same size and type as src; the
1809eigenvectors are stored as subsequent matrix rows, in the same order as the corresponding
1810eigenvalues.
1811@sa completeSymm , PCA
1812*/
1813CV_EXPORTS_W bool eigen(InputArray src, OutputArray eigenvalues,
1814                        OutputArray eigenvectors = noArray());
1815
1816/** @brief Calculates the covariance matrix of a set of vectors.
1817
1818The functions calcCovarMatrix calculate the covariance matrix and, optionally, the mean vector of
1819the set of input vectors.
1820@param samples samples stored as separate matrices
1821@param nsamples number of samples
1822@param covar output covariance matrix of the type ctype and square size.
1823@param mean input or output (depending on the flags) array as the average value of the input vectors.
1824@param flags operation flags as a combination of cv::CovarFlags
1825@param ctype type of the matrixl; it equals 'CV_64F' by default.
1826@sa PCA, mulTransposed, Mahalanobis
1827@todo InputArrayOfArrays
1828*/
1829CV_EXPORTS void calcCovarMatrix( const Mat* samples, int nsamples, Mat& covar, Mat& mean,
1830                                 int flags, int ctype = CV_64F);
1831
1832/** @overload
1833@note use cv::COVAR_ROWS or cv::COVAR_COLS flag
1834@param samples samples stored as rows/columns of a single matrix.
1835@param covar output covariance matrix of the type ctype and square size.
1836@param mean input or output (depending on the flags) array as the average value of the input vectors.
1837@param flags operation flags as a combination of cv::CovarFlags
1838@param ctype type of the matrixl; it equals 'CV_64F' by default.
1839*/
1840CV_EXPORTS_W void calcCovarMatrix( InputArray samples, OutputArray covar,
1841                                   InputOutputArray mean, int flags, int ctype = CV_64F);
1842
1843/** wrap PCA::operator() */
1844CV_EXPORTS_W void PCACompute(InputArray data, InputOutputArray mean,
1845                             OutputArray eigenvectors, int maxComponents = 0);
1846
1847/** wrap PCA::operator() */
1848CV_EXPORTS_W void PCACompute(InputArray data, InputOutputArray mean,
1849                             OutputArray eigenvectors, double retainedVariance);
1850
1851/** wrap PCA::project */
1852CV_EXPORTS_W void PCAProject(InputArray data, InputArray mean,
1853                             InputArray eigenvectors, OutputArray result);
1854
1855/** wrap PCA::backProject */
1856CV_EXPORTS_W void PCABackProject(InputArray data, InputArray mean,
1857                                 InputArray eigenvectors, OutputArray result);
1858
1859/** wrap SVD::compute */
1860CV_EXPORTS_W void SVDecomp( InputArray src, OutputArray w, OutputArray u, OutputArray vt, int flags = 0 );
1861
1862/** wrap SVD::backSubst */
1863CV_EXPORTS_W void SVBackSubst( InputArray w, InputArray u, InputArray vt,
1864                               InputArray rhs, OutputArray dst );
1865
1866/** @brief Calculates the Mahalanobis distance between two vectors.
1867
1868The function Mahalanobis calculates and returns the weighted distance between two vectors:
1869\f[d( \texttt{vec1} , \texttt{vec2} )= \sqrt{\sum_{i,j}{\texttt{icovar(i,j)}\cdot(\texttt{vec1}(I)-\texttt{vec2}(I))\cdot(\texttt{vec1(j)}-\texttt{vec2(j)})} }\f]
1870The covariance matrix may be calculated using the cv::calcCovarMatrix function and then inverted using
1871the invert function (preferably using the cv::DECOMP_SVD method, as the most accurate).
1872@param v1 first 1D input vector.
1873@param v2 second 1D input vector.
1874@param icovar inverse covariance matrix.
1875*/
1876CV_EXPORTS_W double Mahalanobis(InputArray v1, InputArray v2, InputArray icovar);
1877
1878/** @brief Performs a forward or inverse Discrete Fourier transform of a 1D or 2D floating-point array.
1879
1880The function performs one of the following:
1881-   Forward the Fourier transform of a 1D vector of N elements:
1882    \f[Y = F^{(N)}  \cdot X,\f]
1883    where \f$F^{(N)}_{jk}=\exp(-2\pi i j k/N)\f$ and \f$i=\sqrt{-1}\f$
1884-   Inverse the Fourier transform of a 1D vector of N elements:
1885    \f[\begin{array}{l} X'=  \left (F^{(N)} \right )^{-1}  \cdot Y =  \left (F^{(N)} \right )^*  \cdot y  \\ X = (1/N)  \cdot X, \end{array}\f]
1886    where \f$F^*=\left(\textrm{Re}(F^{(N)})-\textrm{Im}(F^{(N)})\right)^T\f$
1887-   Forward the 2D Fourier transform of a M x N matrix:
1888    \f[Y = F^{(M)}  \cdot X  \cdot F^{(N)}\f]
1889-   Inverse the 2D Fourier transform of a M x N matrix:
1890    \f[\begin{array}{l} X'=  \left (F^{(M)} \right )^*  \cdot Y  \cdot \left (F^{(N)} \right )^* \\ X =  \frac{1}{M \cdot N} \cdot X' \end{array}\f]
1891
1892In case of real (single-channel) data, the output spectrum of the forward Fourier transform or input
1893spectrum of the inverse Fourier transform can be represented in a packed format called *CCS*
1894(complex-conjugate-symmetrical). It was borrowed from IPL (Intel\* Image Processing Library). Here
1895is how 2D *CCS* spectrum looks:
1896\f[\begin{bmatrix} Re Y_{0,0} & Re Y_{0,1} & Im Y_{0,1} & Re Y_{0,2} & Im Y_{0,2} &  \cdots & Re Y_{0,N/2-1} & Im Y_{0,N/2-1} & Re Y_{0,N/2}  \\ Re Y_{1,0} & Re Y_{1,1} & Im Y_{1,1} & Re Y_{1,2} & Im Y_{1,2} &  \cdots & Re Y_{1,N/2-1} & Im Y_{1,N/2-1} & Re Y_{1,N/2}  \\ Im Y_{1,0} & Re Y_{2,1} & Im Y_{2,1} & Re Y_{2,2} & Im Y_{2,2} &  \cdots & Re Y_{2,N/2-1} & Im Y_{2,N/2-1} & Im Y_{1,N/2}  \\ \hdotsfor{9} \\ Re Y_{M/2-1,0} &  Re Y_{M-3,1}  & Im Y_{M-3,1} &  \hdotsfor{3} & Re Y_{M-3,N/2-1} & Im Y_{M-3,N/2-1}& Re Y_{M/2-1,N/2}  \\ Im Y_{M/2-1,0} &  Re Y_{M-2,1}  & Im Y_{M-2,1} &  \hdotsfor{3} & Re Y_{M-2,N/2-1} & Im Y_{M-2,N/2-1}& Im Y_{M/2-1,N/2}  \\ Re Y_{M/2,0}  &  Re Y_{M-1,1} &  Im Y_{M-1,1} &  \hdotsfor{3} & Re Y_{M-1,N/2-1} & Im Y_{M-1,N/2-1}& Re Y_{M/2,N/2} \end{bmatrix}\f]
1897
1898In case of 1D transform of a real vector, the output looks like the first row of the matrix above.
1899
1900So, the function chooses an operation mode depending on the flags and size of the input array:
1901-   If DFT_ROWS is set or the input array has a single row or single column, the function
1902    performs a 1D forward or inverse transform of each row of a matrix when DFT_ROWS is set.
1903    Otherwise, it performs a 2D transform.
1904-   If the input array is real and DFT_INVERSE is not set, the function performs a forward 1D or
1905    2D transform:
1906    -   When DFT_COMPLEX_OUTPUT is set, the output is a complex matrix of the same size as
1907        input.
1908    -   When DFT_COMPLEX_OUTPUT is not set, the output is a real matrix of the same size as
1909        input. In case of 2D transform, it uses the packed format as shown above. In case of a
1910        single 1D transform, it looks like the first row of the matrix above. In case of
1911        multiple 1D transforms (when using the DFT_ROWS flag), each row of the output matrix
1912        looks like the first row of the matrix above.
1913-   If the input array is complex and either DFT_INVERSE or DFT_REAL_OUTPUT are not set, the
1914    output is a complex array of the same size as input. The function performs a forward or
1915    inverse 1D or 2D transform of the whole input array or each row of the input array
1916    independently, depending on the flags DFT_INVERSE and DFT_ROWS.
1917-   When DFT_INVERSE is set and the input array is real, or it is complex but DFT_REAL_OUTPUT
1918    is set, the output is a real array of the same size as input. The function performs a 1D or 2D
1919    inverse transformation of the whole input array or each individual row, depending on the flags
1920    DFT_INVERSE and DFT_ROWS.
1921
1922If DFT_SCALE is set, the scaling is done after the transformation.
1923
1924Unlike dct , the function supports arrays of arbitrary size. But only those arrays are processed
1925efficiently, whose sizes can be factorized in a product of small prime numbers (2, 3, and 5 in the
1926current implementation). Such an efficient DFT size can be calculated using the getOptimalDFTSize
1927method.
1928
1929The sample below illustrates how to calculate a DFT-based convolution of two 2D real arrays:
1930@code
1931    void convolveDFT(InputArray A, InputArray B, OutputArray C)
1932    {
1933        // reallocate the output array if needed
1934        C.create(abs(A.rows - B.rows)+1, abs(A.cols - B.cols)+1, A.type());
1935        Size dftSize;
1936        // calculate the size of DFT transform
1937        dftSize.width = getOptimalDFTSize(A.cols + B.cols - 1);
1938        dftSize.height = getOptimalDFTSize(A.rows + B.rows - 1);
1939
1940        // allocate temporary buffers and initialize them with 0's
1941        Mat tempA(dftSize, A.type(), Scalar::all(0));
1942        Mat tempB(dftSize, B.type(), Scalar::all(0));
1943
1944        // copy A and B to the top-left corners of tempA and tempB, respectively
1945        Mat roiA(tempA, Rect(0,0,A.cols,A.rows));
1946        A.copyTo(roiA);
1947        Mat roiB(tempB, Rect(0,0,B.cols,B.rows));
1948        B.copyTo(roiB);
1949
1950        // now transform the padded A & B in-place;
1951        // use "nonzeroRows" hint for faster processing
1952        dft(tempA, tempA, 0, A.rows);
1953        dft(tempB, tempB, 0, B.rows);
1954
1955        // multiply the spectrums;
1956        // the function handles packed spectrum representations well
1957        mulSpectrums(tempA, tempB, tempA);
1958
1959        // transform the product back from the frequency domain.
1960        // Even though all the result rows will be non-zero,
1961        // you need only the first C.rows of them, and thus you
1962        // pass nonzeroRows == C.rows
1963        dft(tempA, tempA, DFT_INVERSE + DFT_SCALE, C.rows);
1964
1965        // now copy the result back to C.
1966        tempA(Rect(0, 0, C.cols, C.rows)).copyTo(C);
1967
1968        // all the temporary buffers will be deallocated automatically
1969    }
1970@endcode
1971To optimize this sample, consider the following approaches:
1972-   Since nonzeroRows != 0 is passed to the forward transform calls and since A and B are copied to
1973    the top-left corners of tempA and tempB, respectively, it is not necessary to clear the whole
1974    tempA and tempB. It is only necessary to clear the tempA.cols - A.cols ( tempB.cols - B.cols)
1975    rightmost columns of the matrices.
1976-   This DFT-based convolution does not have to be applied to the whole big arrays, especially if B
1977    is significantly smaller than A or vice versa. Instead, you can calculate convolution by parts.
1978    To do this, you need to split the output array C into multiple tiles. For each tile, estimate
1979    which parts of A and B are required to calculate convolution in this tile. If the tiles in C are
1980    too small, the speed will decrease a lot because of repeated work. In the ultimate case, when
1981    each tile in C is a single pixel, the algorithm becomes equivalent to the naive convolution
1982    algorithm. If the tiles are too big, the temporary arrays tempA and tempB become too big and
1983    there is also a slowdown because of bad cache locality. So, there is an optimal tile size
1984    somewhere in the middle.
1985-   If different tiles in C can be calculated in parallel and, thus, the convolution is done by
1986    parts, the loop can be threaded.
1987
1988All of the above improvements have been implemented in matchTemplate and filter2D . Therefore, by
1989using them, you can get the performance even better than with the above theoretically optimal
1990implementation. Though, those two functions actually calculate cross-correlation, not convolution,
1991so you need to "flip" the second convolution operand B vertically and horizontally using flip .
1992@note
1993-   An example using the discrete fourier transform can be found at
1994    opencv_source_code/samples/cpp/dft.cpp
1995-   (Python) An example using the dft functionality to perform Wiener deconvolution can be found
1996    at opencv_source/samples/python2/deconvolution.py
1997-   (Python) An example rearranging the quadrants of a Fourier image can be found at
1998    opencv_source/samples/python2/dft.py
1999@param src input array that could be real or complex.
2000@param dst output array whose size and type depends on the flags .
2001@param flags transformation flags, representing a combination of the cv::DftFlags
2002@param nonzeroRows when the parameter is not zero, the function assumes that only the first
2003nonzeroRows rows of the input array (DFT_INVERSE is not set) or only the first nonzeroRows of the
2004output array (DFT_INVERSE is set) contain non-zeros, thus, the function can handle the rest of the
2005rows more efficiently and save some time; this technique is very useful for calculating array
2006cross-correlation or convolution using DFT.
2007@sa dct , getOptimalDFTSize , mulSpectrums, filter2D , matchTemplate , flip , cartToPolar ,
2008magnitude , phase
2009*/
2010CV_EXPORTS_W void dft(InputArray src, OutputArray dst, int flags = 0, int nonzeroRows = 0);
2011
2012/** @brief Calculates the inverse Discrete Fourier Transform of a 1D or 2D array.
2013
2014idft(src, dst, flags) is equivalent to dft(src, dst, flags | DFT_INVERSE) .
2015@note None of dft and idft scales the result by default. So, you should pass DFT_SCALE to one of
2016dft or idft explicitly to make these transforms mutually inverse.
2017@sa dft, dct, idct, mulSpectrums, getOptimalDFTSize
2018@param src input floating-point real or complex array.
2019@param dst output array whose size and type depend on the flags.
2020@param flags operation flags (see dft and cv::DftFlags).
2021@param nonzeroRows number of dst rows to process; the rest of the rows have undefined content (see
2022the convolution sample in dft description.
2023*/
2024CV_EXPORTS_W void idft(InputArray src, OutputArray dst, int flags = 0, int nonzeroRows = 0);
2025
2026/** @brief Performs a forward or inverse discrete Cosine transform of 1D or 2D array.
2027
2028The function dct performs a forward or inverse discrete Cosine transform (DCT) of a 1D or 2D
2029floating-point array:
2030-   Forward Cosine transform of a 1D vector of N elements:
2031    \f[Y = C^{(N)}  \cdot X\f]
2032    where
2033    \f[C^{(N)}_{jk}= \sqrt{\alpha_j/N} \cos \left ( \frac{\pi(2k+1)j}{2N} \right )\f]
2034    and
2035    \f$\alpha_0=1\f$, \f$\alpha_j=2\f$ for *j \> 0*.
2036-   Inverse Cosine transform of a 1D vector of N elements:
2037    \f[X =  \left (C^{(N)} \right )^{-1}  \cdot Y =  \left (C^{(N)} \right )^T  \cdot Y\f]
2038    (since \f$C^{(N)}\f$ is an orthogonal matrix, \f$C^{(N)} \cdot \left(C^{(N)}\right)^T = I\f$ )
2039-   Forward 2D Cosine transform of M x N matrix:
2040    \f[Y = C^{(N)}  \cdot X  \cdot \left (C^{(N)} \right )^T\f]
2041-   Inverse 2D Cosine transform of M x N matrix:
2042    \f[X =  \left (C^{(N)} \right )^T  \cdot X  \cdot C^{(N)}\f]
2043
2044The function chooses the mode of operation by looking at the flags and size of the input array:
2045-   If (flags & DCT_INVERSE) == 0 , the function does a forward 1D or 2D transform. Otherwise, it
2046    is an inverse 1D or 2D transform.
2047-   If (flags & DCT_ROWS) != 0 , the function performs a 1D transform of each row.
2048-   If the array is a single column or a single row, the function performs a 1D transform.
2049-   If none of the above is true, the function performs a 2D transform.
2050
2051@note Currently dct supports even-size arrays (2, 4, 6 ...). For data analysis and approximation, you
2052can pad the array when necessary.
2053Also, the function performance depends very much, and not monotonically, on the array size (see
2054getOptimalDFTSize ). In the current implementation DCT of a vector of size N is calculated via DFT
2055of a vector of size N/2 . Thus, the optimal DCT size N1 \>= N can be calculated as:
2056@code
2057    size_t getOptimalDCTSize(size_t N) { return 2*getOptimalDFTSize((N+1)/2); }
2058    N1 = getOptimalDCTSize(N);
2059@endcode
2060@param src input floating-point array.
2061@param dst output array of the same size and type as src .
2062@param flags transformation flags as a combination of cv::DftFlags (DCT_*)
2063@sa dft , getOptimalDFTSize , idct
2064*/
2065CV_EXPORTS_W void dct(InputArray src, OutputArray dst, int flags = 0);
2066
2067/** @brief Calculates the inverse Discrete Cosine Transform of a 1D or 2D array.
2068
2069idct(src, dst, flags) is equivalent to dct(src, dst, flags | DCT_INVERSE).
2070@param src input floating-point single-channel array.
2071@param dst output array of the same size and type as src.
2072@param flags operation flags.
2073@sa  dct, dft, idft, getOptimalDFTSize
2074*/
2075CV_EXPORTS_W void idct(InputArray src, OutputArray dst, int flags = 0);
2076
2077/** @brief Performs the per-element multiplication of two Fourier spectrums.
2078
2079The function mulSpectrums performs the per-element multiplication of the two CCS-packed or complex
2080matrices that are results of a real or complex Fourier transform.
2081
2082The function, together with dft and idft , may be used to calculate convolution (pass conjB=false )
2083or correlation (pass conjB=true ) of two arrays rapidly. When the arrays are complex, they are
2084simply multiplied (per element) with an optional conjugation of the second-array elements. When the
2085arrays are real, they are assumed to be CCS-packed (see dft for details).
2086@param a first input array.
2087@param b second input array of the same size and type as src1 .
2088@param c output array of the same size and type as src1 .
2089@param flags operation flags; currently, the only supported flag is cv::DFT_ROWS, which indicates that
2090each row of src1 and src2 is an independent 1D Fourier spectrum. If you do not want to use this flag, then simply add a `0` as value.
2091@param conjB optional flag that conjugates the second input array before the multiplication (true)
2092or not (false).
2093*/
2094CV_EXPORTS_W void mulSpectrums(InputArray a, InputArray b, OutputArray c,
2095                               int flags, bool conjB = false);
2096
2097/** @brief Returns the optimal DFT size for a given vector size.
2098
2099DFT performance is not a monotonic function of a vector size. Therefore, when you calculate
2100convolution of two arrays or perform the spectral analysis of an array, it usually makes sense to
2101pad the input data with zeros to get a bit larger array that can be transformed much faster than the
2102original one. Arrays whose size is a power-of-two (2, 4, 8, 16, 32, ...) are the fastest to process.
2103Though, the arrays whose size is a product of 2's, 3's, and 5's (for example, 300 = 5\*5\*3\*2\*2)
2104are also processed quite efficiently.
2105
2106The function getOptimalDFTSize returns the minimum number N that is greater than or equal to vecsize
2107so that the DFT of a vector of size N can be processed efficiently. In the current implementation N
2108= 2 ^p^ \* 3 ^q^ \* 5 ^r^ for some integer p, q, r.
2109
2110The function returns a negative number if vecsize is too large (very close to INT_MAX ).
2111
2112While the function cannot be used directly to estimate the optimal vector size for DCT transform
2113(since the current DCT implementation supports only even-size vectors), it can be easily processed
2114as getOptimalDFTSize((vecsize+1)/2)\*2.
2115@param vecsize vector size.
2116@sa dft , dct , idft , idct , mulSpectrums
2117*/
2118CV_EXPORTS_W int getOptimalDFTSize(int vecsize);
2119
2120/** @brief Returns the default random number generator.
2121
2122The function theRNG returns the default random number generator. For each thread, there is a
2123separate random number generator, so you can use the function safely in multi-thread environments.
2124If you just need to get a single random number using this generator or initialize an array, you can
2125use randu or randn instead. But if you are going to generate many random numbers inside a loop, it
2126is much faster to use this function to retrieve the generator and then use RNG::operator _Tp() .
2127@sa RNG, randu, randn
2128*/
2129CV_EXPORTS RNG& theRNG();
2130
2131/** @brief Generates a single uniformly-distributed random number or an array of random numbers.
2132
2133Non-template variant of the function fills the matrix dst with uniformly-distributed
2134random numbers from the specified range:
2135\f[\texttt{low} _c  \leq \texttt{dst} (I)_c <  \texttt{high} _c\f]
2136@param dst output array of random numbers; the array must be pre-allocated.
2137@param low inclusive lower boundary of the generated random numbers.
2138@param high exclusive upper boundary of the generated random numbers.
2139@sa RNG, randn, theRNG
2140*/
2141CV_EXPORTS_W void randu(InputOutputArray dst, InputArray low, InputArray high);
2142
2143/** @brief Fills the array with normally distributed random numbers.
2144
2145The function randn fills the matrix dst with normally distributed random numbers with the specified
2146mean vector and the standard deviation matrix. The generated random numbers are clipped to fit the
2147value range of the output array data type.
2148@param dst output array of random numbers; the array must be pre-allocated and have 1 to 4 channels.
2149@param mean mean value (expectation) of the generated random numbers.
2150@param stddev standard deviation of the generated random numbers; it can be either a vector (in
2151which case a diagonal standard deviation matrix is assumed) or a square matrix.
2152@sa RNG, randu
2153*/
2154CV_EXPORTS_W void randn(InputOutputArray dst, InputArray mean, InputArray stddev);
2155
2156/** @brief Shuffles the array elements randomly.
2157
2158The function randShuffle shuffles the specified 1D array by randomly choosing pairs of elements and
2159swapping them. The number of such swap operations will be dst.rows\*dst.cols\*iterFactor .
2160@param dst input/output numerical 1D array.
2161@param iterFactor scale factor that determines the number of random swap operations (see the details
2162below).
2163@param rng optional random number generator used for shuffling; if it is zero, theRNG () is used
2164instead.
2165@sa RNG, sort
2166*/
2167CV_EXPORTS_W void randShuffle(InputOutputArray dst, double iterFactor = 1., RNG* rng = 0);
2168
2169/** @brief Principal Component Analysis
2170
2171The class is used to calculate a special basis for a set of vectors. The
2172basis will consist of eigenvectors of the covariance matrix calculated
2173from the input set of vectors. The class %PCA can also transform
2174vectors to/from the new coordinate space defined by the basis. Usually,
2175in this new coordinate system, each vector from the original set (and
2176any linear combination of such vectors) can be quite accurately
2177approximated by taking its first few components, corresponding to the
2178eigenvectors of the largest eigenvalues of the covariance matrix.
2179Geometrically it means that you calculate a projection of the vector to
2180a subspace formed by a few eigenvectors corresponding to the dominant
2181eigenvalues of the covariance matrix. And usually such a projection is
2182very close to the original vector. So, you can represent the original
2183vector from a high-dimensional space with a much shorter vector
2184consisting of the projected vector's coordinates in the subspace. Such a
2185transformation is also known as Karhunen-Loeve Transform, or KLT.
2186See http://en.wikipedia.org/wiki/Principal_component_analysis
2187
2188The sample below is the function that takes two matrices. The first
2189function stores a set of vectors (a row per vector) that is used to
2190calculate PCA. The second function stores another "test" set of vectors
2191(a row per vector). First, these vectors are compressed with PCA, then
2192reconstructed back, and then the reconstruction error norm is computed
2193and printed for each vector. :
2194
2195@code{.cpp}
2196using namespace cv;
2197
2198PCA compressPCA(const Mat& pcaset, int maxComponents,
2199                const Mat& testset, Mat& compressed)
2200{
2201    PCA pca(pcaset, // pass the data
2202            Mat(), // we do not have a pre-computed mean vector,
2203                   // so let the PCA engine to compute it
2204            PCA::DATA_AS_ROW, // indicate that the vectors
2205                                // are stored as matrix rows
2206                                // (use PCA::DATA_AS_COL if the vectors are
2207                                // the matrix columns)
2208            maxComponents // specify, how many principal components to retain
2209            );
2210    // if there is no test data, just return the computed basis, ready-to-use
2211    if( !testset.data )
2212        return pca;
2213    CV_Assert( testset.cols == pcaset.cols );
2214
2215    compressed.create(testset.rows, maxComponents, testset.type());
2216
2217    Mat reconstructed;
2218    for( int i = 0; i < testset.rows; i++ )
2219    {
2220        Mat vec = testset.row(i), coeffs = compressed.row(i), reconstructed;
2221        // compress the vector, the result will be stored
2222        // in the i-th row of the output matrix
2223        pca.project(vec, coeffs);
2224        // and then reconstruct it
2225        pca.backProject(coeffs, reconstructed);
2226        // and measure the error
2227        printf("%d. diff = %g\n", i, norm(vec, reconstructed, NORM_L2));
2228    }
2229    return pca;
2230}
2231@endcode
2232@sa calcCovarMatrix, mulTransposed, SVD, dft, dct
2233*/
2234class CV_EXPORTS PCA
2235{
2236public:
2237    enum Flags { DATA_AS_ROW = 0, //!< indicates that the input samples are stored as matrix rows
2238                 DATA_AS_COL = 1, //!< indicates that the input samples are stored as matrix columns
2239                 USE_AVG     = 2  //!
2240               };
2241
2242    /** @brief default constructor
2243
2244    The default constructor initializes an empty %PCA structure. The other
2245    constructors initialize the structure and call PCA::operator()().
2246    */
2247    PCA();
2248
2249    /** @overload
2250    @param data input samples stored as matrix rows or matrix columns.
2251    @param mean optional mean value; if the matrix is empty (@c noArray()),
2252    the mean is computed from the data.
2253    @param flags operation flags; currently the parameter is only used to
2254    specify the data layout (PCA::Flags)
2255    @param maxComponents maximum number of components that %PCA should
2256    retain; by default, all the components are retained.
2257    */
2258    PCA(InputArray data, InputArray mean, int flags, int maxComponents = 0);
2259
2260    /** @overload
2261    @param data input samples stored as matrix rows or matrix columns.
2262    @param mean optional mean value; if the matrix is empty (noArray()),
2263    the mean is computed from the data.
2264    @param flags operation flags; currently the parameter is only used to
2265    specify the data layout (PCA::Flags)
2266    @param retainedVariance Percentage of variance that PCA should retain.
2267    Using this parameter will let the PCA decided how many components to
2268    retain but it will always keep at least 2.
2269    */
2270    PCA(InputArray data, InputArray mean, int flags, double retainedVariance);
2271
2272    /** @brief performs %PCA
2273
2274    The operator performs %PCA of the supplied dataset. It is safe to reuse
2275    the same PCA structure for multiple datasets. That is, if the structure
2276    has been previously used with another dataset, the existing internal
2277    data is reclaimed and the new eigenvalues, @ref eigenvectors , and @ref
2278    mean are allocated and computed.
2279
2280    The computed eigenvalues are sorted from the largest to the smallest and
2281    the corresponding eigenvectors are stored as eigenvectors rows.
2282
2283    @param data input samples stored as the matrix rows or as the matrix
2284    columns.
2285    @param mean optional mean value; if the matrix is empty (noArray()),
2286    the mean is computed from the data.
2287    @param flags operation flags; currently the parameter is only used to
2288    specify the data layout. (Flags)
2289    @param maxComponents maximum number of components that PCA should
2290    retain; by default, all the components are retained.
2291    */
2292    PCA& operator()(InputArray data, InputArray mean, int flags, int maxComponents = 0);
2293
2294    /** @overload
2295    @param data input samples stored as the matrix rows or as the matrix
2296    columns.
2297    @param mean optional mean value; if the matrix is empty (noArray()),
2298    the mean is computed from the data.
2299    @param flags operation flags; currently the parameter is only used to
2300    specify the data layout. (PCA::Flags)
2301    @param retainedVariance Percentage of variance that %PCA should retain.
2302    Using this parameter will let the %PCA decided how many components to
2303    retain but it will always keep at least 2.
2304     */
2305    PCA& operator()(InputArray data, InputArray mean, int flags, double retainedVariance);
2306
2307    /** @brief Projects vector(s) to the principal component subspace.
2308
2309    The methods project one or more vectors to the principal component
2310    subspace, where each vector projection is represented by coefficients in
2311    the principal component basis. The first form of the method returns the
2312    matrix that the second form writes to the result. So the first form can
2313    be used as a part of expression while the second form can be more
2314    efficient in a processing loop.
2315    @param vec input vector(s); must have the same dimensionality and the
2316    same layout as the input data used at %PCA phase, that is, if
2317    DATA_AS_ROW are specified, then `vec.cols==data.cols`
2318    (vector dimensionality) and `vec.rows` is the number of vectors to
2319    project, and the same is true for the PCA::DATA_AS_COL case.
2320    */
2321    Mat project(InputArray vec) const;
2322
2323    /** @overload
2324    @param vec input vector(s); must have the same dimensionality and the
2325    same layout as the input data used at PCA phase, that is, if
2326    DATA_AS_ROW are specified, then `vec.cols==data.cols`
2327    (vector dimensionality) and `vec.rows` is the number of vectors to
2328    project, and the same is true for the PCA::DATA_AS_COL case.
2329    @param result output vectors; in case of PCA::DATA_AS_COL, the
2330    output matrix has as many columns as the number of input vectors, this
2331    means that `result.cols==vec.cols` and the number of rows match the
2332    number of principal components (for example, `maxComponents` parameter
2333    passed to the constructor).
2334     */
2335    void project(InputArray vec, OutputArray result) const;
2336
2337    /** @brief Reconstructs vectors from their PC projections.
2338
2339    The methods are inverse operations to PCA::project. They take PC
2340    coordinates of projected vectors and reconstruct the original vectors.
2341    Unless all the principal components have been retained, the
2342    reconstructed vectors are different from the originals. But typically,
2343    the difference is small if the number of components is large enough (but
2344    still much smaller than the original vector dimensionality). As a
2345    result, PCA is used.
2346    @param vec coordinates of the vectors in the principal component
2347    subspace, the layout and size are the same as of PCA::project output
2348    vectors.
2349     */
2350    Mat backProject(InputArray vec) const;
2351
2352    /** @overload
2353    @param vec coordinates of the vectors in the principal component
2354    subspace, the layout and size are the same as of PCA::project output
2355    vectors.
2356    @param result reconstructed vectors; the layout and size are the same as
2357    of PCA::project input vectors.
2358     */
2359    void backProject(InputArray vec, OutputArray result) const;
2360
2361    /** @brief write and load PCA matrix
2362
2363*/
2364    void write(FileStorage& fs ) const;
2365    void read(const FileNode& fs);
2366
2367    Mat eigenvectors; //!< eigenvectors of the covariation matrix
2368    Mat eigenvalues; //!< eigenvalues of the covariation matrix
2369    Mat mean; //!< mean value subtracted before the projection and added after the back projection
2370};
2371
2372/** @example pca.cpp
2373  An example using %PCA for dimensionality reduction while maintaining an amount of variance
2374 */
2375
2376/**
2377   @brief Linear Discriminant Analysis
2378   @todo document this class
2379 */
2380class CV_EXPORTS LDA
2381{
2382public:
2383    /** @brief constructor
2384    Initializes a LDA with num_components (default 0) and specifies how
2385    samples are aligned (default dataAsRow=true).
2386    */
2387    explicit LDA(int num_components = 0);
2388
2389    /** Initializes and performs a Discriminant Analysis with Fisher's
2390     Optimization Criterion on given data in src and corresponding labels
2391     in labels. If 0 (or less) number of components are given, they are
2392     automatically determined for given data in computation.
2393    */
2394    LDA(InputArrayOfArrays src, InputArray labels, int num_components = 0);
2395
2396    /** Serializes this object to a given filename.
2397      */
2398    void save(const String& filename) const;
2399
2400    /** Deserializes this object from a given filename.
2401      */
2402    void load(const String& filename);
2403
2404    /** Serializes this object to a given cv::FileStorage.
2405      */
2406    void save(FileStorage& fs) const;
2407
2408    /** Deserializes this object from a given cv::FileStorage.
2409      */
2410    void load(const FileStorage& node);
2411
2412    /** destructor
2413      */
2414    ~LDA();
2415
2416    /** Compute the discriminants for data in src and labels.
2417      */
2418    void compute(InputArrayOfArrays src, InputArray labels);
2419
2420    /** Projects samples into the LDA subspace.
2421      */
2422    Mat project(InputArray src);
2423
2424    /** Reconstructs projections from the LDA subspace.
2425      */
2426    Mat reconstruct(InputArray src);
2427
2428    /** Returns the eigenvectors of this LDA.
2429      */
2430    Mat eigenvectors() const { return _eigenvectors; }
2431
2432    /** Returns the eigenvalues of this LDA.
2433      */
2434    Mat eigenvalues() const { return _eigenvalues; }
2435
2436    static Mat subspaceProject(InputArray W, InputArray mean, InputArray src);
2437    static Mat subspaceReconstruct(InputArray W, InputArray mean, InputArray src);
2438
2439protected:
2440    bool _dataAsRow;
2441    int _num_components;
2442    Mat _eigenvectors;
2443    Mat _eigenvalues;
2444
2445    void lda(InputArrayOfArrays src, InputArray labels);
2446};
2447
2448/** @brief Singular Value Decomposition
2449
2450Class for computing Singular Value Decomposition of a floating-point
2451matrix. The Singular Value Decomposition is used to solve least-square
2452problems, under-determined linear systems, invert matrices, compute
2453condition numbers, and so on.
2454
2455If you want to compute a condition number of a matrix or an absolute value of
2456its determinant, you do not need `u` and `vt`. You can pass
2457flags=SVD::NO_UV|... . Another flag SVD::FULL_UV indicates that full-size u
2458and vt must be computed, which is not necessary most of the time.
2459
2460@sa invert, solve, eigen, determinant
2461*/
2462class CV_EXPORTS SVD
2463{
2464public:
2465    enum Flags {
2466        /** allow the algorithm to modify the decomposed matrix; it can save space and speed up
2467            processing. currently ignored. */
2468        MODIFY_A = 1,
2469        /** indicates that only a vector of singular values `w` is to be processed, while u and vt
2470            will be set to empty matrices */
2471        NO_UV    = 2,
2472        /** when the matrix is not square, by default the algorithm produces u and vt matrices of
2473            sufficiently large size for the further A reconstruction; if, however, FULL_UV flag is
2474            specified, u and vt will be full-size square orthogonal matrices.*/
2475        FULL_UV  = 4
2476    };
2477
2478    /** @brief the default constructor
2479
2480    initializes an empty SVD structure
2481      */
2482    SVD();
2483
2484    /** @overload
2485    initializes an empty SVD structure and then calls SVD::operator()
2486    @param src decomposed matrix.
2487    @param flags operation flags (SVD::Flags)
2488      */
2489    SVD( InputArray src, int flags = 0 );
2490
2491    /** @brief the operator that performs SVD. The previously allocated u, w and vt are released.
2492
2493    The operator performs the singular value decomposition of the supplied
2494    matrix. The u,`vt` , and the vector of singular values w are stored in
2495    the structure. The same SVD structure can be reused many times with
2496    different matrices. Each time, if needed, the previous u,`vt` , and w
2497    are reclaimed and the new matrices are created, which is all handled by
2498    Mat::create.
2499    @param src decomposed matrix.
2500    @param flags operation flags (SVD::Flags)
2501      */
2502    SVD& operator ()( InputArray src, int flags = 0 );
2503
2504    /** @brief decomposes matrix and stores the results to user-provided matrices
2505
2506    The methods/functions perform SVD of matrix. Unlike SVD::SVD constructor
2507    and SVD::operator(), they store the results to the user-provided
2508    matrices:
2509
2510    @code{.cpp}
2511    Mat A, w, u, vt;
2512    SVD::compute(A, w, u, vt);
2513    @endcode
2514
2515    @param src decomposed matrix
2516    @param w calculated singular values
2517    @param u calculated left singular vectors
2518    @param vt transposed matrix of right singular values
2519    @param flags operation flags - see SVD::SVD.
2520      */
2521    static void compute( InputArray src, OutputArray w,
2522                         OutputArray u, OutputArray vt, int flags = 0 );
2523
2524    /** @overload
2525    computes singular values of a matrix
2526    @param src decomposed matrix
2527    @param w calculated singular values
2528    @param flags operation flags - see SVD::Flags.
2529      */
2530    static void compute( InputArray src, OutputArray w, int flags = 0 );
2531
2532    /** @brief performs back substitution
2533      */
2534    static void backSubst( InputArray w, InputArray u,
2535                           InputArray vt, InputArray rhs,
2536                           OutputArray dst );
2537
2538    /** @brief solves an under-determined singular linear system
2539
2540    The method finds a unit-length solution x of a singular linear system
2541    A\*x = 0. Depending on the rank of A, there can be no solutions, a
2542    single solution or an infinite number of solutions. In general, the
2543    algorithm solves the following problem:
2544    \f[dst =  \arg \min _{x:  \| x \| =1}  \| src  \cdot x  \|\f]
2545    @param src left-hand-side matrix.
2546    @param dst found solution.
2547      */
2548    static void solveZ( InputArray src, OutputArray dst );
2549
2550    /** @brief performs a singular value back substitution.
2551
2552    The method calculates a back substitution for the specified right-hand
2553    side:
2554
2555    \f[\texttt{x} =  \texttt{vt} ^T  \cdot diag( \texttt{w} )^{-1}  \cdot \texttt{u} ^T  \cdot \texttt{rhs} \sim \texttt{A} ^{-1}  \cdot \texttt{rhs}\f]
2556
2557    Using this technique you can either get a very accurate solution of the
2558    convenient linear system, or the best (in the least-squares terms)
2559    pseudo-solution of an overdetermined linear system.
2560
2561    @param rhs right-hand side of a linear system (u\*w\*v')\*dst = rhs to
2562    be solved, where A has been previously decomposed.
2563
2564    @param dst found solution of the system.
2565
2566    @note Explicit SVD with the further back substitution only makes sense
2567    if you need to solve many linear systems with the same left-hand side
2568    (for example, src ). If all you need is to solve a single system
2569    (possibly with multiple rhs immediately available), simply call solve
2570    add pass DECOMP_SVD there. It does absolutely the same thing.
2571      */
2572    void backSubst( InputArray rhs, OutputArray dst ) const;
2573
2574    /** @todo document */
2575    template<typename _Tp, int m, int n, int nm> static
2576    void compute( const Matx<_Tp, m, n>& a, Matx<_Tp, nm, 1>& w, Matx<_Tp, m, nm>& u, Matx<_Tp, n, nm>& vt );
2577
2578    /** @todo document */
2579    template<typename _Tp, int m, int n, int nm> static
2580    void compute( const Matx<_Tp, m, n>& a, Matx<_Tp, nm, 1>& w );
2581
2582    /** @todo document */
2583    template<typename _Tp, int m, int n, int nm, int nb> static
2584    void backSubst( const Matx<_Tp, nm, 1>& w, const Matx<_Tp, m, nm>& u, const Matx<_Tp, n, nm>& vt, const Matx<_Tp, m, nb>& rhs, Matx<_Tp, n, nb>& dst );
2585
2586    Mat u, w, vt;
2587};
2588
2589/** @brief Random Number Generator
2590
2591Random number generator. It encapsulates the state (currently, a 64-bit
2592integer) and has methods to return scalar random values and to fill
2593arrays with random values. Currently it supports uniform and Gaussian
2594(normal) distributions. The generator uses Multiply-With-Carry
2595algorithm, introduced by G. Marsaglia (
2596<http://en.wikipedia.org/wiki/Multiply-with-carry> ).
2597Gaussian-distribution random numbers are generated using the Ziggurat
2598algorithm ( <http://en.wikipedia.org/wiki/Ziggurat_algorithm> ),
2599introduced by G. Marsaglia and W. W. Tsang.
2600*/
2601class CV_EXPORTS RNG
2602{
2603public:
2604    enum { UNIFORM = 0,
2605           NORMAL  = 1
2606         };
2607
2608    /** @brief constructor
2609
2610    These are the RNG constructors. The first form sets the state to some
2611    pre-defined value, equal to 2\*\*32-1 in the current implementation. The
2612    second form sets the state to the specified value. If you passed state=0
2613    , the constructor uses the above default value instead to avoid the
2614    singular random number sequence, consisting of all zeros.
2615    */
2616    RNG();
2617    /** @overload
2618    @param state 64-bit value used to initialize the RNG.
2619    */
2620    RNG(uint64 state);
2621    /**The method updates the state using the MWC algorithm and returns the
2622    next 32-bit random number.*/
2623    unsigned next();
2624
2625    /**Each of the methods updates the state using the MWC algorithm and
2626    returns the next random number of the specified type. In case of integer
2627    types, the returned number is from the available value range for the
2628    specified type. In case of floating-point types, the returned value is
2629    from [0,1) range.
2630    */
2631    operator uchar();
2632    /** @overload */
2633    operator schar();
2634    /** @overload */
2635    operator ushort();
2636    /** @overload */
2637    operator short();
2638    /** @overload */
2639    operator unsigned();
2640    /** @overload */
2641    operator int();
2642    /** @overload */
2643    operator float();
2644    /** @overload */
2645    operator double();
2646
2647    /** @brief returns a random integer sampled uniformly from [0, N).
2648
2649    The methods transform the state using the MWC algorithm and return the
2650    next random number. The first form is equivalent to RNG::next . The
2651    second form returns the random number modulo N , which means that the
2652    result is in the range [0, N) .
2653    */
2654    unsigned operator ()();
2655    /** @overload
2656    @param N upper non-inclusive boundary of the returned random number.
2657    */
2658    unsigned operator ()(unsigned N);
2659
2660    /** @brief returns uniformly distributed integer random number from [a,b) range
2661
2662    The methods transform the state using the MWC algorithm and return the
2663    next uniformly-distributed random number of the specified type, deduced
2664    from the input parameter type, from the range [a, b) . There is a nuance
2665    illustrated by the following sample:
2666
2667    @code{.cpp}
2668    RNG rng;
2669
2670    // always produces 0
2671    double a = rng.uniform(0, 1);
2672
2673    // produces double from [0, 1)
2674    double a1 = rng.uniform((double)0, (double)1);
2675
2676    // produces float from [0, 1)
2677    double b = rng.uniform(0.f, 1.f);
2678
2679    // produces double from [0, 1)
2680    double c = rng.uniform(0., 1.);
2681
2682    // may cause compiler error because of ambiguity:
2683    //  RNG::uniform(0, (int)0.999999)? or RNG::uniform((double)0, 0.99999)?
2684    double d = rng.uniform(0, 0.999999);
2685    @endcode
2686
2687    The compiler does not take into account the type of the variable to
2688    which you assign the result of RNG::uniform . The only thing that
2689    matters to the compiler is the type of a and b parameters. So, if you
2690    want a floating-point random number, but the range boundaries are
2691    integer numbers, either put dots in the end, if they are constants, or
2692    use explicit type cast operators, as in the a1 initialization above.
2693    @param a lower inclusive boundary of the returned random numbers.
2694    @param b upper non-inclusive boundary of the returned random numbers.
2695      */
2696    int uniform(int a, int b);
2697    /** @overload */
2698    float uniform(float a, float b);
2699    /** @overload */
2700    double uniform(double a, double b);
2701
2702    /** @brief Fills arrays with random numbers.
2703
2704    @param mat 2D or N-dimensional matrix; currently matrices with more than
2705    4 channels are not supported by the methods, use Mat::reshape as a
2706    possible workaround.
2707    @param distType distribution type, RNG::UNIFORM or RNG::NORMAL.
2708    @param a first distribution parameter; in case of the uniform
2709    distribution, this is an inclusive lower boundary, in case of the normal
2710    distribution, this is a mean value.
2711    @param b second distribution parameter; in case of the uniform
2712    distribution, this is a non-inclusive upper boundary, in case of the
2713    normal distribution, this is a standard deviation (diagonal of the
2714    standard deviation matrix or the full standard deviation matrix).
2715    @param saturateRange pre-saturation flag; for uniform distribution only;
2716    if true, the method will first convert a and b to the acceptable value
2717    range (according to the mat datatype) and then will generate uniformly
2718    distributed random numbers within the range [saturate(a), saturate(b)),
2719    if saturateRange=false, the method will generate uniformly distributed
2720    random numbers in the original range [a, b) and then will saturate them,
2721    it means, for example, that
2722    <tt>theRNG().fill(mat_8u, RNG::UNIFORM, -DBL_MAX, DBL_MAX)</tt> will likely
2723    produce array mostly filled with 0's and 255's, since the range (0, 255)
2724    is significantly smaller than [-DBL_MAX, DBL_MAX).
2725
2726    Each of the methods fills the matrix with the random values from the
2727    specified distribution. As the new numbers are generated, the RNG state
2728    is updated accordingly. In case of multiple-channel images, every
2729    channel is filled independently, which means that RNG cannot generate
2730    samples from the multi-dimensional Gaussian distribution with
2731    non-diagonal covariance matrix directly. To do that, the method
2732    generates samples from multi-dimensional standard Gaussian distribution
2733    with zero mean and identity covariation matrix, and then transforms them
2734    using transform to get samples from the specified Gaussian distribution.
2735    */
2736    void fill( InputOutputArray mat, int distType, InputArray a, InputArray b, bool saturateRange = false );
2737
2738    /** @brief Returns the next random number sampled from the Gaussian distribution
2739    @param sigma standard deviation of the distribution.
2740
2741    The method transforms the state using the MWC algorithm and returns the
2742    next random number from the Gaussian distribution N(0,sigma) . That is,
2743    the mean value of the returned random numbers is zero and the standard
2744    deviation is the specified sigma .
2745    */
2746    double gaussian(double sigma);
2747
2748    uint64 state;
2749};
2750
2751/** @brief Mersenne Twister random number generator
2752
2753Inspired by http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.c
2754@todo document
2755 */
2756class CV_EXPORTS RNG_MT19937
2757{
2758public:
2759    RNG_MT19937();
2760    RNG_MT19937(unsigned s);
2761    void seed(unsigned s);
2762
2763    unsigned next();
2764
2765    operator int();
2766    operator unsigned();
2767    operator float();
2768    operator double();
2769
2770    unsigned operator ()(unsigned N);
2771    unsigned operator ()();
2772
2773    /** @brief returns uniformly distributed integer random number from [a,b) range
2774
2775*/
2776    int uniform(int a, int b);
2777    /** @brief returns uniformly distributed floating-point random number from [a,b) range
2778
2779*/
2780    float uniform(float a, float b);
2781    /** @brief returns uniformly distributed double-precision floating-point random number from [a,b) range
2782
2783*/
2784    double uniform(double a, double b);
2785
2786private:
2787    enum PeriodParameters {N = 624, M = 397};
2788    unsigned state[N];
2789    int mti;
2790};
2791
2792//! @} core_array
2793
2794//! @addtogroup core_cluster
2795//!  @{
2796
2797/** @example kmeans.cpp
2798  An example on K-means clustering
2799*/
2800
2801/** @brief Finds centers of clusters and groups input samples around the clusters.
2802
2803The function kmeans implements a k-means algorithm that finds the centers of cluster_count clusters
2804and groups the input samples around the clusters. As an output, \f$\texttt{labels}_i\f$ contains a
28050-based cluster index for the sample stored in the \f$i^{th}\f$ row of the samples matrix.
2806
2807@note
2808-   (Python) An example on K-means clustering can be found at
2809    opencv_source_code/samples/python2/kmeans.py
2810@param data Data for clustering. An array of N-Dimensional points with float coordinates is needed.
2811Examples of this array can be:
2812-   Mat points(count, 2, CV_32F);
2813-   Mat points(count, 1, CV_32FC2);
2814-   Mat points(1, count, CV_32FC2);
2815-   std::vector\<cv::Point2f\> points(sampleCount);
2816@param K Number of clusters to split the set by.
2817@param bestLabels Input/output integer array that stores the cluster indices for every sample.
2818@param criteria The algorithm termination criteria, that is, the maximum number of iterations and/or
2819the desired accuracy. The accuracy is specified as criteria.epsilon. As soon as each of the cluster
2820centers moves by less than criteria.epsilon on some iteration, the algorithm stops.
2821@param attempts Flag to specify the number of times the algorithm is executed using different
2822initial labellings. The algorithm returns the labels that yield the best compactness (see the last
2823function parameter).
2824@param flags Flag that can take values of cv::KmeansFlags
2825@param centers Output matrix of the cluster centers, one row per each cluster center.
2826@return The function returns the compactness measure that is computed as
2827\f[\sum _i  \| \texttt{samples} _i -  \texttt{centers} _{ \texttt{labels} _i} \| ^2\f]
2828after every attempt. The best (minimum) value is chosen and the corresponding labels and the
2829compactness value are returned by the function. Basically, you can use only the core of the
2830function, set the number of attempts to 1, initialize labels each time using a custom algorithm,
2831pass them with the ( flags = KMEANS_USE_INITIAL_LABELS ) flag, and then choose the best
2832(most-compact) clustering.
2833*/
2834CV_EXPORTS_W double kmeans( InputArray data, int K, InputOutputArray bestLabels,
2835                            TermCriteria criteria, int attempts,
2836                            int flags, OutputArray centers = noArray() );
2837
2838//! @} core_cluster
2839
2840//! @addtogroup core_basic
2841//! @{
2842
2843/////////////////////////////// Formatted output of cv::Mat ///////////////////////////
2844
2845/** @todo document */
2846class CV_EXPORTS Formatted
2847{
2848public:
2849    virtual const char* next() = 0;
2850    virtual void reset() = 0;
2851    virtual ~Formatted();
2852};
2853
2854/** @todo document */
2855class CV_EXPORTS Formatter
2856{
2857public:
2858    enum { FMT_DEFAULT = 0,
2859           FMT_MATLAB  = 1,
2860           FMT_CSV     = 2,
2861           FMT_PYTHON  = 3,
2862           FMT_NUMPY   = 4,
2863           FMT_C       = 5
2864         };
2865
2866    virtual ~Formatter();
2867
2868    virtual Ptr<Formatted> format(const Mat& mtx) const = 0;
2869
2870    virtual void set32fPrecision(int p = 8) = 0;
2871    virtual void set64fPrecision(int p = 16) = 0;
2872    virtual void setMultiline(bool ml = true) = 0;
2873
2874    static Ptr<Formatter> get(int fmt = FMT_DEFAULT);
2875
2876};
2877
2878//////////////////////////////////////// Algorithm ////////////////////////////////////
2879
2880class CV_EXPORTS Algorithm;
2881
2882template<typename _Tp> struct ParamType {};
2883
2884
2885/** @brief This is a base class for all more or less complex algorithms in OpenCV
2886
2887especially for classes of algorithms, for which there can be multiple implementations. The examples
2888are stereo correspondence (for which there are algorithms like block matching, semi-global block
2889matching, graph-cut etc.), background subtraction (which can be done using mixture-of-gaussians
2890models, codebook-based algorithm etc.), optical flow (block matching, Lucas-Kanade, Horn-Schunck
2891etc.).
2892
2893Here is example of SIFT use in your application via Algorithm interface:
2894@code
2895    #include "opencv2/opencv.hpp"
2896    #include "opencv2/xfeatures2d.hpp"
2897    using namespace cv::xfeatures2d;
2898
2899    Ptr<Feature2D> sift = SIFT::create();
2900    FileStorage fs("sift_params.xml", FileStorage::READ);
2901    if( fs.isOpened() ) // if we have file with parameters, read them
2902    {
2903        sift->read(fs["sift_params"]);
2904        fs.release();
2905    }
2906    else // else modify the parameters and store them; user can later edit the file to use different parameters
2907    {
2908        sift->setContrastThreshold(0.01f); // lower the contrast threshold, compared to the default value
2909        {
2910            WriteStructContext ws(fs, "sift_params", CV_NODE_MAP);
2911            sift->write(fs);
2912        }
2913    }
2914    Mat image = imread("myimage.png", 0), descriptors;
2915    vector<KeyPoint> keypoints;
2916    sift->detectAndCompute(image, noArray(), keypoints, descriptors);
2917@endcode
2918 */
2919class CV_EXPORTS_W Algorithm
2920{
2921public:
2922    Algorithm();
2923    virtual ~Algorithm();
2924
2925    /** @brief Clears the algorithm state
2926    */
2927    CV_WRAP virtual void clear() {}
2928
2929    /** @brief Stores algorithm parameters in a file storage
2930    */
2931    virtual void write(FileStorage& fs) const { (void)fs; }
2932
2933    /** @brief Reads algorithm parameters from a file storage
2934    */
2935    virtual void read(const FileNode& fn) { (void)fn; }
2936
2937    /** @brief Returns true if the Algorithm is empty (e.g. in the very beginning or after unsuccessful read
2938     */
2939    virtual bool empty() const { return false; }
2940
2941    /** @brief Reads algorithm from the file node
2942
2943     This is static template method of Algorithm. It's usage is following (in the case of SVM):
2944     @code
2945     Ptr<SVM> svm = Algorithm::read<SVM>(fn);
2946     @endcode
2947     In order to make this method work, the derived class must overwrite Algorithm::read(const
2948     FileNode& fn) and also have static create() method without parameters
2949     (or with all the optional parameters)
2950     */
2951    template<typename _Tp> static Ptr<_Tp> read(const FileNode& fn)
2952    {
2953        Ptr<_Tp> obj = _Tp::create();
2954        obj->read(fn);
2955        return !obj->empty() ? obj : Ptr<_Tp>();
2956    }
2957
2958    /** @brief Loads algorithm from the file
2959
2960     @param filename Name of the file to read.
2961     @param objname The optional name of the node to read (if empty, the first top-level node will be used)
2962
2963     This is static template method of Algorithm. It's usage is following (in the case of SVM):
2964     @code
2965     Ptr<SVM> svm = Algorithm::load<SVM>("my_svm_model.xml");
2966     @endcode
2967     In order to make this method work, the derived class must overwrite Algorithm::read(const
2968     FileNode& fn).
2969     */
2970    template<typename _Tp> static Ptr<_Tp> load(const String& filename, const String& objname=String())
2971    {
2972        FileStorage fs(filename, FileStorage::READ);
2973        FileNode fn = objname.empty() ? fs.getFirstTopLevelNode() : fs[objname];
2974        Ptr<_Tp> obj = _Tp::create();
2975        obj->read(fn);
2976        return !obj->empty() ? obj : Ptr<_Tp>();
2977    }
2978
2979    /** @brief Loads algorithm from a String
2980
2981     @param strModel The string variable containing the model you want to load.
2982     @param objname The optional name of the node to read (if empty, the first top-level node will be used)
2983
2984     This is static template method of Algorithm. It's usage is following (in the case of SVM):
2985     @code
2986     Ptr<SVM> svm = Algorithm::loadFromString<SVM>(myStringModel);
2987     @endcode
2988     */
2989    template<typename _Tp> static Ptr<_Tp> loadFromString(const String& strModel, const String& objname=String())
2990    {
2991        FileStorage fs(strModel, FileStorage::READ + FileStorage::MEMORY);
2992        FileNode fn = objname.empty() ? fs.getFirstTopLevelNode() : fs[objname];
2993        Ptr<_Tp> obj = _Tp::create();
2994        obj->read(fn);
2995        return !obj->empty() ? obj : Ptr<_Tp>();
2996    }
2997
2998    /** Saves the algorithm to a file.
2999     In order to make this method work, the derived class must implement Algorithm::write(FileStorage& fs). */
3000    CV_WRAP virtual void save(const String& filename) const;
3001
3002    /** Returns the algorithm string identifier.
3003     This string is used as top level xml/yml node tag when the object is saved to a file or string. */
3004    CV_WRAP virtual String getDefaultName() const;
3005};
3006
3007struct Param {
3008    enum { INT=0, BOOLEAN=1, REAL=2, STRING=3, MAT=4, MAT_VECTOR=5, ALGORITHM=6, FLOAT=7,
3009           UNSIGNED_INT=8, UINT64=9, UCHAR=11 };
3010};
3011
3012
3013
3014template<> struct ParamType<bool>
3015{
3016    typedef bool const_param_type;
3017    typedef bool member_type;
3018
3019    enum { type = Param::BOOLEAN };
3020};
3021
3022template<> struct ParamType<int>
3023{
3024    typedef int const_param_type;
3025    typedef int member_type;
3026
3027    enum { type = Param::INT };
3028};
3029
3030template<> struct ParamType<double>
3031{
3032    typedef double const_param_type;
3033    typedef double member_type;
3034
3035    enum { type = Param::REAL };
3036};
3037
3038template<> struct ParamType<String>
3039{
3040    typedef const String& const_param_type;
3041    typedef String member_type;
3042
3043    enum { type = Param::STRING };
3044};
3045
3046template<> struct ParamType<Mat>
3047{
3048    typedef const Mat& const_param_type;
3049    typedef Mat member_type;
3050
3051    enum { type = Param::MAT };
3052};
3053
3054template<> struct ParamType<std::vector<Mat> >
3055{
3056    typedef const std::vector<Mat>& const_param_type;
3057    typedef std::vector<Mat> member_type;
3058
3059    enum { type = Param::MAT_VECTOR };
3060};
3061
3062template<> struct ParamType<Algorithm>
3063{
3064    typedef const Ptr<Algorithm>& const_param_type;
3065    typedef Ptr<Algorithm> member_type;
3066
3067    enum { type = Param::ALGORITHM };
3068};
3069
3070template<> struct ParamType<float>
3071{
3072    typedef float const_param_type;
3073    typedef float member_type;
3074
3075    enum { type = Param::FLOAT };
3076};
3077
3078template<> struct ParamType<unsigned>
3079{
3080    typedef unsigned const_param_type;
3081    typedef unsigned member_type;
3082
3083    enum { type = Param::UNSIGNED_INT };
3084};
3085
3086template<> struct ParamType<uint64>
3087{
3088    typedef uint64 const_param_type;
3089    typedef uint64 member_type;
3090
3091    enum { type = Param::UINT64 };
3092};
3093
3094template<> struct ParamType<uchar>
3095{
3096    typedef uchar const_param_type;
3097    typedef uchar member_type;
3098
3099    enum { type = Param::UCHAR };
3100};
3101
3102//! @} core_basic
3103
3104} //namespace cv
3105
3106#include "opencv2/core/operations.hpp"
3107#include "opencv2/core/cvstd.inl.hpp"
3108#include "opencv2/core/utility.hpp"
3109#include "opencv2/core/optim.hpp"
3110
3111#endif /*__OPENCV_CORE_HPP__*/
3112