cvcolor.cpp.svn-base
来自「非结构化路识别」· SVN-BASE 代码 · 共 920 行 · 第 1/3 页
SVN-BASE
920 行
int b = (src)[blue_idx], r = (src)[2^blue_idx], y; \
\
y = descale(b*yuvYb + (src)[1]*yuvYg + r*yuvYr,shift); \
r = descale((r - y)*yuvCr + (128 << shift),shift); \
b = descale((b - y)*yuvCb + (128 << shift),shift); \
\
(dst)[0] = CV_FAST_CAST_8U(y); \
(dst)[1] = CV_FAST_CAST_8U(r); \
(dst)[2] = CV_FAST_CAST_8U(b); \
}
#define ICV_CVT_BGR2YCrCb( src, dst ) ICV_CVT_BGR2YCrCb_EX( src, dst, 0 )
#define ICV_CVT_RGB2YCrCb( src, dst ) ICV_CVT_BGR2YCrCb_EX( src, dst, 2 )
#define yuvRCr fix(1.403,shift)
#define yuvGCr (-fix(0.344,shift))
#define yuvGCb (-fix(0.714,shift))
#define yuvBCb fix(1.773,shift)
#define ICV_CVT_YCrCb2BGR_EX( src, dst, blue_idx ) \
{ \
int Y = (src)[0] << shift, Cr = (src)[1] - 128, \
Cb = (src)[2] - 128; \
int b, g, r; \
\
b = descale( Y + yuvBCb*Cb, shift ); \
g = descale( Y + yuvGCr*Cr + yuvGCb*Cb, shift ); \
r = descale( Y + yuvRCr*Cr, shift ); \
\
(dst)[blue_idx] = CV_CAST_8U(b); \
(dst)[1] = CV_CAST_8U(g); \
(dst)[blue_idx^2] = CV_CAST_8U(r); \
}
#define ICV_CVT_YCrCb2BGR( src, dst ) ICV_CVT_YCrCb2BGR_EX( src, dst, 0 )
#define ICV_CVT_YCrCb2RGB( src, dst ) ICV_CVT_YCrCb2BGR_EX( src, dst, 2 )
#define xyzXr fix(0.412411,shift)
#define xyzXg fix(0.357585,shift)
#define xyzXb fix(0.180454,shift)
#define xyzYr fix(0.212649,shift)
#define xyzYg fix(0.715169,shift)
#define xyzYb fix(0.072182,shift)
#define xyzZr fix(0.019332,shift)
#define xyzZg fix(0.119195,shift)
#define xyzZb fix(0.950390,shift)
#define ICV_CVT_BGR2XYZ_EX( src, dst, blue_idx ) \
{ \
int b = (src)[blue_idx], g = (src)[1], \
r = (src)[2^blue_idx]; \
int x, y, z; \
\
x = descale( b*xyzXb + g*xyzXg + r*xyzXr, shift ); \
y = descale( b*xyzYb + g*xyzYg + r*xyzYr, shift ); \
z = descale( b*xyzZb + g*xyzZg + r*xyzZr, shift ); \
\
(dst)[0] = CV_FAST_CAST_8U(x); \
(dst)[1] = CV_FAST_CAST_8U(y); \
(dst)[2] = CV_FAST_CAST_8U(z); \
}
#define ICV_CVT_BGR2XYZ( src, dst ) ICV_CVT_BGR2XYZ_EX( src, dst, 0 )
#define ICV_CVT_RGB2XYZ( src, dst ) ICV_CVT_BGR2XYZ_EX( src, dst, 2 )
#define xyzRx fix(3.240479,shift)
#define xyzRy (-fix(1.53715,shift))
#define xyzRz (-fix(0.498535,shift))
#define xyzGx (-fix(0.969256,shift))
#define xyzGy fix(1.875991,shift)
#define xyzGz fix(0.041556,shift)
#define xyzBx fix(0.055648,shift)
#define xyzBy (-fix(0.204043,shift))
#define xyzBz fix(1.057311,shift)
#define ICV_CVT_XYZ2BGR_EX( src, dst, blue_idx ) \
{ \
int x = (src)[0], y = (src)[1], z = (src)[2]; \
int b, g, r; \
\
b = descale( x*xyzBx + y*xyzBy + z*xyzBz, shift ); \
g = descale( x*xyzGx + y*xyzGy + z*xyzGz, shift ); \
r = descale( x*xyzRx + y*xyzRy + z*xyzRz, shift ); \
\
(dst)[blue_idx] = CV_CAST_8U(b); \
(dst)[1] = CV_CAST_8U(g); \
(dst)[blue_idx^2] = CV_CAST_8U(r); \
}
#define ICV_CVT_XYZ2BGR( src, dst ) ICV_CVT_XYZ2BGR_EX( src, dst, 0 )
#define ICV_CVT_XYZ2RGB( src, dst ) ICV_CVT_XYZ2BGR_EX( src, dst, 2 )
#undef hsv_shift
#define hsv_shift 12
static const int div_table[] = {
0, 1044480, 522240, 348160, 261120, 208896, 174080, 149211,
130560, 116053, 104448, 94953, 87040, 80345, 74606, 69632,
65280, 61440, 58027, 54973, 52224, 49737, 47476, 45412,
43520, 41779, 40172, 38684, 37303, 36017, 34816, 33693,
32640, 31651, 30720, 29842, 29013, 28229, 27486, 26782,
26112, 25475, 24869, 24290, 23738, 23211, 22706, 22223,
21760, 21316, 20890, 20480, 20086, 19707, 19342, 18991,
18651, 18324, 18008, 17703, 17408, 17123, 16846, 16579,
16320, 16069, 15825, 15589, 15360, 15137, 14921, 14711,
14507, 14308, 14115, 13926, 13743, 13565, 13391, 13221,
13056, 12895, 12738, 12584, 12434, 12288, 12145, 12006,
11869, 11736, 11605, 11478, 11353, 11231, 11111, 10995,
10880, 10768, 10658, 10550, 10445, 10341, 10240, 10141,
10043, 9947, 9854, 9761, 9671, 9582, 9495, 9410,
9326, 9243, 9162, 9082, 9004, 8927, 8852, 8777,
8704, 8632, 8561, 8492, 8423, 8356, 8290, 8224,
8160, 8097, 8034, 7973, 7913, 7853, 7795, 7737,
7680, 7624, 7569, 7514, 7461, 7408, 7355, 7304,
7253, 7203, 7154, 7105, 7057, 7010, 6963, 6917,
6872, 6827, 6782, 6739, 6695, 6653, 6611, 6569,
6528, 6487, 6447, 6408, 6369, 6330, 6292, 6254,
6217, 6180, 6144, 6108, 6073, 6037, 6003, 5968,
5935, 5901, 5868, 5835, 5803, 5771, 5739, 5708,
5677, 5646, 5615, 5585, 5556, 5526, 5497, 5468,
5440, 5412, 5384, 5356, 5329, 5302, 5275, 5249,
5222, 5196, 5171, 5145, 5120, 5095, 5070, 5046,
5022, 4998, 4974, 4950, 4927, 4904, 4881, 4858,
4836, 4813, 4791, 4769, 4748, 4726, 4705, 4684,
4663, 4642, 4622, 4601, 4581, 4561, 4541, 4522,
4502, 4483, 4464, 4445, 4426, 4407, 4389, 4370,
4352, 4334, 4316, 4298, 4281, 4263, 4246, 4229,
4212, 4195, 4178, 4161, 4145, 4128, 4112, 4096
};
#define ICV_CVT_BGR2HSV_EX( src, dst, blue_idx ) \
{ \
int b = (src)[blue_idx], g = (src)[1], r = (src)[2^blue_idx]; \
int h, s, v; \
\
int vmin, diff; \
int vr, vg; \
\
v = CV_IMAX( r, g ); \
v = CV_IMAX( v, b ); \
vmin = CV_IMIN( r, g ); \
vmin = CV_IMIN( vmin, b ); \
\
diff = v - vmin; \
vr = v == r ? -1 : 0; \
vg = v == g ? -1 : 0; \
\
s = diff * div_table[v] >> hsv_shift; \
h = (vr & (g - b)) + \
(~vr & ((vg & (b - r + 2 * diff)) + ((~vg) & (r - g + 4 * diff)))); \
h = ((h * div_table[diff] * 15 + (1 << (hsv_shift + 6))) >> (7 + hsv_shift))\
+ (h < 0 ? 30*6 : 0); \
\
(dst)[0] = (uchar)h; \
(dst)[1] = (uchar)s; \
(dst)[2] = (uchar)v; \
}
#define ICV_CVT_BGR2HSV( src, dst ) ICV_CVT_BGR2HSV_EX( src, dst, 0 )
#define ICV_CVT_RGB2HSV( src, dst ) ICV_CVT_BGR2HSV_EX( src, dst, 2 )
#undef lab_shift
#define lab_shift 10
#define labXr fix(0.43391,lab_shift)
#define labXg fix(0.37622,lab_shift)
#define labXb fix(0.18986,lab_shift)
#define labYr fix(0.212649,lab_shift)
#define labYg fix(0.715169,lab_shift)
#define labYb fix(0.072182,lab_shift)
#define labZr fix(0.017756,lab_shift)
#define labZg fix(0.109478,lab_shift)
#define labZb fix(0.872915,lab_shift)
#define labT fix(2.258279,lab_shift)
#define labSmallScale fix(31.27,lab_shift)
#define labSmallShift fix(141.24138,lab_shift)
#define labLScale fix(295.8,lab_shift)
#define labLShift fix(41779.2,lab_shift)
/* 1024*(([0..511]./255)**(1./3)) */
static ushort icvLabCubeRootTab[] = {
0, 161, 203, 232, 256, 276, 293, 308, 322, 335, 347, 359, 369, 379, 389, 398,
406, 415, 423, 430, 438, 445, 452, 459, 465, 472, 478, 484, 490, 496, 501, 507,
512, 517, 523, 528, 533, 538, 542, 547, 552, 556, 561, 565, 570, 574, 578, 582,
586, 590, 594, 598, 602, 606, 610, 614, 617, 621, 625, 628, 632, 635, 639, 642,
645, 649, 652, 655, 659, 662, 665, 668, 671, 674, 677, 680, 684, 686, 689, 692,
695, 698, 701, 704, 707, 710, 712, 715, 718, 720, 723, 726, 728, 731, 734, 736,
739, 741, 744, 747, 749, 752, 754, 756, 759, 761, 764, 766, 769, 771, 773, 776,
778, 780, 782, 785, 787, 789, 792, 794, 796, 798, 800, 803, 805, 807, 809, 811,
813, 815, 818, 820, 822, 824, 826, 828, 830, 832, 834, 836, 838, 840, 842, 844,
846, 848, 850, 852, 854, 856, 857, 859, 861, 863, 865, 867, 869, 871, 872, 874,
876, 878, 880, 882, 883, 885, 887, 889, 891, 892, 894, 896, 898, 899, 901, 903,
904, 906, 908, 910, 911, 913, 915, 916, 918, 920, 921, 923, 925, 926, 928, 929,
931, 933, 934, 936, 938, 939, 941, 942, 944, 945, 947, 949, 950, 952, 953, 955,
956, 958, 959, 961, 962, 964, 965, 967, 968, 970, 971, 973, 974, 976, 977, 979,
980, 982, 983, 985, 986, 987, 989, 990, 992, 993, 995, 996, 997, 999, 1000, 1002,
1003, 1004, 1006, 1007, 1009, 1010, 1011, 1013, 1014, 1015, 1017, 1018, 1019, 1021, 1022, 1024,
1025, 1026, 1028, 1029, 1030, 1031, 1033, 1034, 1035, 1037, 1038, 1039, 1041, 1042, 1043, 1044,
1046, 1047, 1048, 1050, 1051, 1052, 1053, 1055, 1056, 1057, 1058, 1060, 1061, 1062, 1063, 1065,
1066, 1067, 1068, 1070, 1071, 1072, 1073, 1074, 1076, 1077, 1078, 1079, 1081, 1082, 1083, 1084,
1085, 1086, 1088, 1089, 1090, 1091, 1092, 1094, 1095, 1096, 1097, 1098, 1099, 1101, 1102, 1103,
1104, 1105, 1106, 1107, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1117, 1118, 1119, 1120, 1121,
1122, 1123, 1124, 1125, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1138, 1139,
1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1154, 1155, 1156,
1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172,
1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188,
1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204,
1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1215, 1216, 1217, 1218, 1219,
1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1230, 1231, 1232, 1233, 1234,
1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249,
1250, 1251, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1259, 1260, 1261, 1262, 1263,
1264, 1265, 1266, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1273, 1274, 1275, 1276, 1277,
1278, 1279, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1285, 1286, 1287, 1288, 1289, 1290, 1291
};
#define ICV_CVT_BGR2Lab_EX( src, dst, blue_idx ) \
{ \
int b = (src)[blue_idx], g = (src)[1], \
r = (src)[2^blue_idx]; \
int x, y, z, f; \
int l, a; \
\
x = b*labXb + g*labXg + r*labXr; \
y = b*labYb + g*labYg + r*labYr; \
z = b*labZb + g*labZg + r*labZr; \
\
f = x > labT; \
x = descale( x, lab_shift ); \
\
if( f ) \
assert( (unsigned)x < 512 ), x = icvLabCubeRootTab[x]; \
else \
x = descale(x*labSmallScale + labSmallShift,lab_shift); \
\
f = z > labT; \
z = descale( z, lab_shift ); \
\
if( f ) \
assert( (unsigned)z < 512 ), z = icvLabCubeRootTab[z]; \
else \
z = descale(z*labSmallScale + labSmallShift,lab_shift); \
\
f = y > labT; \
y = descale( y, lab_shift ); \
\
if( f ) \
{ \
assert( (unsigned)y < 512 ), y = icvLabCubeRootTab[y]; \
l = descale(y*labLScale - labLShift, 2*lab_shift ); \
} \
else \
{ \
l = descale(y*9,lab_shift); \
y = descale(y*labSmallScale + labSmallShift,lab_shift); \
} \
\
a = descale( 500*(x - y), lab_shift ) + 128; \
b = descale( 200*(y - z), lab_shift ) + 128; \
\
(dst)[0] = CV_CAST_8U(l); \
(dst)[1] = CV_CAST_8U(a); \
(dst)[2] = CV_CAST_8U(b); \
}
#define ICV_CVT_BGR2Lab( src, dst ) ICV_CVT_BGR2Lab_EX( src, dst, 0 )
#define ICV_CVT_RGB2Lab( src, dst ) ICV_CVT_BGR2Lab_EX( src, dst, 2 )
#define ICV_COLORCVT_FUNC( cvt_case, flavor, arrtype, src_cn, dst_cn ) \
static CvStatus CV_STDCALL \
icvCvt##_##cvt_case##_##flavor( const arrtype* src, int srcstep, \
arrtype* dst, int dststep, CvSize size ) \
{ \
for( ; size.height--; (char*&)src += srcstep, (char*&)dst += dststep ) \
{ \
int i; \
for( i = 0; i < size.width; i++ ) \
ICV_CVT_##cvt_case( src + i*(src_cn), dst + i*(dst_cn) ); \
} \
\
return CV_OK; \
}
ICV_COLORCVT_FUNC( BGR2RGB, 8u_C3R, uchar, 3, 3 )
ICV_COLORCVT_FUNC( BGR2BGRA, 8u_C3C4R, uchar, 3, 4 )
ICV_COLORCVT_FUNC( BGRA2BGR, 8u_C4C3R, uchar, 4, 3 )
ICV_COLORCVT_FUNC( BGR2RGBA, 8u_C3C4R, uchar, 3, 4 )
ICV_COLORCVT_FUNC( BGRA2RGBA, 8u_C4C4R, uchar, 4, 4 )
ICV_COLORCVT_FUNC( RGBA2BGR, 8u_C4C3R, uchar, 4, 3 )
ICV_COLORCVT_FUNC( BGR2GRAY, 8u_C3C1R, uchar, 3, 1 )
ICV_COLORCVT_FUNC( RGB2GRAY, 8u_C3C1R, uchar, 3, 1 )
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?