123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654 |
- /*M///////////////////////////////////////////////////////////////////////////////////////
- //
- // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
- //
- // By downloading, copying, installing or using the software you agree to this license.
- // If you do not agree to this license, do not download, install,
- // copy or use the software.
- //
- //
- // License Agreement
- // For Open Source Computer Vision Library
- //
- // Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
- // Copyright (C) 2009, Willow Garage Inc., all rights reserved.
- // Copyright (C) 2013, OpenCV Foundation, all rights reserved.
- // Copyright (C) 2014, Itseez Inc., all rights reserved.
- // Third party copyrights are property of their respective owners.
- //
- // Redistribution and use in source and binary forms, with or without modification,
- // are permitted provided that the following conditions are met:
- //
- // * Redistribution's of source code must retain the above copyright notice,
- // this list of conditions and the following disclaimer.
- //
- // * Redistribution's in binary form must reproduce the above copyright notice,
- // this list of conditions and the following disclaimer in the documentation
- // and/or other materials provided with the distribution.
- //
- // * The name of the copyright holders may not be used to endorse or promote products
- // derived from this software without specific prior written permission.
- //
- // This software is provided by the copyright holders and contributors "as is" and
- // any express or implied warranties, including, but not limited to, the implied
- // warranties of merchantability and fitness for a particular purpose are disclaimed.
- // In no event shall the Intel Corporation or contributors be liable for any direct,
- // indirect, incidental, special, exemplary, or consequential damages
- // (including, but not limited to, procurement of substitute goods or services;
- // loss of use, data, or profits; or business interruption) however caused
- // and on any theory of liability, whether in contract, strict liability,
- // or tort (including negligence or otherwise) arising in any way out of
- // the use of this software, even if advised of the possibility of such damage.
- //
- //M*/
- #ifndef OPENCV_CORE_BASE_HPP
- #define OPENCV_CORE_BASE_HPP
- #ifndef __cplusplus
- # error base.hpp header must be compiled as C++
- #endif
- #include "opencv2/opencv_modules.hpp"
- #include <climits>
- #include <algorithm>
- #include "opencv2/core/cvdef.h"
- #include "opencv2/core/cvstd.hpp"
- namespace cv
- {
- //! @addtogroup core_utils
- //! @{
- namespace Error {
- //! error codes
- enum Code {
- StsOk= 0, //!< everything is ok
- StsBackTrace= -1, //!< pseudo error for back trace
- StsError= -2, //!< unknown /unspecified error
- StsInternal= -3, //!< internal error (bad state)
- StsNoMem= -4, //!< insufficient memory
- StsBadArg= -5, //!< function arg/param is bad
- StsBadFunc= -6, //!< unsupported function
- StsNoConv= -7, //!< iteration didn't converge
- StsAutoTrace= -8, //!< tracing
- HeaderIsNull= -9, //!< image header is NULL
- BadImageSize= -10, //!< image size is invalid
- BadOffset= -11, //!< offset is invalid
- BadDataPtr= -12, //!<
- BadStep= -13, //!< image step is wrong, this may happen for a non-continuous matrix.
- BadModelOrChSeq= -14, //!<
- BadNumChannels= -15, //!< bad number of channels, for example, some functions accept only single channel matrices.
- BadNumChannel1U= -16, //!<
- BadDepth= -17, //!< input image depth is not supported by the function
- BadAlphaChannel= -18, //!<
- BadOrder= -19, //!< number of dimensions is out of range
- BadOrigin= -20, //!< incorrect input origin
- BadAlign= -21, //!< incorrect input align
- BadCallBack= -22, //!<
- BadTileSize= -23, //!<
- BadCOI= -24, //!< input COI is not supported
- BadROISize= -25, //!< incorrect input roi
- MaskIsTiled= -26, //!<
- StsNullPtr= -27, //!< null pointer
- StsVecLengthErr= -28, //!< incorrect vector length
- StsFilterStructContentErr= -29, //!< incorrect filter structure content
- StsKernelStructContentErr= -30, //!< incorrect transform kernel content
- StsFilterOffsetErr= -31, //!< incorrect filter offset value
- StsBadSize= -201, //!< the input/output structure size is incorrect
- StsDivByZero= -202, //!< division by zero
- StsInplaceNotSupported= -203, //!< in-place operation is not supported
- StsObjectNotFound= -204, //!< request can't be completed
- StsUnmatchedFormats= -205, //!< formats of input/output arrays differ
- StsBadFlag= -206, //!< flag is wrong or not supported
- StsBadPoint= -207, //!< bad CvPoint
- StsBadMask= -208, //!< bad format of mask (neither 8uC1 nor 8sC1)
- StsUnmatchedSizes= -209, //!< sizes of input/output structures do not match
- StsUnsupportedFormat= -210, //!< the data format/type is not supported by the function
- StsOutOfRange= -211, //!< some of parameters are out of range
- StsParseError= -212, //!< invalid syntax/structure of the parsed file
- StsNotImplemented= -213, //!< the requested function/feature is not implemented
- StsBadMemBlock= -214, //!< an allocated block has been corrupted
- StsAssert= -215, //!< assertion failed
- GpuNotSupported= -216, //!< no CUDA support
- GpuApiCallError= -217, //!< GPU API call error
- OpenGlNotSupported= -218, //!< no OpenGL support
- OpenGlApiCallError= -219, //!< OpenGL API call error
- OpenCLApiCallError= -220, //!< OpenCL API call error
- OpenCLDoubleNotSupported= -221,
- OpenCLInitError= -222, //!< OpenCL initialization error
- OpenCLNoAMDBlasFft= -223
- };
- } //Error
- //! @} core_utils
- //! @addtogroup core_array
- //! @{
- //! matrix decomposition types
- enum DecompTypes {
- /** Gaussian elimination with the optimal pivot element chosen. */
- DECOMP_LU = 0,
- /** singular value decomposition (SVD) method; the system can be over-defined and/or the matrix
- src1 can be singular */
- DECOMP_SVD = 1,
- /** eigenvalue decomposition; the matrix src1 must be symmetrical */
- DECOMP_EIG = 2,
- /** Cholesky \f$LL^T\f$ factorization; the matrix src1 must be symmetrical and positively
- defined */
- DECOMP_CHOLESKY = 3,
- /** QR factorization; the system can be over-defined and/or the matrix src1 can be singular */
- DECOMP_QR = 4,
- /** while all the previous flags are mutually exclusive, this flag can be used together with
- any of the previous; it means that the normal equations
- \f$\texttt{src1}^T\cdot\texttt{src1}\cdot\texttt{dst}=\texttt{src1}^T\texttt{src2}\f$ are
- solved instead of the original system
- \f$\texttt{src1}\cdot\texttt{dst}=\texttt{src2}\f$ */
- DECOMP_NORMAL = 16
- };
- /** norm types
- src1 and src2 denote input arrays.
- */
- enum NormTypes {
- /**
- \f[
- norm = \forkthree
- {\|\texttt{src1}\|_{L_{\infty}} = \max _I | \texttt{src1} (I)|}{if \(\texttt{normType} = \texttt{NORM_INF}\) }
- {\|\texttt{src1}-\texttt{src2}\|_{L_{\infty}} = \max _I | \texttt{src1} (I) - \texttt{src2} (I)|}{if \(\texttt{normType} = \texttt{NORM_INF}\) }
- {\frac{\|\texttt{src1}-\texttt{src2}\|_{L_{\infty}} }{\|\texttt{src2}\|_{L_{\infty}} }}{if \(\texttt{normType} = \texttt{NORM_RELATIVE | NORM_INF}\) }
- \f]
- */
- NORM_INF = 1,
- /**
- \f[
- norm = \forkthree
- {\| \texttt{src1} \| _{L_1} = \sum _I | \texttt{src1} (I)|}{if \(\texttt{normType} = \texttt{NORM_L1}\)}
- { \| \texttt{src1} - \texttt{src2} \| _{L_1} = \sum _I | \texttt{src1} (I) - \texttt{src2} (I)|}{if \(\texttt{normType} = \texttt{NORM_L1}\) }
- { \frac{\|\texttt{src1}-\texttt{src2}\|_{L_1} }{\|\texttt{src2}\|_{L_1}} }{if \(\texttt{normType} = \texttt{NORM_RELATIVE | NORM_L1}\) }
- \f]*/
- NORM_L1 = 2,
- /**
- \f[
- norm = \forkthree
- { \| \texttt{src1} \| _{L_2} = \sqrt{\sum_I \texttt{src1}(I)^2} }{if \(\texttt{normType} = \texttt{NORM_L2}\) }
- { \| \texttt{src1} - \texttt{src2} \| _{L_2} = \sqrt{\sum_I (\texttt{src1}(I) - \texttt{src2}(I))^2} }{if \(\texttt{normType} = \texttt{NORM_L2}\) }
- { \frac{\|\texttt{src1}-\texttt{src2}\|_{L_2} }{\|\texttt{src2}\|_{L_2}} }{if \(\texttt{normType} = \texttt{NORM_RELATIVE | NORM_L2}\) }
- \f]
- */
- NORM_L2 = 4,
- /**
- \f[
- norm = \forkthree
- { \| \texttt{src1} \| _{L_2} ^{2} = \sum_I \texttt{src1}(I)^2} {if \(\texttt{normType} = \texttt{NORM_L2SQR}\)}
- { \| \texttt{src1} - \texttt{src2} \| _{L_2} ^{2} = \sum_I (\texttt{src1}(I) - \texttt{src2}(I))^2 }{if \(\texttt{normType} = \texttt{NORM_L2SQR}\) }
- { \left(\frac{\|\texttt{src1}-\texttt{src2}\|_{L_2} }{\|\texttt{src2}\|_{L_2}}\right)^2 }{if \(\texttt{normType} = \texttt{NORM_RELATIVE | NORM_L2SQR}\) }
- \f]
- */
- NORM_L2SQR = 5,
- /**
- In the case of one input array, calculates the Hamming distance of the array from zero,
- In the case of two input arrays, calculates the Hamming distance between the arrays.
- */
- NORM_HAMMING = 6,
- /**
- Similar to NORM_HAMMING, but in the calculation, each two bits of the input sequence will
- be added and treated as a single bit to be used in the same calculation as NORM_HAMMING.
- */
- NORM_HAMMING2 = 7,
- NORM_TYPE_MASK = 7, //!< bit-mask which can be used to separate norm type from norm flags
- NORM_RELATIVE = 8, //!< flag
- NORM_MINMAX = 32 //!< flag
- };
- //! comparison types
- enum CmpTypes { CMP_EQ = 0, //!< src1 is equal to src2.
- CMP_GT = 1, //!< src1 is greater than src2.
- CMP_GE = 2, //!< src1 is greater than or equal to src2.
- CMP_LT = 3, //!< src1 is less than src2.
- CMP_LE = 4, //!< src1 is less than or equal to src2.
- CMP_NE = 5 //!< src1 is unequal to src2.
- };
- //! generalized matrix multiplication flags
- enum GemmFlags { GEMM_1_T = 1, //!< transposes src1
- GEMM_2_T = 2, //!< transposes src2
- GEMM_3_T = 4 //!< transposes src3
- };
- enum DftFlags {
- /** performs an inverse 1D or 2D transform instead of the default forward
- transform. */
- DFT_INVERSE = 1,
- /** scales the result: divide it by the number of array elements. Normally, it is
- combined with DFT_INVERSE. */
- DFT_SCALE = 2,
- /** performs a forward or inverse transform of every individual row of the input
- matrix; this flag enables you to transform multiple vectors simultaneously and can be used to
- decrease the overhead (which is sometimes several times larger than the processing itself) to
- perform 3D and higher-dimensional transformations and so forth.*/
- DFT_ROWS = 4,
- /** performs a forward transformation of 1D or 2D real array; the result,
- though being a complex array, has complex-conjugate symmetry (*CCS*, see the function
- description below for details), and such an array can be packed into a real array of the same
- size as input, which is the fastest option and which is what the function does by default;
- however, you may wish to get a full complex array (for simpler spectrum analysis, and so on) -
- pass the flag to enable the function to produce a full-size complex output array. */
- DFT_COMPLEX_OUTPUT = 16,
- /** performs an inverse transformation of a 1D or 2D complex array; the
- result is normally a complex array of the same size, however, if the input array has
- conjugate-complex symmetry (for example, it is a result of forward transformation with
- DFT_COMPLEX_OUTPUT flag), the output is a real array; while the function itself does not
- check whether the input is symmetrical or not, you can pass the flag and then the function
- will assume the symmetry and produce the real output array (note that when the input is packed
- into a real array and inverse transformation is executed, the function treats the input as a
- packed complex-conjugate symmetrical array, and the output will also be a real array). */
- DFT_REAL_OUTPUT = 32,
- /** specifies that input is complex input. If this flag is set, the input must have 2 channels.
- On the other hand, for backwards compatibility reason, if input has 2 channels, input is
- already considered complex. */
- DFT_COMPLEX_INPUT = 64,
- /** performs an inverse 1D or 2D transform instead of the default forward transform. */
- DCT_INVERSE = DFT_INVERSE,
- /** performs a forward or inverse transform of every individual row of the input
- matrix. This flag enables you to transform multiple vectors simultaneously and can be used to
- decrease the overhead (which is sometimes several times larger than the processing itself) to
- perform 3D and higher-dimensional transforms and so forth.*/
- DCT_ROWS = DFT_ROWS
- };
- //! Various border types, image boundaries are denoted with `|`
- //! @see borderInterpolate, copyMakeBorder
- enum BorderTypes {
- BORDER_CONSTANT = 0, //!< `iiiiii|abcdefgh|iiiiiii` with some specified `i`
- BORDER_REPLICATE = 1, //!< `aaaaaa|abcdefgh|hhhhhhh`
- BORDER_REFLECT = 2, //!< `fedcba|abcdefgh|hgfedcb`
- BORDER_WRAP = 3, //!< `cdefgh|abcdefgh|abcdefg`
- BORDER_REFLECT_101 = 4, //!< `gfedcb|abcdefgh|gfedcba`
- BORDER_TRANSPARENT = 5, //!< `uvwxyz|abcdefgh|ijklmno`
- BORDER_REFLECT101 = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
- BORDER_DEFAULT = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
- BORDER_ISOLATED = 16 //!< do not look outside of ROI
- };
- //! @} core_array
- //! @addtogroup core_utils
- //! @{
- /*! @brief Signals an error and raises the exception.
- By default the function prints information about the error to stderr,
- then it either stops if setBreakOnError() had been called before or raises the exception.
- It is possible to alternate error processing by using redirectError().
- @param _code - error code (Error::Code)
- @param _err - error description
- @param _func - function name. Available only when the compiler supports getting it
- @param _file - source file name where the error has occurred
- @param _line - line number in the source file where the error has occurred
- @see CV_Error, CV_Error_, CV_Assert, CV_DbgAssert
- */
- CV_EXPORTS CV_NORETURN void error(int _code, const String& _err, const char* _func, const char* _file, int _line);
- #ifdef CV_STATIC_ANALYSIS
- // In practice, some macro are not processed correctly (noreturn is not detected).
- // We need to use simplified definition for them.
- #define CV_Error(code, msg) do { (void)(code); (void)(msg); abort(); } while (0)
- #define CV_Error_(code, args) do { (void)(code); (void)(cv::format args); abort(); } while (0)
- #define CV_Assert( expr ) do { if (!(expr)) abort(); } while (0)
- #else // CV_STATIC_ANALYSIS
- /** @brief Call the error handler.
- Currently, the error handler prints the error code and the error message to the standard
- error stream `stderr`. In the Debug configuration, it then provokes memory access violation, so that
- the execution stack and all the parameters can be analyzed by the debugger. In the Release
- configuration, the exception is thrown.
- @param code one of Error::Code
- @param msg error message
- */
- #define CV_Error( code, msg ) cv::error( code, msg, CV_Func, __FILE__, __LINE__ )
- /** @brief Call the error handler.
- This macro can be used to construct an error message on-fly to include some dynamic information,
- for example:
- @code
- // note the extra parentheses around the formatted text message
- CV_Error_(Error::StsOutOfRange,
- ("the value at (%d, %d)=%g is out of range", badPt.x, badPt.y, badValue));
- @endcode
- @param code one of Error::Code
- @param args printf-like formatted error message in parentheses
- */
- #define CV_Error_( code, args ) cv::error( code, cv::format args, CV_Func, __FILE__, __LINE__ )
- /** @brief Checks a condition at runtime and throws exception if it fails
- The macros CV_Assert (and CV_DbgAssert(expr)) evaluate the specified expression. If it is 0, the macros
- raise an error (see cv::error). The macro CV_Assert checks the condition in both Debug and Release
- configurations while CV_DbgAssert is only retained in the Debug configuration.
- */
- #define CV_Assert( expr ) do { if(!!(expr)) ; else cv::error( cv::Error::StsAssert, #expr, CV_Func, __FILE__, __LINE__ ); } while(0)
- #endif // CV_STATIC_ANALYSIS
- //! @cond IGNORED
- #if !defined(__OPENCV_BUILD) // TODO: backward compatibility only
- #ifndef CV_ErrorNoReturn
- #define CV_ErrorNoReturn CV_Error
- #endif
- #ifndef CV_ErrorNoReturn_
- #define CV_ErrorNoReturn_ CV_Error_
- #endif
- #endif
- #define CV_Assert_1 CV_Assert
- #define CV_Assert_2( expr, ... ) CV_Assert_1(expr); __CV_EXPAND(CV_Assert_1( __VA_ARGS__ ))
- #define CV_Assert_3( expr, ... ) CV_Assert_1(expr); __CV_EXPAND(CV_Assert_2( __VA_ARGS__ ))
- #define CV_Assert_4( expr, ... ) CV_Assert_1(expr); __CV_EXPAND(CV_Assert_3( __VA_ARGS__ ))
- #define CV_Assert_5( expr, ... ) CV_Assert_1(expr); __CV_EXPAND(CV_Assert_4( __VA_ARGS__ ))
- #define CV_Assert_6( expr, ... ) CV_Assert_1(expr); __CV_EXPAND(CV_Assert_5( __VA_ARGS__ ))
- #define CV_Assert_7( expr, ... ) CV_Assert_1(expr); __CV_EXPAND(CV_Assert_6( __VA_ARGS__ ))
- #define CV_Assert_8( expr, ... ) CV_Assert_1(expr); __CV_EXPAND(CV_Assert_7( __VA_ARGS__ ))
- #define CV_Assert_9( expr, ... ) CV_Assert_1(expr); __CV_EXPAND(CV_Assert_8( __VA_ARGS__ ))
- #define CV_Assert_10( expr, ... ) CV_Assert_1(expr); __CV_EXPAND(CV_Assert_9( __VA_ARGS__ ))
- #define CV_Assert_N(...) do { __CV_EXPAND(__CV_CAT(CV_Assert_, __CV_VA_NUM_ARGS(__VA_ARGS__)) (__VA_ARGS__)); } while(0)
- //! @endcond
- #if defined _DEBUG || defined CV_STATIC_ANALYSIS
- # define CV_DbgAssert(expr) CV_Assert(expr)
- #else
- /** replaced with CV_Assert(expr) in Debug configuration */
- # define CV_DbgAssert(expr)
- #endif
- /*
- * Hamming distance functor - counts the bit differences between two strings - useful for the Brief descriptor
- * bit count of A exclusive XOR'ed with B
- */
- struct CV_EXPORTS Hamming
- {
- static const NormTypes normType = NORM_HAMMING;
- typedef unsigned char ValueType;
- typedef int ResultType;
- /** this will count the bits in a ^ b
- */
- ResultType operator()( const unsigned char* a, const unsigned char* b, int size ) const;
- };
- typedef Hamming HammingLUT;
- /////////////////////////////////// inline norms ////////////////////////////////////
- template<typename _Tp> inline _Tp cv_abs(_Tp x) { return std::abs(x); }
- inline int cv_abs(uchar x) { return x; }
- inline int cv_abs(schar x) { return std::abs(x); }
- inline int cv_abs(ushort x) { return x; }
- inline int cv_abs(short x) { return std::abs(x); }
- template<typename _Tp, typename _AccTp> static inline
- _AccTp normL2Sqr(const _Tp* a, int n)
- {
- _AccTp s = 0;
- int i=0;
- #if CV_ENABLE_UNROLLED
- for( ; i <= n - 4; i += 4 )
- {
- _AccTp v0 = a[i], v1 = a[i+1], v2 = a[i+2], v3 = a[i+3];
- s += v0*v0 + v1*v1 + v2*v2 + v3*v3;
- }
- #endif
- for( ; i < n; i++ )
- {
- _AccTp v = a[i];
- s += v*v;
- }
- return s;
- }
- template<typename _Tp, typename _AccTp> static inline
- _AccTp normL1(const _Tp* a, int n)
- {
- _AccTp s = 0;
- int i = 0;
- #if CV_ENABLE_UNROLLED
- for(; i <= n - 4; i += 4 )
- {
- s += (_AccTp)cv_abs(a[i]) + (_AccTp)cv_abs(a[i+1]) +
- (_AccTp)cv_abs(a[i+2]) + (_AccTp)cv_abs(a[i+3]);
- }
- #endif
- for( ; i < n; i++ )
- s += cv_abs(a[i]);
- return s;
- }
- template<typename _Tp, typename _AccTp> static inline
- _AccTp normInf(const _Tp* a, int n)
- {
- _AccTp s = 0;
- for( int i = 0; i < n; i++ )
- s = std::max(s, (_AccTp)cv_abs(a[i]));
- return s;
- }
- template<typename _Tp, typename _AccTp> static inline
- _AccTp normL2Sqr(const _Tp* a, const _Tp* b, int n)
- {
- _AccTp s = 0;
- int i= 0;
- #if CV_ENABLE_UNROLLED
- for(; i <= n - 4; i += 4 )
- {
- _AccTp v0 = _AccTp(a[i] - b[i]), v1 = _AccTp(a[i+1] - b[i+1]), v2 = _AccTp(a[i+2] - b[i+2]), v3 = _AccTp(a[i+3] - b[i+3]);
- s += v0*v0 + v1*v1 + v2*v2 + v3*v3;
- }
- #endif
- for( ; i < n; i++ )
- {
- _AccTp v = _AccTp(a[i] - b[i]);
- s += v*v;
- }
- return s;
- }
- static inline float normL2Sqr(const float* a, const float* b, int n)
- {
- float s = 0.f;
- for( int i = 0; i < n; i++ )
- {
- float v = a[i] - b[i];
- s += v*v;
- }
- return s;
- }
- template<typename _Tp, typename _AccTp> static inline
- _AccTp normL1(const _Tp* a, const _Tp* b, int n)
- {
- _AccTp s = 0;
- int i= 0;
- #if CV_ENABLE_UNROLLED
- for(; i <= n - 4; i += 4 )
- {
- _AccTp v0 = _AccTp(a[i] - b[i]), v1 = _AccTp(a[i+1] - b[i+1]), v2 = _AccTp(a[i+2] - b[i+2]), v3 = _AccTp(a[i+3] - b[i+3]);
- s += std::abs(v0) + std::abs(v1) + std::abs(v2) + std::abs(v3);
- }
- #endif
- for( ; i < n; i++ )
- {
- _AccTp v = _AccTp(a[i] - b[i]);
- s += std::abs(v);
- }
- return s;
- }
- inline float normL1(const float* a, const float* b, int n)
- {
- float s = 0.f;
- for( int i = 0; i < n; i++ )
- {
- s += std::abs(a[i] - b[i]);
- }
- return s;
- }
- inline int normL1(const uchar* a, const uchar* b, int n)
- {
- int s = 0;
- for( int i = 0; i < n; i++ )
- {
- s += std::abs(a[i] - b[i]);
- }
- return s;
- }
- template<typename _Tp, typename _AccTp> static inline
- _AccTp normInf(const _Tp* a, const _Tp* b, int n)
- {
- _AccTp s = 0;
- for( int i = 0; i < n; i++ )
- {
- _AccTp v0 = a[i] - b[i];
- s = std::max(s, std::abs(v0));
- }
- return s;
- }
- /** @brief Computes the cube root of an argument.
- The function cubeRoot computes \f$\sqrt[3]{\texttt{val}}\f$. Negative arguments are handled correctly.
- NaN and Inf are not handled. The accuracy approaches the maximum possible accuracy for
- single-precision data.
- @param val A function argument.
- */
- CV_EXPORTS_W float cubeRoot(float val);
- /** @brief Calculates the angle of a 2D vector in degrees.
- The function fastAtan2 calculates the full-range angle of an input 2D vector. The angle is measured
- in degrees and varies from 0 to 360 degrees. The accuracy is about 0.3 degrees.
- @param x x-coordinate of the vector.
- @param y y-coordinate of the vector.
- */
- CV_EXPORTS_W float fastAtan2(float y, float x);
- /** proxy for hal::LU */
- CV_EXPORTS int LU(float* A, size_t astep, int m, float* b, size_t bstep, int n);
- /** proxy for hal::LU */
- CV_EXPORTS int LU(double* A, size_t astep, int m, double* b, size_t bstep, int n);
- /** proxy for hal::Cholesky */
- CV_EXPORTS bool Cholesky(float* A, size_t astep, int m, float* b, size_t bstep, int n);
- /** proxy for hal::Cholesky */
- CV_EXPORTS bool Cholesky(double* A, size_t astep, int m, double* b, size_t bstep, int n);
- ////////////////// forward declarations for important OpenCV types //////////////////
- //! @cond IGNORED
- template<typename _Tp, int cn> class Vec;
- template<typename _Tp, int m, int n> class Matx;
- template<typename _Tp> class Complex;
- template<typename _Tp> class Point_;
- template<typename _Tp> class Point3_;
- template<typename _Tp> class Size_;
- template<typename _Tp> class Rect_;
- template<typename _Tp> class Scalar_;
- class CV_EXPORTS RotatedRect;
- class CV_EXPORTS Range;
- class CV_EXPORTS TermCriteria;
- class CV_EXPORTS KeyPoint;
- class CV_EXPORTS DMatch;
- class CV_EXPORTS RNG;
- class CV_EXPORTS Mat;
- class CV_EXPORTS MatExpr;
- class CV_EXPORTS UMat;
- class CV_EXPORTS SparseMat;
- typedef Mat MatND;
- template<typename _Tp> class Mat_;
- template<typename _Tp> class SparseMat_;
- class CV_EXPORTS MatConstIterator;
- class CV_EXPORTS SparseMatIterator;
- class CV_EXPORTS SparseMatConstIterator;
- template<typename _Tp> class MatIterator_;
- template<typename _Tp> class MatConstIterator_;
- template<typename _Tp> class SparseMatIterator_;
- template<typename _Tp> class SparseMatConstIterator_;
- namespace ogl
- {
- class CV_EXPORTS Buffer;
- class CV_EXPORTS Texture2D;
- class CV_EXPORTS Arrays;
- }
- namespace cuda
- {
- class CV_EXPORTS GpuMat;
- class CV_EXPORTS HostMem;
- class CV_EXPORTS Stream;
- class CV_EXPORTS Event;
- }
- namespace cudev
- {
- template <typename _Tp> class GpuMat_;
- }
- namespace ipp
- {
- CV_EXPORTS unsigned long long getIppFeatures();
- CV_EXPORTS void setIppStatus(int status, const char * const funcname = NULL, const char * const filename = NULL,
- int line = 0);
- CV_EXPORTS int getIppStatus();
- CV_EXPORTS String getIppErrorLocation();
- CV_EXPORTS_W bool useIPP();
- CV_EXPORTS_W void setUseIPP(bool flag);
- CV_EXPORTS_W String getIppVersion();
- // IPP Not-Exact mode. This function may force use of IPP then both IPP and OpenCV provide proper results
- // but have internal accuracy differences which have too much direct or indirect impact on accuracy tests.
- CV_EXPORTS_W bool useIPP_NotExact();
- CV_EXPORTS_W void setUseIPP_NotExact(bool flag);
- #ifndef DISABLE_OPENCV_3_COMPATIBILITY
- static inline bool useIPP_NE() { return useIPP_NotExact(); }
- static inline void setUseIPP_NE(bool flag) { setUseIPP_NotExact(flag); }
- #endif
- } // ipp
- //! @endcond
- //! @} core_utils
- } // cv
- #include "opencv2/core/neon_utils.hpp"
- #include "opencv2/core/vsx_utils.hpp"
- #include "opencv2/core/check.hpp"
- #endif //OPENCV_CORE_BASE_HPP
|