moved gpu cvtColor tests to separate file
added more tests for gpu cvtColor fixed RGB->YUV conversion
This commit is contained in:
parent
13045dec1d
commit
d1423adbc7
@ -455,22 +455,7 @@ namespace cv { namespace gpu { namespace device
|
|||||||
dst.y = saturate_cast<T>(Cr);
|
dst.y = saturate_cast<T>(Cr);
|
||||||
dst.z = saturate_cast<T>(Cb);
|
dst.z = saturate_cast<T>(Cb);
|
||||||
}
|
}
|
||||||
template <int bidx> static __device__ uint RGB2YUVConvert(uint src)
|
|
||||||
{
|
|
||||||
const uint delta = ColorChannel<uchar>::half() * (1 << yuv_shift);
|
|
||||||
|
|
||||||
const uint Y = CV_DESCALE((0xffu & src) * c_RGB2YUVCoeffs_i[bidx^2] + (0xffu & (src >> 8)) * c_RGB2YUVCoeffs_i[1] + (0xffu & (src >> 16)) * c_RGB2YUVCoeffs_i[bidx], yuv_shift);
|
|
||||||
const uint Cr = CV_DESCALE(((0xffu & (src >> ((bidx ^ 2) * 8))) - Y) * c_RGB2YUVCoeffs_i[3] + delta, yuv_shift);
|
|
||||||
const uint Cb = CV_DESCALE(((0xffu & (src >> (bidx * 8))) - Y) * c_RGB2YUVCoeffs_i[4] + delta, yuv_shift);
|
|
||||||
|
|
||||||
uint dst = 0;
|
|
||||||
|
|
||||||
dst |= saturate_cast<uchar>(Y);
|
|
||||||
dst |= saturate_cast<uchar>(Cr) << 8;
|
|
||||||
dst |= saturate_cast<uchar>(Cb) << 16;
|
|
||||||
|
|
||||||
return dst;
|
|
||||||
}
|
|
||||||
template <int bidx, typename D> static __device__ __forceinline__ void RGB2YUVConvert(const float* src, D& dst)
|
template <int bidx, typename D> static __device__ __forceinline__ void RGB2YUVConvert(const float* src, D& dst)
|
||||||
{
|
{
|
||||||
dst.x = src[0] * c_RGB2YUVCoeffs_f[bidx^2] + src[1] * c_RGB2YUVCoeffs_f[1] + src[2] * c_RGB2YUVCoeffs_f[bidx];
|
dst.x = src[0] * c_RGB2YUVCoeffs_f[bidx^2] + src[1] * c_RGB2YUVCoeffs_f[1] + src[2] * c_RGB2YUVCoeffs_f[bidx];
|
||||||
@ -487,13 +472,6 @@ namespace cv { namespace gpu { namespace device
|
|||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
template <int bidx> struct RGB2YUV<uchar, 4, 4, bidx> : unary_function<uint, uint>
|
|
||||||
{
|
|
||||||
__device__ __forceinline__ uint operator ()(uint src) const
|
|
||||||
{
|
|
||||||
return RGB2YUVConvert<bidx>(src);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(name, scn, dcn, bidx) \
|
#define OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(name, scn, dcn, bidx) \
|
||||||
@ -527,9 +505,9 @@ namespace cv { namespace gpu { namespace device
|
|||||||
const int y = 0xff & (src >> 8);
|
const int y = 0xff & (src >> 8);
|
||||||
const int z = 0xff & (src >> 16);
|
const int z = 0xff & (src >> 16);
|
||||||
|
|
||||||
const uint b = x + CV_DESCALE((z - ColorChannel<uchar>::half()) * c_YUV2RGBCoeffs_i[3], yuv_shift);
|
const int b = x + CV_DESCALE((z - ColorChannel<uchar>::half()) * c_YUV2RGBCoeffs_i[3], yuv_shift);
|
||||||
const uint g = x + CV_DESCALE((z - ColorChannel<uchar>::half()) * c_YUV2RGBCoeffs_i[2] + (y - ColorChannel<uchar>::half()) * c_YUV2RGBCoeffs_i[1], yuv_shift);
|
const int g = x + CV_DESCALE((z - ColorChannel<uchar>::half()) * c_YUV2RGBCoeffs_i[2] + (y - ColorChannel<uchar>::half()) * c_YUV2RGBCoeffs_i[1], yuv_shift);
|
||||||
const uint r = x + CV_DESCALE((y - ColorChannel<uchar>::half()) * c_YUV2RGBCoeffs_i[0], yuv_shift);
|
const int r = x + CV_DESCALE((y - ColorChannel<uchar>::half()) * c_YUV2RGBCoeffs_i[0], yuv_shift);
|
||||||
|
|
||||||
uint dst = 0xffu << 24;
|
uint dst = 0xffu << 24;
|
||||||
|
|
||||||
@ -600,9 +578,9 @@ namespace cv { namespace gpu { namespace device
|
|||||||
{
|
{
|
||||||
const int delta = ColorChannel<uchar>::half() * (1 << yuv_shift);
|
const int delta = ColorChannel<uchar>::half() * (1 << yuv_shift);
|
||||||
|
|
||||||
const uint Y = CV_DESCALE((0xffu & src) * c_RGB2YCrCbCoeffs_i[bidx^2] + (0xffu & (src >> 8)) * c_RGB2YCrCbCoeffs_i[1] + (0xffu & (src >> 16)) * c_RGB2YCrCbCoeffs_i[bidx], yuv_shift);
|
const int Y = CV_DESCALE((0xffu & src) * c_RGB2YCrCbCoeffs_i[bidx^2] + (0xffu & (src >> 8)) * c_RGB2YCrCbCoeffs_i[1] + (0xffu & (src >> 16)) * c_RGB2YCrCbCoeffs_i[bidx], yuv_shift);
|
||||||
const uint Cr = CV_DESCALE(((0xffu & (src >> ((bidx ^ 2) * 8))) - Y) * c_RGB2YCrCbCoeffs_i[3] + delta, yuv_shift);
|
const int Cr = CV_DESCALE(((0xffu & (src >> ((bidx ^ 2) * 8))) - Y) * c_RGB2YCrCbCoeffs_i[3] + delta, yuv_shift);
|
||||||
const uint Cb = CV_DESCALE(((0xffu & (src >> (bidx * 8))) - Y) * c_RGB2YCrCbCoeffs_i[4] + delta, yuv_shift);
|
const int Cb = CV_DESCALE(((0xffu & (src >> (bidx * 8))) - Y) * c_RGB2YCrCbCoeffs_i[4] + delta, yuv_shift);
|
||||||
|
|
||||||
uint dst = 0;
|
uint dst = 0;
|
||||||
|
|
||||||
@ -668,9 +646,9 @@ namespace cv { namespace gpu { namespace device
|
|||||||
const int y = 0xff & (src >> 8);
|
const int y = 0xff & (src >> 8);
|
||||||
const int z = 0xff & (src >> 16);
|
const int z = 0xff & (src >> 16);
|
||||||
|
|
||||||
const uint b = x + CV_DESCALE((z - ColorChannel<uchar>::half()) * c_YCrCb2RGBCoeffs_i[3], yuv_shift);
|
const int b = x + CV_DESCALE((z - ColorChannel<uchar>::half()) * c_YCrCb2RGBCoeffs_i[3], yuv_shift);
|
||||||
const uint g = x + CV_DESCALE((z - ColorChannel<uchar>::half()) * c_YCrCb2RGBCoeffs_i[2] + (y - ColorChannel<uchar>::half()) * c_YCrCb2RGBCoeffs_i[1], yuv_shift);
|
const int g = x + CV_DESCALE((z - ColorChannel<uchar>::half()) * c_YCrCb2RGBCoeffs_i[2] + (y - ColorChannel<uchar>::half()) * c_YCrCb2RGBCoeffs_i[1], yuv_shift);
|
||||||
const uint r = x + CV_DESCALE((y - ColorChannel<uchar>::half()) * c_YCrCb2RGBCoeffs_i[0], yuv_shift);
|
const int r = x + CV_DESCALE((y - ColorChannel<uchar>::half()) * c_YCrCb2RGBCoeffs_i[0], yuv_shift);
|
||||||
|
|
||||||
uint dst = 0xffu << 24;
|
uint dst = 0xffu << 24;
|
||||||
|
|
||||||
|
1654
modules/gpu/test/test_color.cpp
Normal file
1654
modules/gpu/test/test_color.cpp
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user