mirror of https://github.com/opencv/opencv.git
commit
39783a6584
4 changed files with 6137 additions and 0 deletions
@ -0,0 +1,673 @@ |
||||
// This file is part of OpenCV project.
|
||||
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
||||
// of this distribution and at http://opencv.org/license.html
|
||||
|
||||
#include "opencv2/imgproc.hpp" |
||||
#include "opencv2/core/utility.hpp" |
||||
#include <limits> |
||||
#include "opencl_kernels_imgproc.hpp" |
||||
#include "hal_replacement.hpp" |
||||
#include "opencv2/core/hal/intrin.hpp" |
||||
#include "opencv2/core/softfloat.hpp" |
||||
|
||||
#define CV_DESCALE(x,n) (((x) + (1 << ((n)-1))) >> (n)) |
||||
|
||||
namespace cv |
||||
{ |
||||
|
||||
//constants for conversion from/to RGB and Gray, YUV, YCrCb according to BT.601
|
||||
const float B2YF = 0.114f; |
||||
const float G2YF = 0.587f; |
||||
const float R2YF = 0.299f; |
||||
|
||||
enum
|
||||
{ |
||||
yuv_shift = 14, |
||||
xyz_shift = 12, |
||||
R2Y = 4899, // == R2YF*16384
|
||||
G2Y = 9617, // == G2YF*16384
|
||||
B2Y = 1868, // == B2YF*16384
|
||||
BLOCK_SIZE = 256 |
||||
}; |
||||
|
||||
template<typename _Tp> struct ColorChannel |
||||
{ |
||||
typedef float worktype_f; |
||||
static _Tp max() { return std::numeric_limits<_Tp>::max(); } |
||||
static _Tp half() { return (_Tp)(max()/2 + 1); } |
||||
}; |
||||
|
||||
template<> struct ColorChannel<float> |
||||
{ |
||||
typedef float worktype_f; |
||||
static float max() { return 1.f; } |
||||
static float half() { return 0.5f; } |
||||
}; |
||||
|
||||
/*template<> struct ColorChannel<double>
|
||||
{ |
||||
typedef double worktype_f; |
||||
static double max() { return 1.; } |
||||
static double half() { return 0.5; } |
||||
};*/ |
||||
|
||||
//
|
||||
// Helper functions
|
||||
//
|
||||
|
||||
namespace { |
||||
|
||||
inline bool isHSV(int code) |
||||
{ |
||||
switch(code) |
||||
{ |
||||
case COLOR_HSV2BGR: case COLOR_HSV2RGB: case COLOR_HSV2BGR_FULL: case COLOR_HSV2RGB_FULL: |
||||
case COLOR_BGR2HSV: case COLOR_RGB2HSV: case COLOR_BGR2HSV_FULL: case COLOR_RGB2HSV_FULL: |
||||
return true; |
||||
default: |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
inline bool isLab(int code) |
||||
{ |
||||
switch (code) |
||||
{ |
||||
case COLOR_Lab2BGR: case COLOR_Lab2RGB: case COLOR_Lab2LBGR: case COLOR_Lab2LRGB: |
||||
case COLOR_BGR2Lab: case COLOR_RGB2Lab: case COLOR_LBGR2Lab: case COLOR_LRGB2Lab: |
||||
return true; |
||||
default: |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
inline bool is_sRGB(int code) |
||||
{ |
||||
switch (code) |
||||
{ |
||||
case COLOR_BGR2Lab: case COLOR_RGB2Lab: case COLOR_BGR2Luv: case COLOR_RGB2Luv: |
||||
case COLOR_Lab2BGR: case COLOR_Lab2RGB: case COLOR_Luv2BGR: case COLOR_Luv2RGB: |
||||
return true; |
||||
default: |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
inline bool swapBlue(int code) |
||||
{ |
||||
switch (code) |
||||
{ |
||||
case COLOR_BGR2BGRA: case COLOR_BGRA2BGR: |
||||
case COLOR_BGR2BGR565: case COLOR_BGR2BGR555: case COLOR_BGRA2BGR565: case COLOR_BGRA2BGR555: |
||||
case COLOR_BGR5652BGR: case COLOR_BGR5552BGR: case COLOR_BGR5652BGRA: case COLOR_BGR5552BGRA: |
||||
case COLOR_BGR2GRAY: case COLOR_BGRA2GRAY: |
||||
case COLOR_BGR2YCrCb: case COLOR_BGR2YUV: |
||||
case COLOR_YCrCb2BGR: case COLOR_YUV2BGR: |
||||
case COLOR_BGR2XYZ: case COLOR_XYZ2BGR: |
||||
case COLOR_BGR2HSV: case COLOR_BGR2HLS: case COLOR_BGR2HSV_FULL: case COLOR_BGR2HLS_FULL: |
||||
case COLOR_YUV2BGR_YV12: case COLOR_YUV2BGRA_YV12: case COLOR_YUV2BGR_IYUV: case COLOR_YUV2BGRA_IYUV: |
||||
case COLOR_YUV2BGR_NV21: case COLOR_YUV2BGRA_NV21: case COLOR_YUV2BGR_NV12: case COLOR_YUV2BGRA_NV12: |
||||
case COLOR_Lab2BGR: case COLOR_Luv2BGR: case COLOR_Lab2LBGR: case COLOR_Luv2LBGR: |
||||
case COLOR_BGR2Lab: case COLOR_BGR2Luv: case COLOR_LBGR2Lab: case COLOR_LBGR2Luv: |
||||
case COLOR_HSV2BGR: case COLOR_HLS2BGR: case COLOR_HSV2BGR_FULL: case COLOR_HLS2BGR_FULL: |
||||
case COLOR_YUV2BGR_UYVY: case COLOR_YUV2BGRA_UYVY: case COLOR_YUV2BGR_YUY2: |
||||
case COLOR_YUV2BGRA_YUY2: case COLOR_YUV2BGR_YVYU: case COLOR_YUV2BGRA_YVYU: |
||||
case COLOR_BGR2YUV_IYUV: case COLOR_BGRA2YUV_IYUV: case COLOR_BGR2YUV_YV12: case COLOR_BGRA2YUV_YV12: |
||||
return false; |
||||
default: |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
inline bool isFullRangeHSV(int code) |
||||
{ |
||||
switch (code) |
||||
{ |
||||
case COLOR_BGR2HSV_FULL: case COLOR_RGB2HSV_FULL: case COLOR_BGR2HLS_FULL: case COLOR_RGB2HLS_FULL: |
||||
case COLOR_HSV2BGR_FULL: case COLOR_HSV2RGB_FULL: case COLOR_HLS2BGR_FULL: case COLOR_HLS2RGB_FULL: |
||||
return true; |
||||
default: |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
inline int dstChannels(int code) |
||||
{ |
||||
switch( code ) |
||||
{ |
||||
case COLOR_BGR2BGRA: case COLOR_RGB2BGRA: case COLOR_BGRA2RGBA: |
||||
case COLOR_BGR5652BGRA: case COLOR_BGR5552BGRA: case COLOR_BGR5652RGBA: case COLOR_BGR5552RGBA: |
||||
case COLOR_GRAY2BGRA: |
||||
case COLOR_YUV2BGRA_NV21: case COLOR_YUV2RGBA_NV21: case COLOR_YUV2BGRA_NV12: case COLOR_YUV2RGBA_NV12: |
||||
case COLOR_YUV2BGRA_YV12: case COLOR_YUV2RGBA_YV12: case COLOR_YUV2BGRA_IYUV: case COLOR_YUV2RGBA_IYUV: |
||||
case COLOR_YUV2RGBA_UYVY: case COLOR_YUV2BGRA_UYVY: case COLOR_YUV2RGBA_YVYU: case COLOR_YUV2BGRA_YVYU: |
||||
case COLOR_YUV2RGBA_YUY2: case COLOR_YUV2BGRA_YUY2: |
||||
|
||||
return 4; |
||||
|
||||
case COLOR_BGRA2BGR: case COLOR_RGBA2BGR: case COLOR_RGB2BGR: |
||||
case COLOR_BGR5652BGR: case COLOR_BGR5552BGR: case COLOR_BGR5652RGB: case COLOR_BGR5552RGB: |
||||
case COLOR_GRAY2BGR: |
||||
case COLOR_YUV2BGR_NV21: case COLOR_YUV2RGB_NV21: case COLOR_YUV2BGR_NV12: case COLOR_YUV2RGB_NV12: |
||||
case COLOR_YUV2BGR_YV12: case COLOR_YUV2RGB_YV12: case COLOR_YUV2BGR_IYUV: case COLOR_YUV2RGB_IYUV: |
||||
case COLOR_YUV2RGB_UYVY: case COLOR_YUV2BGR_UYVY: case COLOR_YUV2RGB_YVYU: case COLOR_YUV2BGR_YVYU: |
||||
case COLOR_YUV2RGB_YUY2: case COLOR_YUV2BGR_YUY2: |
||||
|
||||
return 3; |
||||
|
||||
default: |
||||
return 0; |
||||
} |
||||
} |
||||
|
||||
inline int greenBits(int code) |
||||
{ |
||||
switch( code ) |
||||
{ |
||||
case COLOR_BGR2BGR565: case COLOR_RGB2BGR565: case COLOR_BGRA2BGR565: case COLOR_RGBA2BGR565: |
||||
case COLOR_BGR5652BGR: case COLOR_BGR5652RGB: case COLOR_BGR5652BGRA: case COLOR_BGR5652RGBA: |
||||
case COLOR_BGR5652GRAY: case COLOR_GRAY2BGR565: |
||||
|
||||
return 6; |
||||
|
||||
case COLOR_BGR2BGR555: case COLOR_RGB2BGR555: case COLOR_BGRA2BGR555: case COLOR_RGBA2BGR555: |
||||
case COLOR_BGR5552BGR: case COLOR_BGR5552RGB: case COLOR_BGR5552BGRA: case COLOR_BGR5552RGBA: |
||||
case COLOR_BGR5552GRAY: case COLOR_GRAY2BGR555: |
||||
|
||||
return 5; |
||||
|
||||
default: |
||||
return 0; |
||||
} |
||||
} |
||||
|
||||
inline int uIndex(int code) |
||||
{ |
||||
switch( code ) |
||||
{ |
||||
case COLOR_RGB2YUV_YV12: case COLOR_BGR2YUV_YV12: case COLOR_RGBA2YUV_YV12: case COLOR_BGRA2YUV_YV12: |
||||
|
||||
return 2; |
||||
|
||||
case COLOR_YUV2RGB_YVYU: case COLOR_YUV2BGR_YVYU: case COLOR_YUV2RGBA_YVYU: case COLOR_YUV2BGRA_YVYU: |
||||
case COLOR_RGB2YUV_IYUV: case COLOR_BGR2YUV_IYUV: case COLOR_RGBA2YUV_IYUV: case COLOR_BGRA2YUV_IYUV: |
||||
case COLOR_YUV2BGR_NV21: case COLOR_YUV2RGB_NV21: case COLOR_YUV2BGRA_NV21: case COLOR_YUV2RGBA_NV21: |
||||
case COLOR_YUV2BGR_YV12: case COLOR_YUV2RGB_YV12: case COLOR_YUV2BGRA_YV12: case COLOR_YUV2RGBA_YV12: |
||||
|
||||
return 1; |
||||
|
||||
case COLOR_YUV2BGR_NV12: case COLOR_YUV2RGB_NV12: case COLOR_YUV2BGRA_NV12: case COLOR_YUV2RGBA_NV12: |
||||
case COLOR_YUV2BGR_IYUV: case COLOR_YUV2RGB_IYUV: case COLOR_YUV2BGRA_IYUV: case COLOR_YUV2RGBA_IYUV: |
||||
case COLOR_YUV2RGB_UYVY: case COLOR_YUV2BGR_UYVY: case COLOR_YUV2RGBA_UYVY: case COLOR_YUV2BGRA_UYVY: |
||||
case COLOR_YUV2RGB_YUY2: case COLOR_YUV2BGR_YUY2: case COLOR_YUV2RGBA_YUY2: case COLOR_YUV2BGRA_YUY2: |
||||
|
||||
return 0; |
||||
|
||||
default: |
||||
return -1; |
||||
} |
||||
} |
||||
|
||||
} // namespace::
|
||||
|
||||
template<int i0, int i1 = -1, int i2 = -1> |
||||
struct Set |
||||
{ |
||||
static bool contains(int i) |
||||
{ |
||||
return (i == i0 || i == i1 || i == i2); |
||||
} |
||||
}; |
||||
|
||||
template<int i0, int i1> |
||||
struct Set<i0, i1, -1> |
||||
{ |
||||
static bool contains(int i) |
||||
{ |
||||
return (i == i0 || i == i1); |
||||
} |
||||
}; |
||||
|
||||
template<int i0> |
||||
struct Set<i0, -1, -1> |
||||
{ |
||||
static bool contains(int i) |
||||
{ |
||||
return (i == i0); |
||||
} |
||||
}; |
||||
|
||||
enum SizePolicy |
||||
{ |
||||
TO_YUV, FROM_YUV, NONE |
||||
}; |
||||
|
||||
template< typename VScn, typename VDcn, typename VDepth, SizePolicy sizePolicy = NONE > |
||||
struct CvtHelper |
||||
{ |
||||
CvtHelper(InputArray _src, OutputArray _dst, int dcn) |
||||
{ |
||||
CV_Assert(!_src.empty()); |
||||
|
||||
int stype = _src.type(); |
||||
scn = CV_MAT_CN(stype), depth = CV_MAT_DEPTH(stype); |
||||
|
||||
CV_Check(scn, VScn::contains(scn), "Invalid number of channels in input image"); |
||||
CV_Check(dcn, VDcn::contains(dcn), "Invalid number of channels in output image"); |
||||
CV_CheckDepth(depth, VDepth::contains(depth), "Unsupported depth of input image"); |
||||
|
||||
if (_src.getObj() == _dst.getObj()) // inplace processing (#6653)
|
||||
_src.copyTo(src); |
||||
else |
||||
src = _src.getMat(); |
||||
Size sz = src.size(); |
||||
switch (sizePolicy) |
||||
{ |
||||
case TO_YUV: |
||||
CV_Assert( sz.width % 2 == 0 && sz.height % 2 == 0); |
||||
dstSz = Size(sz.width, sz.height / 2 * 3); |
||||
break; |
||||
case FROM_YUV: |
||||
CV_Assert( sz.width % 2 == 0 && sz.height % 3 == 0); |
||||
dstSz = Size(sz.width, sz.height * 2 / 3); |
||||
break; |
||||
case NONE: |
||||
default: |
||||
dstSz = sz; |
||||
break; |
||||
} |
||||
_dst.create(dstSz, CV_MAKETYPE(depth, dcn)); |
||||
dst = _dst.getMat(); |
||||
} |
||||
Mat src, dst; |
||||
int depth, scn; |
||||
Size dstSz; |
||||
}; |
||||
|
||||
#ifdef HAVE_OPENCL |
||||
|
||||
template< typename VScn, typename VDcn, typename VDepth, SizePolicy sizePolicy = NONE > |
||||
struct OclHelper |
||||
{ |
||||
OclHelper( InputArray _src, OutputArray _dst, int dcn) : |
||||
nArgs(0) |
||||
{ |
||||
src = _src.getUMat(); |
||||
Size sz = src.size(), dstSz; |
||||
int scn = src.channels(); |
||||
int depth = src.depth(); |
||||
|
||||
CV_Assert( VScn::contains(scn) && VDcn::contains(dcn) && VDepth::contains(depth) ); |
||||
switch (sizePolicy) |
||||
{ |
||||
case TO_YUV: |
||||
CV_Assert( sz.width % 2 == 0 && sz.height % 2 == 0 ); |
||||
dstSz = Size(sz.width, sz.height / 2 * 3); |
||||
break; |
||||
case FROM_YUV: |
||||
CV_Assert( sz.width % 2 == 0 && sz.height % 3 == 0 ); |
||||
dstSz = Size(sz.width, sz.height * 2 / 3); |
||||
break; |
||||
case NONE: |
||||
default: |
||||
dstSz = sz; |
||||
break; |
||||
} |
||||
|
||||
_dst.create(dstSz, CV_MAKETYPE(depth, dcn)); |
||||
dst = _dst.getUMat(); |
||||
} |
||||
|
||||
bool createKernel(cv::String name, ocl::ProgramSource& source, cv::String options) |
||||
{ |
||||
ocl::Device dev = ocl::Device::getDefault(); |
||||
int pxPerWIy = dev.isIntel() && (dev.type() & ocl::Device::TYPE_GPU) ? 4 : 1; |
||||
int pxPerWIx = 1; |
||||
|
||||
cv::String baseOptions = format("-D depth=%d -D scn=%d -D PIX_PER_WI_Y=%d ", |
||||
src.depth(), src.channels(), pxPerWIy); |
||||
|
||||
switch (sizePolicy) |
||||
{ |
||||
case TO_YUV: |
||||
if (dev.isIntel() && |
||||
src.cols % 4 == 0 && src.step % 4 == 0 && src.offset % 4 == 0 && |
||||
dst.step % 4 == 0 && dst.offset % 4 == 0) |
||||
{ |
||||
pxPerWIx = 2; |
||||
} |
||||
globalSize[0] = (size_t)dst.cols/(2*pxPerWIx); |
||||
globalSize[1] = ((size_t)dst.rows/3 + pxPerWIy - 1) / pxPerWIy; |
||||
baseOptions += format("-D PIX_PER_WI_X=%d ", pxPerWIx); |
||||
break; |
||||
case FROM_YUV: |
||||
globalSize[0] = (size_t)dst.cols/2; |
||||
globalSize[1] = ((size_t)dst.rows/2 + pxPerWIy - 1) / pxPerWIy; |
||||
break; |
||||
case NONE: |
||||
default: |
||||
globalSize[0] = (size_t)src.cols; |
||||
globalSize[1] = ((size_t)src.rows + pxPerWIy - 1) / pxPerWIy; |
||||
break; |
||||
} |
||||
|
||||
k.create(name.c_str(), source, baseOptions + options); |
||||
|
||||
if(k.empty()) |
||||
return false; |
||||
|
||||
nArgs = k.set(0, ocl::KernelArg::ReadOnlyNoSize(src)); |
||||
nArgs = k.set(nArgs, ocl::KernelArg::WriteOnly(dst)); |
||||
return true; |
||||
} |
||||
|
||||
bool run() |
||||
{ |
||||
return k.run(2, globalSize, NULL, false); |
||||
} |
||||
|
||||
template<typename T> |
||||
void setArg(const T& arg) |
||||
{ |
||||
nArgs = k.set(nArgs, arg); |
||||
} |
||||
|
||||
UMat src, dst; |
||||
ocl::Kernel k; |
||||
size_t globalSize[2]; |
||||
int nArgs; |
||||
}; |
||||
|
||||
#endif |
||||
|
||||
///////////////////////////// Top-level template function ////////////////////////////////
|
||||
|
||||
template <typename Cvt> |
||||
class CvtColorLoop_Invoker : public ParallelLoopBody |
||||
{ |
||||
typedef typename Cvt::channel_type _Tp; |
||||
public: |
||||
|
||||
CvtColorLoop_Invoker(const uchar * src_data_, size_t src_step_, uchar * dst_data_, size_t dst_step_, int width_, const Cvt& _cvt) : |
||||
ParallelLoopBody(), src_data(src_data_), src_step(src_step_), dst_data(dst_data_), dst_step(dst_step_), |
||||
width(width_), cvt(_cvt) |
||||
{ |
||||
} |
||||
|
||||
virtual void operator()(const Range& range) const CV_OVERRIDE |
||||
{ |
||||
CV_TRACE_FUNCTION(); |
||||
|
||||
const uchar* yS = src_data + static_cast<size_t>(range.start) * src_step; |
||||
uchar* yD = dst_data + static_cast<size_t>(range.start) * dst_step; |
||||
|
||||
for( int i = range.start; i < range.end; ++i, yS += src_step, yD += dst_step ) |
||||
cvt(reinterpret_cast<const _Tp*>(yS), reinterpret_cast<_Tp*>(yD), width); |
||||
} |
||||
|
||||
private: |
||||
const uchar * src_data; |
||||
const size_t src_step; |
||||
uchar * dst_data; |
||||
const size_t dst_step; |
||||
const int width; |
||||
const Cvt& cvt; |
||||
|
||||
const CvtColorLoop_Invoker& operator= (const CvtColorLoop_Invoker&); |
||||
}; |
||||
|
||||
template <typename Cvt> |
||||
void CvtColorLoop(const uchar * src_data, size_t src_step, uchar * dst_data, size_t dst_step, int width, int height, const Cvt& cvt) |
||||
{ |
||||
parallel_for_(Range(0, height), |
||||
CvtColorLoop_Invoker<Cvt>(src_data, src_step, dst_data, dst_step, width, cvt), |
||||
(width * height) / static_cast<double>(1<<16)); |
||||
} |
||||
|
||||
#if defined (HAVE_IPP) && (IPP_VERSION_X100 >= 700) |
||||
# define NEED_IPP 1 |
||||
#else |
||||
# define NEED_IPP 0 |
||||
#endif |
||||
|
||||
#if NEED_IPP |
||||
|
||||
#define MAX_IPP8u 255 |
||||
#define MAX_IPP16u 65535 |
||||
#define MAX_IPP32f 1.0 |
||||
|
||||
typedef IppStatus (CV_STDCALL* ippiReorderFunc)(const void *, int, void *, int, IppiSize, const int *); |
||||
typedef IppStatus (CV_STDCALL* ippiGeneralFunc)(const void *, int, void *, int, IppiSize); |
||||
typedef IppStatus (CV_STDCALL* ippiColor2GrayFunc)(const void *, int, void *, int, IppiSize, const Ipp32f *); |
||||
|
||||
template <typename Cvt> |
||||
class CvtColorIPPLoop_Invoker : |
||||
public ParallelLoopBody |
||||
{ |
||||
public: |
||||
|
||||
CvtColorIPPLoop_Invoker(const uchar * src_data_, size_t src_step_, uchar * dst_data_, size_t dst_step_, int width_, const Cvt& _cvt, bool *_ok) : |
||||
ParallelLoopBody(), src_data(src_data_), src_step(src_step_), dst_data(dst_data_), dst_step(dst_step_), width(width_), cvt(_cvt), ok(_ok) |
||||
{ |
||||
*ok = true; |
||||
} |
||||
|
||||
virtual void operator()(const Range& range) const CV_OVERRIDE |
||||
{ |
||||
const void *yS = src_data + src_step * range.start; |
||||
void *yD = dst_data + dst_step * range.start; |
||||
if( !cvt(yS, static_cast<int>(src_step), yD, static_cast<int>(dst_step), width, range.end - range.start) ) |
||||
*ok = false; |
||||
else |
||||
{ |
||||
CV_IMPL_ADD(CV_IMPL_IPP|CV_IMPL_MT); |
||||
} |
||||
} |
||||
|
||||
private: |
||||
const uchar * src_data; |
||||
const size_t src_step; |
||||
uchar * dst_data; |
||||
const size_t dst_step; |
||||
const int width; |
||||
const Cvt& cvt; |
||||
bool *ok; |
||||
|
||||
const CvtColorIPPLoop_Invoker& operator= (const CvtColorIPPLoop_Invoker&); |
||||
}; |
||||
|
||||
|
||||
template <typename Cvt> |
||||
bool CvtColorIPPLoop(const uchar * src_data, size_t src_step, uchar * dst_data, size_t dst_step, int width, int height, const Cvt& cvt) |
||||
{ |
||||
bool ok; |
||||
parallel_for_(Range(0, height), CvtColorIPPLoop_Invoker<Cvt>(src_data, src_step, dst_data, dst_step, width, cvt, &ok), (width * height)/(double)(1<<16) ); |
||||
return ok; |
||||
} |
||||
|
||||
|
||||
template <typename Cvt> |
||||
bool CvtColorIPPLoopCopy(const uchar * src_data, size_t src_step, int src_type, uchar * dst_data, size_t dst_step, int width, int height, const Cvt& cvt) |
||||
{ |
||||
Mat temp; |
||||
Mat src(Size(width, height), src_type, const_cast<uchar*>(src_data), src_step); |
||||
Mat source = src; |
||||
if( src_data == dst_data ) |
||||
{ |
||||
src.copyTo(temp); |
||||
source = temp; |
||||
} |
||||
bool ok; |
||||
parallel_for_(Range(0, source.rows), |
||||
CvtColorIPPLoop_Invoker<Cvt>(source.data, source.step, dst_data, dst_step, |
||||
source.cols, cvt, &ok), |
||||
source.total()/(double)(1<<16) ); |
||||
return ok; |
||||
} |
||||
|
||||
|
||||
struct IPPGeneralFunctor |
||||
{ |
||||
IPPGeneralFunctor(ippiGeneralFunc _func) : ippiColorConvertGeneral(_func){} |
||||
bool operator()(const void *src, int srcStep, void *dst, int dstStep, int cols, int rows) const |
||||
{ |
||||
return ippiColorConvertGeneral ? CV_INSTRUMENT_FUN_IPP(ippiColorConvertGeneral, src, srcStep, dst, dstStep, ippiSize(cols, rows)) >= 0 : false; |
||||
} |
||||
private: |
||||
ippiGeneralFunc ippiColorConvertGeneral; |
||||
}; |
||||
|
||||
|
||||
struct IPPReorderFunctor |
||||
{ |
||||
IPPReorderFunctor(ippiReorderFunc _func, int _order0, int _order1, int _order2) : ippiColorConvertReorder(_func) |
||||
{ |
||||
order[0] = _order0; |
||||
order[1] = _order1; |
||||
order[2] = _order2; |
||||
order[3] = 3; |
||||
} |
||||
bool operator()(const void *src, int srcStep, void *dst, int dstStep, int cols, int rows) const |
||||
{ |
||||
return ippiColorConvertReorder ? CV_INSTRUMENT_FUN_IPP(ippiColorConvertReorder, src, srcStep, dst, dstStep, ippiSize(cols, rows), order) >= 0 : false; |
||||
} |
||||
private: |
||||
ippiReorderFunc ippiColorConvertReorder; |
||||
int order[4]; |
||||
}; |
||||
|
||||
|
||||
struct IPPReorderGeneralFunctor |
||||
{ |
||||
IPPReorderGeneralFunctor(ippiReorderFunc _func1, ippiGeneralFunc _func2, int _order0, int _order1, int _order2, int _depth) : |
||||
ippiColorConvertReorder(_func1), ippiColorConvertGeneral(_func2), depth(_depth) |
||||
{ |
||||
order[0] = _order0; |
||||
order[1] = _order1; |
||||
order[2] = _order2; |
||||
order[3] = 3; |
||||
} |
||||
bool operator()(const void *src, int srcStep, void *dst, int dstStep, int cols, int rows) const |
||||
{ |
||||
if (ippiColorConvertReorder == 0 || ippiColorConvertGeneral == 0) |
||||
return false; |
||||
|
||||
Mat temp; |
||||
temp.create(rows, cols, CV_MAKETYPE(depth, 3)); |
||||
if(CV_INSTRUMENT_FUN_IPP(ippiColorConvertReorder, src, srcStep, temp.ptr(), (int)temp.step[0], ippiSize(cols, rows), order) < 0) |
||||
return false; |
||||
return CV_INSTRUMENT_FUN_IPP(ippiColorConvertGeneral, temp.ptr(), (int)temp.step[0], dst, dstStep, ippiSize(cols, rows)) >= 0; |
||||
} |
||||
private: |
||||
ippiReorderFunc ippiColorConvertReorder; |
||||
ippiGeneralFunc ippiColorConvertGeneral; |
||||
int order[4]; |
||||
int depth; |
||||
}; |
||||
|
||||
|
||||
struct IPPGeneralReorderFunctor |
||||
{ |
||||
IPPGeneralReorderFunctor(ippiGeneralFunc _func1, ippiReorderFunc _func2, int _order0, int _order1, int _order2, int _depth) : |
||||
ippiColorConvertGeneral(_func1), ippiColorConvertReorder(_func2), depth(_depth) |
||||
{ |
||||
order[0] = _order0; |
||||
order[1] = _order1; |
||||
order[2] = _order2; |
||||
order[3] = 3; |
||||
} |
||||
bool operator()(const void *src, int srcStep, void *dst, int dstStep, int cols, int rows) const |
||||
{ |
||||
if (ippiColorConvertGeneral == 0 || ippiColorConvertReorder == 0) |
||||
return false; |
||||
|
||||
Mat temp; |
||||
temp.create(rows, cols, CV_MAKETYPE(depth, 3)); |
||||
if(CV_INSTRUMENT_FUN_IPP(ippiColorConvertGeneral, src, srcStep, temp.ptr(), (int)temp.step[0], ippiSize(cols, rows)) < 0) |
||||
return false; |
||||
return CV_INSTRUMENT_FUN_IPP(ippiColorConvertReorder, temp.ptr(), (int)temp.step[0], dst, dstStep, ippiSize(cols, rows), order) >= 0; |
||||
} |
||||
private: |
||||
ippiGeneralFunc ippiColorConvertGeneral; |
||||
ippiReorderFunc ippiColorConvertReorder; |
||||
int order[4]; |
||||
int depth; |
||||
}; |
||||
|
||||
extern ippiReorderFunc ippiSwapChannelsC3C4RTab[8]; |
||||
extern ippiReorderFunc ippiSwapChannelsC4C3RTab[8]; |
||||
extern ippiReorderFunc ippiSwapChannelsC3RTab[8]; |
||||
|
||||
#endif |
||||
|
||||
#ifdef HAVE_OPENCL |
||||
|
||||
bool oclCvtColorBGR2Luv( InputArray _src, OutputArray _dst, int bidx, bool srgb ); |
||||
bool oclCvtColorBGR2Lab( InputArray _src, OutputArray _dst, int bidx, bool srgb ); |
||||
bool oclCvtColorLab2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx, bool srgb); |
||||
bool oclCvtColorLuv2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx, bool srgb); |
||||
bool oclCvtColorBGR2XYZ( InputArray _src, OutputArray _dst, int bidx ); |
||||
bool oclCvtColorXYZ2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx ); |
||||
|
||||
bool oclCvtColorHSV2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx, bool full ); |
||||
bool oclCvtColorHLS2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx, bool full ); |
||||
bool oclCvtColorBGR2HLS( InputArray _src, OutputArray _dst, int bidx, bool full ); |
||||
bool oclCvtColorBGR2HSV( InputArray _src, OutputArray _dst, int bidx, bool full ); |
||||
|
||||
bool oclCvtColorBGR2BGR( InputArray _src, OutputArray _dst, int dcn, bool reverse ); |
||||
bool oclCvtColorBGR25x5( InputArray _src, OutputArray _dst, int bidx, int gbits ); |
||||
bool oclCvtColor5x52BGR( InputArray _src, OutputArray _dst, int dcn, int bidx, int gbits ); |
||||
bool oclCvtColor5x52Gray( InputArray _src, OutputArray _dst, int gbits ); |
||||
bool oclCvtColorGray25x5( InputArray _src, OutputArray _dst, int gbits ); |
||||
bool oclCvtColorBGR2Gray( InputArray _src, OutputArray _dst, int bidx ); |
||||
bool oclCvtColorGray2BGR( InputArray _src, OutputArray _dst, int dcn ); |
||||
bool oclCvtColorRGBA2mRGBA( InputArray _src, OutputArray _dst ); |
||||
bool oclCvtColormRGBA2RGBA( InputArray _src, OutputArray _dst ); |
||||
|
||||
bool oclCvtColorBGR2YCrCb( InputArray _src, OutputArray _dst, int bidx); |
||||
bool oclCvtcolorYCrCb2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx); |
||||
bool oclCvtColorBGR2YUV( InputArray _src, OutputArray _dst, int bidx ); |
||||
bool oclCvtColorYUV2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx ); |
||||
|
||||
bool oclCvtColorOnePlaneYUV2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx, int uidx, int yidx ); |
||||
bool oclCvtColorTwoPlaneYUV2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx, int uidx ); |
||||
bool oclCvtColorThreePlaneYUV2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx, int uidx ); |
||||
bool oclCvtColorBGR2ThreePlaneYUV( InputArray _src, OutputArray _dst, int bidx, int uidx ); |
||||
bool oclCvtColorYUV2Gray_420( InputArray _src, OutputArray _dst ); |
||||
|
||||
#endif |
||||
|
||||
void cvtColorBGR2Lab( InputArray _src, OutputArray _dst, bool swapb, bool srgb); |
||||
void cvtColorBGR2Luv( InputArray _src, OutputArray _dst, bool swapb, bool srgb); |
||||
void cvtColorLab2BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb, bool srgb ); |
||||
void cvtColorLuv2BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb, bool srgb ); |
||||
void cvtColorBGR2XYZ( InputArray _src, OutputArray _dst, bool swapb ); |
||||
void cvtColorXYZ2BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb ); |
||||
|
||||
void cvtColorBGR2YUV( InputArray _src, OutputArray _dst, bool swapb, bool crcb); |
||||
void cvtColorYUV2BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb, bool crcb); |
||||
|
||||
void cvtColorOnePlaneYUV2BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb, int uidx, int ycn); |
||||
void cvtColorTwoPlaneYUV2BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb, int uidx ); |
||||
void cvtColorTwoPlaneYUV2BGRpair( InputArray _ysrc, InputArray _uvsrc, OutputArray _dst, int dcn, bool swapb, int uidx ); |
||||
void cvtColorThreePlaneYUV2BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb, int uidx ); |
||||
void cvtColorBGR2ThreePlaneYUV( InputArray _src, OutputArray _dst, bool swapb, int uidx); |
||||
void cvtColorYUV2Gray_420( InputArray _src, OutputArray _dst ); |
||||
void cvtColorYUV2Gray_ch( InputArray _src, OutputArray _dst, int coi ); |
||||
|
||||
void cvtColorBGR2HLS( InputArray _src, OutputArray _dst, bool swapb, bool fullRange ); |
||||
void cvtColorBGR2HSV( InputArray _src, OutputArray _dst, bool swapb, bool fullRange ); |
||||
void cvtColorHLS2BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb, bool fullRange); |
||||
void cvtColorHSV2BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb, bool fullRange); |
||||
|
||||
void cvtColorBGR2BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb); |
||||
void cvtColorBGR25x5( InputArray _src, OutputArray _dst, bool swapb, int gbits); |
||||
void cvtColor5x52BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb, int gbits); |
||||
void cvtColorBGR2Gray( InputArray _src, OutputArray _dst, bool swapb); |
||||
void cvtColorGray2BGR( InputArray _src, OutputArray _dst, int dcn); |
||||
void cvtColor5x52Gray( InputArray _src, OutputArray _dst, int gbits); |
||||
void cvtColorGray25x5( InputArray _src, OutputArray _dst, int gbits); |
||||
void cvtColorRGBA2mRGBA(InputArray _src, OutputArray _dst); |
||||
void cvtColormRGBA2RGBA(InputArray _src, OutputArray _dst); |
||||
|
||||
} //namespace cv
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue