OpenCV学习笔记——saturate_cast

#ifndef OPENCV_CORE_SATURATE_HPP
#define OPENCV_CORE_SATURATE_HPP

#include "opencv2/core/cvdef.h"
#include "opencv2/core/fast_math.hpp"

namespace cv
{

//! @addtogroup core_utils
//! @{

/////////////// saturate_cast (used in image & signal processing) ///////////////////

/** @brief Template function for accurate conversion from one primitive type to another.

 The function saturate_cast resembles the standard C++ cast operations, such as static_cast\()
 and others. It 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(-100); // a = 0 (UCHAR_MIN)
 short b = saturate_cast(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 static inline _Tp saturate_cast(uchar v)    { return _Tp(v); }
/** @overload */
template static inline _Tp saturate_cast(schar v)    { return _Tp(v); }
/** @overload */
template static inline _Tp saturate_cast(ushort v)   { return _Tp(v); }
/** @overload */
template static inline _Tp saturate_cast(short v)    { return _Tp(v); }
/** @overload */
template static inline _Tp saturate_cast(unsigned v) { return _Tp(v); }
/** @overload */
template static inline _Tp saturate_cast(int v)      { return _Tp(v); }
/** @overload */
template static inline _Tp saturate_cast(float v)    { return _Tp(v); }
/** @overload */
template static inline _Tp saturate_cast(double v)   { return _Tp(v); }
/** @overload */
template static inline _Tp saturate_cast(int64 v)    { return _Tp(v); }
/** @overload */
template static inline _Tp saturate_cast(uint64 v)   { return _Tp(v); }

template<> inline uchar saturate_cast(schar v)        { return (uchar)std::max((int)v, 0); }
template<> inline uchar saturate_cast(ushort v)       { return (uchar)std::min((unsigned)v, (unsigned)UCHAR_MAX); }
template<> inline uchar saturate_cast(int v)          { return (uchar)((unsigned)v <= UCHAR_MAX ? v : v > 0 ? UCHAR_MAX : 0); }
template<> inline uchar saturate_cast(short v)        { return saturate_cast((int)v); }
template<> inline uchar saturate_cast(unsigned v)     { return (uchar)std::min(v, (unsigned)UCHAR_MAX); }
template<> inline uchar saturate_cast(float v)        { int iv = cvRound(v); return saturate_cast(iv); }
template<> inline uchar saturate_cast(double v)       { int iv = cvRound(v); return saturate_cast(iv); }
template<> inline uchar saturate_cast(int64 v)        { return (uchar)((uint64)v <= (uint64)UCHAR_MAX ? v : v > 0 ? UCHAR_MAX : 0); }
template<> inline uchar saturate_cast(uint64 v)       { return (uchar)std::min(v, (uint64)UCHAR_MAX); }

template<> inline schar saturate_cast(uchar v)        { return (schar)std::min((int)v, SCHAR_MAX); }
template<> inline schar saturate_cast(ushort v)       { return (schar)std::min((unsigned)v, (unsigned)SCHAR_MAX); }
template<> inline schar saturate_cast(int v)          { return (schar)((unsigned)(v-SCHAR_MIN) <= (unsigned)UCHAR_MAX ? v : v > 0 ? SCHAR_MAX : SCHAR_MIN); }
template<> inline schar saturate_cast(short v)        { return saturate_cast((int)v); }
template<> inline schar saturate_cast(unsigned v)     { return (schar)std::min(v, (unsigned)SCHAR_MAX); }
template<> inline schar saturate_cast(float v)        { int iv = cvRound(v); return saturate_cast(iv); }
template<> inline schar saturate_cast(double v)       { int iv = cvRound(v); return saturate_cast(iv); }
template<> inline schar saturate_cast(int64 v)        { return (schar)((uint64)((int64)v-SCHAR_MIN) <= (uint64)UCHAR_MAX ? v : v > 0 ? SCHAR_MAX : SCHAR_MIN); }
template<> inline schar saturate_cast(uint64 v)       { return (schar)std::min(v, (uint64)SCHAR_MAX); }

template<> inline ushort saturate_cast(schar v)      { return (ushort)std::max((int)v, 0); }
template<> inline ushort saturate_cast(short v)      { return (ushort)std::max((int)v, 0); }
template<> inline ushort saturate_cast(int v)        { return (ushort)((unsigned)v <= (unsigned)USHRT_MAX ? v : v > 0 ? USHRT_MAX : 0); }
template<> inline ushort saturate_cast(unsigned v)   { return (ushort)std::min(v, (unsigned)USHRT_MAX); }
template<> inline ushort saturate_cast(float v)      { int iv = cvRound(v); return saturate_cast(iv); }
template<> inline ushort saturate_cast(double v)     { int iv = cvRound(v); return saturate_cast(iv); }
template<> inline ushort saturate_cast(int64 v)      { return (ushort)((uint64)v <= (uint64)USHRT_MAX ? v : v > 0 ? USHRT_MAX : 0); }
template<> inline ushort saturate_cast(uint64 v)     { return (ushort)std::min(v, (uint64)USHRT_MAX); }

template<> inline short saturate_cast(ushort v)       { return (short)std::min((int)v, SHRT_MAX); }
template<> inline short saturate_cast(int v)          { return (short)((unsigned)(v - SHRT_MIN) <= (unsigned)USHRT_MAX ? v : v > 0 ? SHRT_MAX : SHRT_MIN); }
template<> inline short saturate_cast(unsigned v)     { return (short)std::min(v, (unsigned)SHRT_MAX); }
template<> inline short saturate_cast(float v)        { int iv = cvRound(v); return saturate_cast(iv); }
template<> inline short saturate_cast(double v)       { int iv = cvRound(v); return saturate_cast(iv); }
template<> inline short saturate_cast(int64 v)        { return (short)((uint64)((int64)v - SHRT_MIN) <= (uint64)USHRT_MAX ? v : v > 0 ? SHRT_MAX : SHRT_MIN); }
template<> inline short saturate_cast(uint64 v)       { return (short)std::min(v, (uint64)SHRT_MAX); }

template<> inline int saturate_cast(unsigned v)         { return (int)std::min(v, (unsigned)INT_MAX); }
template<> inline int saturate_cast(int64 v)            { return (int)((uint64)(v - INT_MIN) <= (uint64)UINT_MAX ? v : v > 0 ? INT_MAX : INT_MIN); }
template<> inline int saturate_cast(uint64 v)           { return (int)std::min(v, (uint64)INT_MAX); }
template<> inline int saturate_cast(float v)            { return cvRound(v); }
template<> inline int saturate_cast(double v)           { return cvRound(v); }

template<> inline unsigned saturate_cast(schar v)  { return (unsigned)std::max(v, (schar)0); }
template<> inline unsigned saturate_cast(short v)  { return (unsigned)std::max(v, (short)0); }
template<> inline unsigned saturate_cast(int v)    { return (unsigned)std::max(v, (int)0); }
template<> inline unsigned saturate_cast(int64 v)  { return (unsigned)((uint64)v <= (uint64)UINT_MAX ? v : v > 0 ? UINT_MAX : 0); }
template<> inline unsigned saturate_cast(uint64 v) { return (unsigned)std::min(v, (uint64)UINT_MAX); }
// we intentionally do not clip negative numbers, to make -1 become 0xffffffff etc.
template<> inline unsigned saturate_cast(float v)  { return static_cast(cvRound(v)); }
template<> inline unsigned saturate_cast(double v) { return static_cast(cvRound(v)); }

template<> inline uint64 saturate_cast(schar v)      { return (uint64)std::max(v, (schar)0); }
template<> inline uint64 saturate_cast(short v)      { return (uint64)std::max(v, (short)0); }
template<> inline uint64 saturate_cast(int v)        { return (uint64)std::max(v, (int)0); }
template<> inline uint64 saturate_cast(int64 v)      { return (uint64)std::max(v, (int64)0); }

template<> inline int64 saturate_cast(uint64 v)       { return (int64)std::min(v, (uint64)LLONG_MAX); }

//! @}

} // cv

#endif // OPENCV_CORE_SATURATE_HPP
b_dstImage.at(y, x)[c] = saturate_cast((b_nContrastValue*0.01)*(b_srcImage.at(y, x)[c]) + b_nBrightValue);

saturate_cast此处为溢出保护,此处相当于 在剪切数值

>255    赋值为255;

<0        赋值为0;



你可能感兴趣的:(OpenCV,C++)