mirror of
https://github.com/opencv/opencv.git
synced 2024-11-30 06:10:02 +08:00
core: keep history of color*.cpp
This commit is contained in:
commit
39783a6584
673
modules/imgproc/src/color.simd_helpers.hpp
Normal file
673
modules/imgproc/src/color.simd_helpers.hpp
Normal file
@ -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
|
1565
modules/imgproc/src/color_hsv.simd.hpp
Normal file
1565
modules/imgproc/src/color_hsv.simd.hpp
Normal file
File diff suppressed because it is too large
Load Diff
1656
modules/imgproc/src/color_rgb.simd.hpp
Normal file
1656
modules/imgproc/src/color_rgb.simd.hpp
Normal file
File diff suppressed because it is too large
Load Diff
2243
modules/imgproc/src/color_yuv.simd.hpp
Normal file
2243
modules/imgproc/src/color_yuv.simd.hpp
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user