📄 cvcolor.c
字号:
icvXYZ2RGB_32f_C3R_t icvXYZ2RGB_32f_C3R_p = 0;
icvRGB2HSV_8u_C3R_t icvRGB2HSV_8u_C3R_p = 0;
icvHSV2RGB_8u_C3R_t icvHSV2RGB_8u_C3R_p = 0;
icvBGR2Lab_8u_C3R_t icvBGR2Lab_8u_C3R_p = 0;
icvLab2BGR_8u_C3R_t icvLab2BGR_8u_C3R_p = 0;
icvRGB2HLS_8u_C3R_t icvRGB2HLS_8u_C3R_p = 0;
icvRGB2HLS_32f_C3R_t icvRGB2HLS_32f_C3R_p = 0;
icvHLS2RGB_8u_C3R_t icvHLS2RGB_8u_C3R_p = 0;
icvHLS2RGB_32f_C3R_t icvHLS2RGB_32f_C3R_p = 0;
icvRGB2Luv_8u_C3R_t icvRGB2Luv_8u_C3R_p = 0;
icvLuv2RGB_8u_C3R_t icvLuv2RGB_8u_C3R_p = 0;
//icvRGB2Luv_32f_C3R_t icvRGB2Luv_32f_C3R_p = 0;
//icvLuv2RGB_32f_C3R_t icvLuv2RGB_32f_C3R_p = 0;
//icvRGB2Luv_32f_C3R_t icvRGB2Luv_32f_C3R_p = 0;
//icvLuv2RGB_32f_C3R_t icvLuv2RGB_32f_C3R_p = 0;
#define CV_IMPL_BGRx2ABC_IPP( flavor, arrtype ) \
static CvStatus CV_STDCALL \
icvBGRx2ABC_IPP_##flavor##_CnC3R( const arrtype* src, int srcstep, \
arrtype* dst, int dststep, CvSize size, int src_cn, \
int blue_idx, CvColorCvtFunc0 ipp_func ) \
{ \
int block_size = MIN(1 << 14, size.width); \
arrtype* buffer; \
int i, di, k; \
int do_copy = src_cn > 3 || blue_idx != 2 || src == dst; \
CvStatus status = CV_OK; \
\
if( !do_copy ) \
return ipp_func( src, srcstep, dst, dststep, size ); \
\
srcstep /= sizeof(src[0]); \
dststep /= sizeof(dst[0]); \
\
buffer = (arrtype*)cvStackAlloc( block_size*3*sizeof(buffer[0]) ); \
srcstep -= size.width*src_cn; \
\
for( ; size.height--; src += srcstep, dst += dststep ) \
{ \
for( i = 0; i < size.width; i += block_size ) \
{ \
arrtype* dst1 = dst + i*3; \
di = MIN(block_size, size.width - i); \
\
for( k = 0; k < di*3; k += 3, src += src_cn ) \
{ \
arrtype b = src[blue_idx]; \
arrtype g = src[1]; \
arrtype r = src[blue_idx^2]; \
buffer[k] = r; \
buffer[k+1] = g; \
buffer[k+2] = b; \
} \
\
status = ipp_func( buffer, CV_STUB_STEP, \
dst1, CV_STUB_STEP, cvSize(di,1) ); \
if( status < 0 ) \
return status; \
} \
} \
\
return CV_OK; \
}
static CvStatus CV_STDCALL
icvBGRx2ABC_IPP_8u_CnC3R( const uchar* src, int srcstep,
uchar* dst, int dststep, CvSize size, int src_cn,
int blue_idx, CvColorCvtFunc0 ipp_func )
{
int block_size = MIN(1 << 14, size.width);
uchar* buffer;
int i, di, k;
int do_copy = src_cn > 3 || blue_idx != 2 || src == dst;
CvStatus status = CV_OK;
if( !do_copy )
return ipp_func( src, srcstep, dst, dststep, size );
srcstep /= sizeof(src[0]);
dststep /= sizeof(dst[0]);
buffer = (uchar*)cvStackAlloc( block_size*3*sizeof(buffer[0]) );
srcstep -= size.width*src_cn;
for( ; size.height--; src += srcstep, dst += dststep )
{
for( i = 0; i < size.width; i += block_size )
{
uchar* dst1 = dst + i*3;
di = MIN(block_size, size.width - i);
for( k = 0; k < di*3; k += 3, src += src_cn )
{
uchar b = src[blue_idx];
uchar g = src[1];
uchar r = src[blue_idx^2];
buffer[k] = r;
buffer[k+1] = g;
buffer[k+2] = b;
}
status = ipp_func( buffer, CV_STUB_STEP,
dst1, CV_STUB_STEP, cvSize(di,1) );
if( status < 0 )
return status;
}
}
return CV_OK;
}
//CV_IMPL_BGRx2ABC_IPP( 8u, uchar )
CV_IMPL_BGRx2ABC_IPP( 16u, ushort )
CV_IMPL_BGRx2ABC_IPP( 32f, float )
#define CV_IMPL_ABC2BGRx_IPP( flavor, arrtype ) \
static CvStatus CV_STDCALL \
icvABC2BGRx_IPP_##flavor##_C3CnR( const arrtype* src, int srcstep, \
arrtype* dst, int dststep, CvSize size, int dst_cn, \
int blue_idx, CvColorCvtFunc0 ipp_func ) \
{ \
int block_size = MIN(1 << 10, size.width); \
arrtype* buffer; \
int i, di, k; \
int do_copy = dst_cn > 3 || blue_idx != 2 || src == dst; \
CvStatus status = CV_OK; \
\
if( !do_copy ) \
return ipp_func( src, srcstep, dst, dststep, size ); \
\
srcstep /= sizeof(src[0]); \
dststep /= sizeof(dst[0]); \
\
buffer = (arrtype*)cvStackAlloc( block_size*3*sizeof(buffer[0]) ); \
dststep -= size.width*dst_cn; \
\
for( ; size.height--; src += srcstep, dst += dststep ) \
{ \
for( i = 0; i < size.width; i += block_size ) \
{ \
const arrtype* src1 = src + i*3; \
di = MIN(block_size, size.width - i); \
\
status = ipp_func( src1, CV_STUB_STEP, \
buffer, CV_STUB_STEP, cvSize(di,1) ); \
if( status < 0 ) \
return status; \
\
for( k = 0; k < di*3; k += 3, dst += dst_cn ) \
{ \
arrtype r = buffer[k]; \
arrtype g = buffer[k+1]; \
arrtype b = buffer[k+2]; \
dst[blue_idx] = b; \
dst[1] = g; \
dst[blue_idx^2] = r; \
if( dst_cn == 4 ) \
dst[3] = 0; \
} \
} \
} \
\
return CV_OK; \
}
CV_IMPL_ABC2BGRx_IPP( 8u, uchar )
CV_IMPL_ABC2BGRx_IPP( 16u, ushort )
CV_IMPL_ABC2BGRx_IPP( 32f, float )
/////////////////////////////////////////////////////////////////////////////////////////
/****************************************************************************************\
* Color to/from Grayscale *
\****************************************************************************************/
#define fix(x,n) (int)((x)*(1 << (n)) + 0.5)
#define descale CV_DESCALE
#define cscGr_32f 0.299f
#define cscGg_32f 0.587f
#define cscGb_32f 0.114f
/* BGR/RGB -> Gray */
#define csc_shift 14
#define cscGr fix(cscGr_32f,csc_shift)
#define cscGg fix(cscGg_32f,csc_shift)
#define cscGb /*fix(cscGb_32f,csc_shift)*/ ((1 << csc_shift) - cscGr - cscGg)
#define CV_IMPL_GRAY2BGRX( flavor, arrtype ) \
static CvStatus CV_STDCALL \
icvGray2BGRx_##flavor##_C1CnR( const arrtype* src, int srcstep, \
arrtype* dst, int dststep, CvSize size, \
int dst_cn ) \
{ \
int i; \
srcstep /= sizeof(src[0]); \
dststep /= sizeof(src[0]); \
dststep -= size.width*dst_cn; \
\
for( ; size.height--; src += srcstep, dst += dststep ) \
{ \
if( dst_cn == 3 ) \
for( i = 0; i < size.width; i++, dst += 3 ) \
dst[0] = dst[1] = dst[2] = src[i]; \
else \
for( i = 0; i < size.width; i++, dst += 4 ) \
{ \
dst[0] = dst[1] = dst[2] = src[i]; \
dst[3] = 0; \
} \
} \
\
return CV_OK; \
}
CV_IMPL_GRAY2BGRX( 8u, uchar )
CV_IMPL_GRAY2BGRX( 16u, ushort )
CV_IMPL_GRAY2BGRX( 32f, float )
static CvStatus CV_STDCALL
icvBGR5x52Gray_8u_C2C1R( const uchar* src, int srcstep,
uchar* dst, int dststep,
CvSize size, int green_bits )
{
int i;
assert( green_bits == 5 || green_bits == 6 );
for( ; size.height--; src += srcstep, dst += dststep )
{
if( green_bits == 6 )
for( i = 0; i < size.width; i++ )
{
int t = ((ushort*)src)[i];
t = ((t << 3) & 0xf8)*cscGb + ((t >> 3) & 0xfc)*cscGg +
((t >> 8) & 0xf8)*cscGr;
dst[i] = (uchar)CV_DESCALE(t,csc_shift);
}
else
for( i = 0; i < size.width; i++ )
{
int t = ((ushort*)src)[i];
t = ((t << 3) & 0xf8)*cscGb + ((t >> 2) & 0xf8)*cscGg +
((t >> 7) & 0xf8)*cscGr;
dst[i] = (uchar)CV_DESCALE(t,csc_shift);
}
}
return CV_OK;
}
static CvStatus CV_STDCALL
icvGray2BGR5x5_8u_C1C2R( const uchar* src, int srcstep,
uchar* dst, int dststep,
CvSize size, int green_bits )
{
int i;
assert( green_bits == 5 || green_bits == 6 );
for( ; size.height--; src += srcstep, dst += dststep )
{
if( green_bits == 6 )
for( i = 0; i < size.width; i++ )
{
int t = src[i];
((ushort*)dst)[i] = (ushort)((t >> 3)|((t & ~3) << 3)|((t & ~7) << 8));
}
else
for( i = 0; i < size.width; i++ )
{
int t = src[i] >> 3;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -