| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675 |
- /*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) 2015, 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_DEF_H__
- #define __OPENCV_DEF_H__
- #if !defined _CRT_SECURE_NO_DEPRECATE && defined _MSC_VER && _MSC_VER > 1300
- # define _CRT_SECURE_NO_DEPRECATE /* to avoid multiple Visual Studio warnings */
- #endif
- #include <limits.h>
- #if defined __ICL
- # define CV_ICC __ICL
- #elif defined __ICC
- # define CV_ICC __ICC
- #elif defined __ECL
- # define CV_ICC __ECL
- #elif defined __ECC
- # define CV_ICC __ECC
- #elif defined __INTEL_COMPILER
- # define CV_ICC __INTEL_COMPILER
- #endif
- #ifndef CV_INLINE
- # if defined __cplusplus
- # define CV_INLINE static inline
- # elif defined _MSC_VER
- # define CV_INLINE __inline
- # else
- # define CV_INLINE static
- # endif
- #endif
- #if defined CV_ICC && !defined CV_ENABLE_UNROLLED
- # define CV_ENABLE_UNROLLED 0
- #else
- # define CV_ENABLE_UNROLLED 1
- #endif
- #ifdef __GNUC__
- # define CV_DECL_ALIGNED(x) __attribute__ ((aligned (x)))
- #elif defined _MSC_VER
- # define CV_DECL_ALIGNED(x) __declspec(align(x))
- #else
- # define CV_DECL_ALIGNED(x)
- #endif
- /* CPU features and intrinsics support */
- #define CV_CPU_NONE 0
- #define CV_CPU_MMX 1
- #define CV_CPU_SSE 2
- #define CV_CPU_SSE2 3
- #define CV_CPU_SSE3 4
- #define CV_CPU_SSSE3 5
- #define CV_CPU_SSE4_1 6
- #define CV_CPU_SSE4_2 7
- #define CV_CPU_POPCNT 8
- #define CV_CPU_AVX 10
- #define CV_CPU_AVX2 11
- #define CV_CPU_FMA3 12
- #define CV_CPU_AVX_512F 13
- #define CV_CPU_AVX_512BW 14
- #define CV_CPU_AVX_512CD 15
- #define CV_CPU_AVX_512DQ 16
- #define CV_CPU_AVX_512ER 17
- #define CV_CPU_AVX_512IFMA512 18
- #define CV_CPU_AVX_512PF 19
- #define CV_CPU_AVX_512VBMI 20
- #define CV_CPU_AVX_512VL 21
- #define CV_CPU_NEON 100
- // when adding to this list remember to update the enum in core/utility.cpp
- #define CV_HARDWARE_MAX_FEATURE 255
- // do not include SSE/AVX/NEON headers for NVCC compiler
- #ifndef __CUDACC__
- #if defined __SSE2__ || defined _M_X64 || (defined _M_IX86_FP && _M_IX86_FP >= 2)
- # include <emmintrin.h>
- # define CV_MMX 1
- # define CV_SSE 1
- # define CV_SSE2 1
- # if defined __SSE3__ || (defined _MSC_VER && _MSC_VER >= 1500)
- # include <pmmintrin.h>
- # define CV_SSE3 1
- # endif
- # if defined __SSSE3__ || (defined _MSC_VER && _MSC_VER >= 1500)
- # include <tmmintrin.h>
- # define CV_SSSE3 1
- # endif
- # if defined __SSE4_1__ || (defined _MSC_VER && _MSC_VER >= 1500)
- # include <smmintrin.h>
- # define CV_SSE4_1 1
- # endif
- # if defined __SSE4_2__ || (defined _MSC_VER && _MSC_VER >= 1500)
- # include <nmmintrin.h>
- # define CV_SSE4_2 1
- # endif
- # if defined __POPCNT__ || (defined _MSC_VER && _MSC_VER >= 1500)
- # ifdef _MSC_VER
- # include <nmmintrin.h>
- # else
- # include <popcntintrin.h>
- # endif
- # define CV_POPCNT 1
- # endif
- # if defined __AVX__ || (defined _MSC_VER && _MSC_VER >= 1600 && 0)
- // MS Visual Studio 2010 (2012?) has no macro pre-defined to identify the use of /arch:AVX
- // See: http://connect.microsoft.com/VisualStudio/feedback/details/605858/arch-avx-should-define-a-predefined-macro-in-x64-and-set-a-unique-value-for-m-ix86-fp-in-win32
- # include <immintrin.h>
- # define CV_AVX 1
- # if defined(_XCR_XFEATURE_ENABLED_MASK)
- # define __xgetbv() _xgetbv(_XCR_XFEATURE_ENABLED_MASK)
- # else
- # define __xgetbv() 0
- # endif
- # endif
- # if defined __AVX2__ || (defined _MSC_VER && _MSC_VER >= 1800 && 0)
- # include <immintrin.h>
- # define CV_AVX2 1
- # if defined __FMA__
- # define CV_FMA3 1
- # endif
- # endif
- #endif
- #if (defined WIN32 || defined _WIN32) && defined(_M_ARM)
- # include <Intrin.h>
- # include "arm_neon.h"
- # define CV_NEON 1
- # define CPU_HAS_NEON_FEATURE (true)
- #elif defined(__ARM_NEON__) || (defined (__ARM_NEON) && defined(__aarch64__))
- # include <arm_neon.h>
- # define CV_NEON 1
- #endif
- #if defined __GNUC__ && defined __arm__ && (defined __ARM_PCS_VFP || defined __ARM_VFPV3__)
- # define CV_VFP 1
- #endif
- #endif // __CUDACC__
- #ifndef CV_POPCNT
- #define CV_POPCNT 0
- #endif
- #ifndef CV_MMX
- # define CV_MMX 0
- #endif
- #ifndef CV_SSE
- # define CV_SSE 0
- #endif
- #ifndef CV_SSE2
- # define CV_SSE2 0
- #endif
- #ifndef CV_SSE3
- # define CV_SSE3 0
- #endif
- #ifndef CV_SSSE3
- # define CV_SSSE3 0
- #endif
- #ifndef CV_SSE4_1
- # define CV_SSE4_1 0
- #endif
- #ifndef CV_SSE4_2
- # define CV_SSE4_2 0
- #endif
- #ifndef CV_AVX
- # define CV_AVX 0
- #endif
- #ifndef CV_AVX2
- # define CV_AVX2 0
- #endif
- #ifndef CV_FMA3
- # define CV_FMA3 0
- #endif
- #ifndef CV_AVX_512F
- # define CV_AVX_512F 0
- #endif
- #ifndef CV_AVX_512BW
- # define CV_AVX_512BW 0
- #endif
- #ifndef CV_AVX_512CD
- # define CV_AVX_512CD 0
- #endif
- #ifndef CV_AVX_512DQ
- # define CV_AVX_512DQ 0
- #endif
- #ifndef CV_AVX_512ER
- # define CV_AVX_512ER 0
- #endif
- #ifndef CV_AVX_512IFMA512
- # define CV_AVX_512IFMA512 0
- #endif
- #ifndef CV_AVX_512PF
- # define CV_AVX_512PF 0
- #endif
- #ifndef CV_AVX_512VBMI
- # define CV_AVX_512VBMI 0
- #endif
- #ifndef CV_AVX_512VL
- # define CV_AVX_512VL 0
- #endif
- #ifndef CV_NEON
- # define CV_NEON 0
- #endif
- #ifndef CV_VFP
- # define CV_VFP 0
- #endif
- /* primitive types */
- /*
- schar - signed 1 byte integer
- uchar - unsigned 1 byte integer
- short - signed 2 byte integer
- ushort - unsigned 2 byte integer
- int - signed 4 byte integer
- uint - unsigned 4 byte integer
- int64 - signed 8 byte integer
- uint64 - unsigned 8 byte integer
- */
- #if !defined _MSC_VER && !defined __BORLANDC__
- # if defined __cplusplus && __cplusplus >= 201103L
- # include <cstdint>
- typedef std::uint32_t uint;
- # else
- # include <stdint.h>
- typedef uint32_t uint;
- # endif
- #else
- typedef unsigned uint;
- #endif
- typedef signed char schar;
- #ifndef __IPL_H__
- typedef unsigned char uchar;
- typedef unsigned short ushort;
- #endif
- #if defined _MSC_VER || defined __BORLANDC__
- typedef __int64 int64;
- typedef unsigned __int64 uint64;
- # define CV_BIG_INT(n) n##I64
- # define CV_BIG_UINT(n) n##UI64
- #else
- typedef int64_t int64;
- typedef uint64_t uint64;
- # define CV_BIG_INT(n) n##LL
- # define CV_BIG_UINT(n) n##ULL
- #endif
- /* fundamental constants */
- #define CV_PI 3.1415926535897932384626433832795
- #define CV_2PI 6.283185307179586476925286766559
- #define CV_LOG2 0.69314718055994530941723212145818
- typedef union Cv32suf
- {
- int i;
- unsigned u;
- float f;
- }
- Cv32suf;
- typedef union Cv64suf
- {
- int64 i;
- uint64 u;
- double f;
- }
- Cv64suf;
- /****************************************************************************************\
- * fast math *
- \****************************************************************************************/
- #if defined __BORLANDC__
- # include <fastmath.h>
- #elif defined __cplusplus
- # include <cmath>
- #else
- # include <math.h>
- #endif
- #ifdef HAVE_TEGRA_OPTIMIZATION
- # include "tegra_round.hpp"
- #endif
- //! @addtogroup core_utils
- //! @{
- #if CV_VFP
- // 1. general scheme
- #define ARM_ROUND(_value, _asm_string) \
- int res; \
- float temp; \
- asm(_asm_string : [res] "=r" (res), [temp] "=w" (temp) : [value] "w" (_value)); \
- return res
- // 2. version for double
- #ifdef __clang__
- #define ARM_ROUND_DBL(value) ARM_ROUND(value, "vcvtr.s32.f64 %[temp], %[value] \n vmov %[res], %[temp]")
- #else
- #define ARM_ROUND_DBL(value) ARM_ROUND(value, "vcvtr.s32.f64 %[temp], %P[value] \n vmov %[res], %[temp]")
- #endif
- // 3. version for float
- #define ARM_ROUND_FLT(value) ARM_ROUND(value, "vcvtr.s32.f32 %[temp], %[value]\n vmov %[res], %[temp]")
- #endif // CV_VFP
- /** @brief Rounds floating-point number to the nearest integer
- @param value floating-point number. If the value is outside of INT_MIN ... INT_MAX range, the
- result is not defined.
- */
- CV_INLINE int
- cvRound( double value )
- {
- #if ((defined _MSC_VER && defined _M_X64) || (defined __GNUC__ && defined __x86_64__ \
- && defined __SSE2__ && !defined __APPLE__)) && !defined(__CUDACC__)
- __m128d t = _mm_set_sd( value );
- return _mm_cvtsd_si32(t);
- #elif defined _MSC_VER && defined _M_IX86
- int t;
- __asm
- {
- fld value;
- fistp t;
- }
- return t;
- #elif ((defined _MSC_VER && defined _M_ARM) || defined CV_ICC || \
- defined __GNUC__) && defined HAVE_TEGRA_OPTIMIZATION
- TEGRA_ROUND_DBL(value);
- #elif defined CV_ICC || defined __GNUC__
- # if CV_VFP
- ARM_ROUND_DBL(value);
- # else
- return (int)lrint(value);
- # endif
- #else
- /* it's ok if round does not comply with IEEE754 standard;
- the tests should allow +/-1 difference when the tested functions use round */
- return (int)(value + (value >= 0 ? 0.5 : -0.5));
- #endif
- }
- /** @brief Rounds floating-point number to the nearest integer not larger than the original.
- The function computes an integer i such that:
- \f[i \le \texttt{value} < i+1\f]
- @param value floating-point number. If the value is outside of INT_MIN ... INT_MAX range, the
- result is not defined.
- */
- CV_INLINE int cvFloor( double value )
- {
- #if (defined _MSC_VER && defined _M_X64 || (defined __GNUC__ && defined __SSE2__ && !defined __APPLE__)) && !defined(__CUDACC__)
- __m128d t = _mm_set_sd( value );
- int i = _mm_cvtsd_si32(t);
- return i - _mm_movemask_pd(_mm_cmplt_sd(t, _mm_cvtsi32_sd(t,i)));
- #elif defined __GNUC__
- int i = (int)value;
- return i - (i > value);
- #else
- int i = cvRound(value);
- float diff = (float)(value - i);
- return i - (diff < 0);
- #endif
- }
- /** @brief Rounds floating-point number to the nearest integer not larger than the original.
- The function computes an integer i such that:
- \f[i \le \texttt{value} < i+1\f]
- @param value floating-point number. If the value is outside of INT_MIN ... INT_MAX range, the
- result is not defined.
- */
- CV_INLINE int cvCeil( double value )
- {
- #if (defined _MSC_VER && defined _M_X64 || (defined __GNUC__ && defined __SSE2__&& !defined __APPLE__)) && !defined(__CUDACC__)
- __m128d t = _mm_set_sd( value );
- int i = _mm_cvtsd_si32(t);
- return i + _mm_movemask_pd(_mm_cmplt_sd(_mm_cvtsi32_sd(t,i), t));
- #elif defined __GNUC__
- int i = (int)value;
- return i + (i < value);
- #else
- int i = cvRound(value);
- float diff = (float)(i - value);
- return i + (diff < 0);
- #endif
- }
- /** @brief Determines if the argument is Not A Number.
- @param value The input floating-point value
- The function returns 1 if the argument is Not A Number (as defined by IEEE754 standard), 0
- otherwise. */
- CV_INLINE int cvIsNaN( double value )
- {
- Cv64suf ieee754;
- ieee754.f = value;
- return ((unsigned)(ieee754.u >> 32) & 0x7fffffff) +
- ((unsigned)ieee754.u != 0) > 0x7ff00000;
- }
- /** @brief Determines if the argument is Infinity.
- @param value The input floating-point value
- The function returns 1 if the argument is a plus or minus infinity (as defined by IEEE754 standard)
- and 0 otherwise. */
- CV_INLINE int cvIsInf( double value )
- {
- Cv64suf ieee754;
- ieee754.f = value;
- return ((unsigned)(ieee754.u >> 32) & 0x7fffffff) == 0x7ff00000 &&
- (unsigned)ieee754.u == 0;
- }
- #ifdef __cplusplus
- /** @overload */
- CV_INLINE int cvRound(float value)
- {
- #if ((defined _MSC_VER && defined _M_X64) || (defined __GNUC__ && defined __x86_64__ && \
- defined __SSE2__ && !defined __APPLE__)) && !defined(__CUDACC__)
- __m128 t = _mm_set_ss( value );
- return _mm_cvtss_si32(t);
- #elif defined _MSC_VER && defined _M_IX86
- int t;
- __asm
- {
- fld value;
- fistp t;
- }
- return t;
- #elif ((defined _MSC_VER && defined _M_ARM) || defined CV_ICC || \
- defined __GNUC__) && defined HAVE_TEGRA_OPTIMIZATION
- TEGRA_ROUND_FLT(value);
- #elif defined CV_ICC || defined __GNUC__
- # if CV_VFP
- ARM_ROUND_FLT(value);
- # else
- return (int)lrintf(value);
- # endif
- #else
- /* it's ok if round does not comply with IEEE754 standard;
- the tests should allow +/-1 difference when the tested functions use round */
- return (int)(value + (value >= 0 ? 0.5f : -0.5f));
- #endif
- }
- /** @overload */
- CV_INLINE int cvRound( int value )
- {
- return value;
- }
- /** @overload */
- CV_INLINE int cvFloor( float value )
- {
- #if (defined _MSC_VER && defined _M_X64 || (defined __GNUC__ && defined __SSE2__ && !defined __APPLE__)) && !defined(__CUDACC__)
- __m128 t = _mm_set_ss( value );
- int i = _mm_cvtss_si32(t);
- return i - _mm_movemask_ps(_mm_cmplt_ss(t, _mm_cvtsi32_ss(t,i)));
- #elif defined __GNUC__
- int i = (int)value;
- return i - (i > value);
- #else
- int i = cvRound(value);
- float diff = (float)(value - i);
- return i - (diff < 0);
- #endif
- }
- /** @overload */
- CV_INLINE int cvFloor( int value )
- {
- return value;
- }
- /** @overload */
- CV_INLINE int cvCeil( float value )
- {
- #if (defined _MSC_VER && defined _M_X64 || (defined __GNUC__ && defined __SSE2__&& !defined __APPLE__)) && !defined(__CUDACC__)
- __m128 t = _mm_set_ss( value );
- int i = _mm_cvtss_si32(t);
- return i + _mm_movemask_ps(_mm_cmplt_ss(_mm_cvtsi32_ss(t,i), t));
- #elif defined __GNUC__
- int i = (int)value;
- return i + (i < value);
- #else
- int i = cvRound(value);
- float diff = (float)(i - value);
- return i + (diff < 0);
- #endif
- }
- /** @overload */
- CV_INLINE int cvCeil( int value )
- {
- return value;
- }
- /** @overload */
- CV_INLINE int cvIsNaN( float value )
- {
- Cv32suf ieee754;
- ieee754.f = value;
- return (ieee754.u & 0x7fffffff) > 0x7f800000;
- }
- /** @overload */
- CV_INLINE int cvIsInf( float value )
- {
- Cv32suf ieee754;
- ieee754.f = value;
- return (ieee754.u & 0x7fffffff) == 0x7f800000;
- }
- #include <algorithm>
- namespace cv
- {
- /////////////// saturate_cast (used in image & signal processing) ///////////////////
- /**
- Template function for accurate conversion from one primitive type to another.
- The functions saturate_cast resemble the standard C++ cast operations, such as static_cast\<T\>()
- and others. They perform an efficient and accurate conversion from one primitive type to another
- (see the introduction chapter). saturate in the name means that when the input value v is out of the
- range of the target type, the result is not formed just by taking low bits of the input, but instead
- the value is clipped. For example:
- @code
- uchar a = saturate_cast<uchar>(-100); // a = 0 (UCHAR_MIN)
- short b = saturate_cast<short>(33333.33333); // b = 32767 (SHRT_MAX)
- @endcode
- Such clipping is done when the target type is unsigned char , signed char , unsigned short or
- signed short . For 32-bit integers, no clipping is done.
- When the parameter is a floating-point value and the target type is an integer (8-, 16- or 32-bit),
- the floating-point value is first rounded to the nearest integer and then clipped if needed (when
- the target type is 8- or 16-bit).
- This operation is used in the simplest or most complex image processing functions in OpenCV.
- @param v Function parameter.
- @sa add, subtract, multiply, divide, Mat::convertTo
- */
- template<typename _Tp> static inline _Tp saturate_cast(uchar v) { return _Tp(v); }
- /** @overload */
- template<typename _Tp> static inline _Tp saturate_cast(schar v) { return _Tp(v); }
- /** @overload */
- template<typename _Tp> static inline _Tp saturate_cast(ushort v) { return _Tp(v); }
- /** @overload */
- template<typename _Tp> static inline _Tp saturate_cast(short v) { return _Tp(v); }
- /** @overload */
- template<typename _Tp> static inline _Tp saturate_cast(unsigned v) { return _Tp(v); }
- /** @overload */
- template<typename _Tp> static inline _Tp saturate_cast(int v) { return _Tp(v); }
- /** @overload */
- template<typename _Tp> static inline _Tp saturate_cast(float v) { return _Tp(v); }
- /** @overload */
- template<typename _Tp> static inline _Tp saturate_cast(double v) { return _Tp(v); }
- /** @overload */
- template<typename _Tp> static inline _Tp saturate_cast(int64 v) { return _Tp(v); }
- /** @overload */
- template<typename _Tp> static inline _Tp saturate_cast(uint64 v) { return _Tp(v); }
- //! @cond IGNORED
- template<> inline uchar saturate_cast<uchar>(schar v) { return (uchar)std::max((int)v, 0); }
- template<> inline uchar saturate_cast<uchar>(ushort v) { return (uchar)std::min((unsigned)v, (unsigned)UCHAR_MAX); }
- template<> inline uchar saturate_cast<uchar>(int v) { return (uchar)((unsigned)v <= UCHAR_MAX ? v : v > 0 ? UCHAR_MAX : 0); }
- template<> inline uchar saturate_cast<uchar>(short v) { return saturate_cast<uchar>((int)v); }
- template<> inline uchar saturate_cast<uchar>(unsigned v) { return (uchar)std::min(v, (unsigned)UCHAR_MAX); }
- template<> inline uchar saturate_cast<uchar>(float v) { int iv = cvRound(v); return saturate_cast<uchar>(iv); }
- template<> inline uchar saturate_cast<uchar>(double v) { int iv = cvRound(v); return saturate_cast<uchar>(iv); }
- template<> inline uchar saturate_cast<uchar>(int64 v) { return (uchar)((uint64)v <= (uint64)UCHAR_MAX ? v : v > 0 ? UCHAR_MAX : 0); }
- template<> inline uchar saturate_cast<uchar>(uint64 v) { return (uchar)std::min(v, (uint64)UCHAR_MAX); }
- template<> inline schar saturate_cast<schar>(uchar v) { return (schar)std::min((int)v, SCHAR_MAX); }
- template<> inline schar saturate_cast<schar>(ushort v) { return (schar)std::min((unsigned)v, (unsigned)SCHAR_MAX); }
- template<> inline schar saturate_cast<schar>(int v) { return (schar)((unsigned)(v-SCHAR_MIN) <= (unsigned)UCHAR_MAX ? v : v > 0 ? SCHAR_MAX : SCHAR_MIN); }
- template<> inline schar saturate_cast<schar>(short v) { return saturate_cast<schar>((int)v); }
- template<> inline schar saturate_cast<schar>(unsigned v) { return (schar)std::min(v, (unsigned)SCHAR_MAX); }
- template<> inline schar saturate_cast<schar>(float v) { int iv = cvRound(v); return saturate_cast<schar>(iv); }
- template<> inline schar saturate_cast<schar>(double v) { int iv = cvRound(v); return saturate_cast<schar>(iv); }
- template<> inline schar saturate_cast<schar>(int64 v) { return (schar)((uint64)((int64)v-SCHAR_MIN) <= (uint64)UCHAR_MAX ? v : v > 0 ? SCHAR_MAX : SCHAR_MIN); }
- template<> inline schar saturate_cast<schar>(uint64 v) { return (schar)std::min(v, (uint64)SCHAR_MAX); }
- template<> inline ushort saturate_cast<ushort>(schar v) { return (ushort)std::max((int)v, 0); }
- template<> inline ushort saturate_cast<ushort>(short v) { return (ushort)std::max((int)v, 0); }
- template<> inline ushort saturate_cast<ushort>(int v) { return (ushort)((unsigned)v <= (unsigned)USHRT_MAX ? v : v > 0 ? USHRT_MAX : 0); }
- template<> inline ushort saturate_cast<ushort>(unsigned v) { return (ushort)std::min(v, (unsigned)USHRT_MAX); }
- template<> inline ushort saturate_cast<ushort>(float v) { int iv = cvRound(v); return saturate_cast<ushort>(iv); }
- template<> inline ushort saturate_cast<ushort>(double v) { int iv = cvRound(v); return saturate_cast<ushort>(iv); }
- template<> inline ushort saturate_cast<ushort>(int64 v) { return (ushort)((uint64)v <= (uint64)USHRT_MAX ? v : v > 0 ? USHRT_MAX : 0); }
- template<> inline ushort saturate_cast<ushort>(uint64 v) { return (ushort)std::min(v, (uint64)USHRT_MAX); }
- template<> inline short saturate_cast<short>(ushort v) { return (short)std::min((int)v, SHRT_MAX); }
- template<> inline short saturate_cast<short>(int v) { return (short)((unsigned)(v - SHRT_MIN) <= (unsigned)USHRT_MAX ? v : v > 0 ? SHRT_MAX : SHRT_MIN); }
- template<> inline short saturate_cast<short>(unsigned v) { return (short)std::min(v, (unsigned)SHRT_MAX); }
- template<> inline short saturate_cast<short>(float v) { int iv = cvRound(v); return saturate_cast<short>(iv); }
- template<> inline short saturate_cast<short>(double v) { int iv = cvRound(v); return saturate_cast<short>(iv); }
- template<> inline short saturate_cast<short>(int64 v) { return (short)((uint64)((int64)v - SHRT_MIN) <= (uint64)USHRT_MAX ? v : v > 0 ? SHRT_MAX : SHRT_MIN); }
- template<> inline short saturate_cast<short>(uint64 v) { return (short)std::min(v, (uint64)SHRT_MAX); }
- template<> inline int saturate_cast<int>(float v) { return cvRound(v); }
- template<> inline int saturate_cast<int>(double v) { return cvRound(v); }
- // we intentionally do not clip negative numbers, to make -1 become 0xffffffff etc.
- template<> inline unsigned saturate_cast<unsigned>(float v) { return cvRound(v); }
- template<> inline unsigned saturate_cast<unsigned>(double v) { return cvRound(v); }
- //! @endcond
- }
- #endif // __cplusplus
- //! @} core_utils
- #endif //__OPENCV_HAL_H__
|