@@ -5864,9 +5864,12 @@ static const bool enablePackedLuv2RGB = true;
5864
5864
static int16_t *RGB2LuvLUT_s16;
5865
5865
static const softfloat uLow (-134 ), uHigh(220 ), uRange(uHigh-uLow);
5866
5866
static const softfloat vLow (-140 ), vHigh(122 ), vRange(vHigh-vLow);
5867
- static int *LuToUp_b;
5868
- static int *LvToVp_b;
5869
- static long long int *LvToVpl_b;
5867
+
5868
+ static struct LUVLUT_T {
5869
+ const int *LuToUp_b;
5870
+ const int *LvToVp_b;
5871
+ const long long int *LvToVpl_b;
5872
+ } LUVLUT;
5870
5873
5871
5874
#define clip (value ) \
5872
5875
value < 0 .0f ? 0 .0f : value > 1 .0f ? 1 .0f : value;
@@ -5896,6 +5899,41 @@ static inline softfloat applyInvGamma(softfloat x)
5896
5899
pow (xd, softdouble::one ()/gammaPower)*(softdouble::one ()+gammaXshift) - gammaXshift);
5897
5900
}
5898
5901
5902
+ static LUVLUT_T initLUTforLUV (int BASE, const softfloat &un, const softfloat &vn)
5903
+ {
5904
+ const softfloat oneof4 = softfloat::one ()/softfloat (4 );
5905
+ const softfloat f255 (255 );
5906
+ int *LuToUp_b = new int [256 *256 ];
5907
+ int *LvToVp_b = new int [256 *256 ];
5908
+ long long int *LvToVpl_b = new long long int [256 *256 ];
5909
+ for (int LL = 0 ; LL < 256 ; LL++)
5910
+ {
5911
+ softfloat L = softfloat (LL*100 )/f255;
5912
+ for (int uu = 0 ; uu < 256 ; uu++)
5913
+ {
5914
+ softfloat u = softfloat (uu)*uRange/f255 + uLow;
5915
+ softfloat up = softfloat (9 )*(u + L*un);
5916
+ LuToUp_b[LL*256 +uu] = cvRound (up*softfloat (BASE/1024 ));// 1024 is OK, 2048 gave maxerr 3
5917
+ }
5918
+ for (int vv = 0 ; vv < 256 ; vv++)
5919
+ {
5920
+ softfloat v = softfloat (vv)*vRange/f255 + vLow;
5921
+ softfloat vp = oneof4/(v + L*vn);
5922
+ if (vp > oneof4) vp = oneof4;
5923
+ if (vp < -oneof4) vp = -oneof4;
5924
+ int ivp = cvRound (vp*softfloat (BASE*1024 ));
5925
+ LvToVp_b[LL*256 +vv] = ivp;
5926
+ int vpl = ivp*LL;
5927
+ LvToVpl_b[LL*256 +vv] = (12 *13 *100 *(BASE/1024 ))*(long long )vpl;
5928
+ }
5929
+ }
5930
+ LUVLUT_T res;
5931
+ res.LuToUp_b = LuToUp_b;
5932
+ res.LvToVp_b = LvToVp_b;
5933
+ res.LvToVpl_b = LvToVpl_b;
5934
+ return res;
5935
+ }
5936
+
5899
5937
static void initLabTabs ()
5900
5938
{
5901
5939
static bool initialized = false ;
@@ -6002,7 +6040,6 @@ static void initLabTabs()
6002
6040
dd = softfloat::one ()/max (dd, softfloat::eps ());
6003
6041
softfloat un = dd*softfloat (13 *4 )*D65[0 ];
6004
6042
softfloat vn = dd*softfloat (13 *9 )*D65[1 ];
6005
- softfloat oneof4 = softfloat::one ()/softfloat (4 );
6006
6043
6007
6044
// when XYZ are limited to [0, 2]
6008
6045
/*
@@ -6013,30 +6050,7 @@ static void initLabTabs()
6013
6050
*/
6014
6051
6015
6052
// Luv LUT
6016
- LuToUp_b = new int [256 *256 ];
6017
- LvToVp_b = new int [256 *256 ];
6018
- LvToVpl_b = new long long int [256 *256 ];
6019
- for (int LL = 0 ; LL < 256 ; LL++)
6020
- {
6021
- softfloat L = softfloat (LL*100 )/f255;
6022
- for (int uu = 0 ; uu < 256 ; uu++)
6023
- {
6024
- softfloat u = softfloat (uu)*uRange/f255 + uLow;
6025
- softfloat up = softfloat (9 )*(u + L*un);
6026
- LuToUp_b[LL*256 +uu] = cvRound (up*softfloat (BASE/1024 ));// 1024 is OK, 2048 gave maxerr 3
6027
- }
6028
- for (int vv = 0 ; vv < 256 ; vv++)
6029
- {
6030
- softfloat v = softfloat (vv)*vRange/f255 + vLow;
6031
- softfloat vp = oneof4/(v + L*vn);
6032
- if (vp > oneof4) vp = oneof4;
6033
- if (vp < -oneof4) vp = -oneof4;
6034
- int ivp = cvRound (vp*softfloat (BASE*1024 ));
6035
- LvToVp_b[LL*256 +vv] = ivp;
6036
- int vpl = ivp*LL;
6037
- LvToVpl_b[LL*256 +vv] = (12 *13 *100 *(BASE/1024 ))*(long long )vpl;
6038
- }
6039
- }
6053
+ LUVLUT = initLUTforLUV (BASE, un, vn);
6040
6054
6041
6055
// try to suppress warning
6042
6056
static const bool calcLUT = enableRGB2LabInterpolation || enableRGB2LuvInterpolation;
@@ -8411,16 +8425,16 @@ struct Luv2RGBinteger
8411
8425
// y : [0, BASE]
8412
8426
// up: [-402, 1431.57]*(BASE/1024)
8413
8427
// vp: +/- 0.25*BASE*1024
8414
- int up = LuToUp_b[LL*256 +uu];
8415
- int vp = LvToVp_b[LL*256 +vv];
8428
+ int up = LUVLUT. LuToUp_b [LL*256 +uu];
8429
+ int vp = LUVLUT. LvToVp_b [LL*256 +vv];
8416
8430
// X = y*3.f* up/((float)BASE/1024) *vp/((float)BASE*1024);
8417
8431
// Z = y*(((12.f*13.f)*((float)LL)*100.f/255.f - up/((float)BASE))*vp/((float)BASE*1024) - 5.f);
8418
8432
8419
8433
long long int xv = ((int )up)*(long long )vp;
8420
8434
int x = (int )(xv/BASE);
8421
8435
x = y*x/BASE;
8422
8436
8423
- long long int vpl = LvToVpl_b[LL*256 +vv];
8437
+ long long int vpl = LUVLUT. LvToVpl_b [LL*256 +vv];
8424
8438
long long int zp = vpl - xv*(255 /3 );
8425
8439
zp /= BASE;
8426
8440
long long int zq = zp - (long long )(5 *255 *BASE);
@@ -8460,11 +8474,11 @@ struct Luv2RGBinteger
8460
8474
int v = vvstore[i];
8461
8475
int y = LabToYF_b[LL*2 ];
8462
8476
8463
- int up = LuToUp_b[LL*256 +u];
8464
- int vp = LvToVp_b[LL*256 +v];
8477
+ int up = LUVLUT. LuToUp_b [LL*256 +u];
8478
+ int vp = LUVLUT. LvToVp_b [LL*256 +v];
8465
8479
8466
8480
long long int xv = up*(long long int )vp;
8467
- long long int vpl = LvToVpl_b[LL*256 +v];
8481
+ long long int vpl = LUVLUT. LvToVpl_b [LL*256 +v];
8468
8482
long long int zp = vpl - xv*(255 /3 );
8469
8483
zp = zp >> base_shift;
8470
8484
long long int zq = zp - (5 *255 *BASE);
@@ -9828,9 +9842,9 @@ static bool ocl_cvtColor( InputArray _src, OutputArray _dst, int code, int dcn )
9828
9842
static UMat usRGBGammaTab, ucoeffs, uLabCbrtTab;
9829
9843
9830
9844
if (srgb && usRGBGammaTab.empty ())
9831
- Mat (1 , GAMMA_TAB_SIZE * 4 , CV_32FC1, sRGBGammaTab ).copyTo (usRGBGammaTab);
9845
+ Mat (1 , GAMMA_TAB_SIZE * 4 , CV_32FC1, const_cast < float *>( sRGBGammaTab ) ).copyTo (usRGBGammaTab);
9832
9846
if (!lab && uLabCbrtTab.empty ())
9833
- Mat (1 , LAB_CBRT_TAB_SIZE * 4 , CV_32FC1, LabCbrtTab).copyTo (uLabCbrtTab);
9847
+ Mat (1 , LAB_CBRT_TAB_SIZE * 4 , CV_32FC1, const_cast < float *>( LabCbrtTab) ).copyTo (uLabCbrtTab);
9834
9848
9835
9849
{
9836
9850
float coeffs[9 ];
@@ -9916,7 +9930,7 @@ static bool ocl_cvtColor( InputArray _src, OutputArray _dst, int code, int dcn )
9916
9930
static UMat ucoeffs, usRGBInvGammaTab;
9917
9931
9918
9932
if (srgb && usRGBInvGammaTab.empty ())
9919
- Mat (1 , GAMMA_TAB_SIZE*4 , CV_32FC1, sRGBInvGammaTab ).copyTo (usRGBInvGammaTab);
9933
+ Mat (1 , GAMMA_TAB_SIZE*4 , CV_32FC1, const_cast < float *>( sRGBInvGammaTab ) ).copyTo (usRGBInvGammaTab);
9920
9934
9921
9935
{
9922
9936
float coeffs[9 ];
0 commit comments