Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/modules/imgproc/src/color.cpp
16354 views
1
// This file is part of OpenCV project.
2
// It is subject to the license terms in the LICENSE file found in the top-level directory
3
// of this distribution and at http://opencv.org/license.html
4
5
#include "precomp.hpp"
6
#include "color.hpp"
7
8
namespace cv
9
{
10
11
#ifdef HAVE_OPENCL
12
13
static bool ocl_cvtColor( InputArray _src, OutputArray _dst, int code, int dcn )
14
{
15
int bidx = swapBlue(code) ? 2 : 0;
16
17
switch (code)
18
{
19
case COLOR_BGR2BGRA: case COLOR_RGB2BGRA: case COLOR_BGRA2BGR:
20
case COLOR_RGBA2BGR: case COLOR_RGB2BGR: case COLOR_BGRA2RGBA:
21
{
22
bool reverse = !(code == COLOR_BGR2BGRA || code == COLOR_BGRA2BGR);
23
return oclCvtColorBGR2BGR(_src, _dst, dcn, reverse);
24
}
25
case COLOR_BGR5652BGR: case COLOR_BGR5552BGR: case COLOR_BGR5652RGB: case COLOR_BGR5552RGB:
26
case COLOR_BGR5652BGRA: case COLOR_BGR5552BGRA: case COLOR_BGR5652RGBA: case COLOR_BGR5552RGBA:
27
return oclCvtColor5x52BGR(_src, _dst, dcn, bidx, greenBits(code));
28
29
case COLOR_BGR2BGR565: case COLOR_BGR2BGR555: case COLOR_RGB2BGR565: case COLOR_RGB2BGR555:
30
case COLOR_BGRA2BGR565: case COLOR_BGRA2BGR555: case COLOR_RGBA2BGR565: case COLOR_RGBA2BGR555:
31
return oclCvtColorBGR25x5(_src, _dst, bidx, greenBits(code) );
32
33
case COLOR_BGR5652GRAY: case COLOR_BGR5552GRAY:
34
return oclCvtColor5x52Gray(_src, _dst, greenBits(code));
35
36
case COLOR_GRAY2BGR565: case COLOR_GRAY2BGR555:
37
return oclCvtColorGray25x5(_src, _dst, greenBits(code));
38
39
case COLOR_BGR2GRAY: case COLOR_BGRA2GRAY:
40
case COLOR_RGB2GRAY: case COLOR_RGBA2GRAY:
41
return oclCvtColorBGR2Gray(_src, _dst, bidx);
42
43
case COLOR_GRAY2BGR:
44
case COLOR_GRAY2BGRA:
45
return oclCvtColorGray2BGR(_src, _dst, dcn);
46
47
case COLOR_BGR2YUV:
48
case COLOR_RGB2YUV:
49
return oclCvtColorBGR2YUV(_src, _dst, bidx);
50
51
case COLOR_YUV2BGR:
52
case COLOR_YUV2RGB:
53
return oclCvtColorYUV2BGR(_src, _dst, dcn, bidx);
54
55
case COLOR_YUV2RGB_NV12: case COLOR_YUV2BGR_NV12: case COLOR_YUV2RGB_NV21: case COLOR_YUV2BGR_NV21:
56
case COLOR_YUV2RGBA_NV12: case COLOR_YUV2BGRA_NV12: case COLOR_YUV2RGBA_NV21: case COLOR_YUV2BGRA_NV21:
57
{
58
int uidx = code == COLOR_YUV2RGBA_NV21 || code == COLOR_YUV2RGB_NV21 ||
59
code == COLOR_YUV2BGRA_NV21 || code == COLOR_YUV2BGR_NV21 ? 1 : 0;
60
return oclCvtColorTwoPlaneYUV2BGR(_src, _dst, dcn, bidx, uidx);
61
}
62
case COLOR_YUV2BGR_YV12: case COLOR_YUV2RGB_YV12: case COLOR_YUV2BGRA_YV12: case COLOR_YUV2RGBA_YV12:
63
case COLOR_YUV2BGR_IYUV: case COLOR_YUV2RGB_IYUV: case COLOR_YUV2BGRA_IYUV: case COLOR_YUV2RGBA_IYUV:
64
{
65
int uidx = code == COLOR_YUV2BGRA_YV12 || code == COLOR_YUV2BGR_YV12 ||
66
code == COLOR_YUV2RGBA_YV12 || code == COLOR_YUV2RGB_YV12 ? 1 : 0;
67
return oclCvtColorThreePlaneYUV2BGR(_src, _dst, dcn, bidx, uidx);
68
}
69
case COLOR_YUV2GRAY_420:
70
{
71
return oclCvtColorYUV2Gray_420(_src, _dst);
72
}
73
case COLOR_RGB2YUV_YV12: case COLOR_BGR2YUV_YV12: case COLOR_RGBA2YUV_YV12: case COLOR_BGRA2YUV_YV12:
74
case COLOR_RGB2YUV_IYUV: case COLOR_BGR2YUV_IYUV: case COLOR_RGBA2YUV_IYUV: case COLOR_BGRA2YUV_IYUV:
75
{
76
int uidx = code == COLOR_RGBA2YUV_YV12 || code == COLOR_RGB2YUV_YV12 ||
77
code == COLOR_BGRA2YUV_YV12 || code == COLOR_BGR2YUV_YV12 ? 1 : 0;
78
return oclCvtColorBGR2ThreePlaneYUV(_src, _dst, bidx, uidx );
79
}
80
case COLOR_YUV2RGB_UYVY: case COLOR_YUV2BGR_UYVY: case COLOR_YUV2RGBA_UYVY: case COLOR_YUV2BGRA_UYVY:
81
case COLOR_YUV2RGB_YUY2: case COLOR_YUV2BGR_YUY2: case COLOR_YUV2RGB_YVYU: case COLOR_YUV2BGR_YVYU:
82
case COLOR_YUV2RGBA_YUY2: case COLOR_YUV2BGRA_YUY2: case COLOR_YUV2RGBA_YVYU: case COLOR_YUV2BGRA_YVYU:
83
{
84
int yidx = (code==COLOR_YUV2RGB_UYVY || code==COLOR_YUV2RGBA_UYVY ||
85
code==COLOR_YUV2BGR_UYVY || code==COLOR_YUV2BGRA_UYVY) ? 1 : 0;
86
int uidx = (code==COLOR_YUV2RGB_YVYU || code==COLOR_YUV2RGBA_YVYU ||
87
code==COLOR_YUV2BGR_YVYU || code==COLOR_YUV2BGRA_YVYU) ? 2 : 0;
88
uidx = 1 - yidx + uidx;
89
90
return oclCvtColorOnePlaneYUV2BGR(_src, _dst, dcn, bidx, uidx, yidx);
91
}
92
case COLOR_BGR2YCrCb:
93
case COLOR_RGB2YCrCb:
94
return oclCvtColorBGR2YCrCb(_src, _dst, bidx);
95
96
case COLOR_YCrCb2BGR:
97
case COLOR_YCrCb2RGB:
98
return oclCvtcolorYCrCb2BGR(_src, _dst, dcn, bidx);
99
100
case COLOR_BGR2XYZ:
101
case COLOR_RGB2XYZ:
102
return oclCvtColorBGR2XYZ(_src, _dst, bidx);
103
104
case COLOR_XYZ2BGR:
105
case COLOR_XYZ2RGB:
106
return oclCvtColorXYZ2BGR(_src, _dst, dcn, bidx);
107
108
case COLOR_BGR2HSV: case COLOR_BGR2HSV_FULL:
109
case COLOR_RGB2HSV: case COLOR_RGB2HSV_FULL:
110
return oclCvtColorBGR2HSV(_src, _dst, bidx, isFullRangeHSV(code));
111
112
case COLOR_BGR2HLS: case COLOR_BGR2HLS_FULL:
113
case COLOR_RGB2HLS: case COLOR_RGB2HLS_FULL:
114
return oclCvtColorBGR2HLS(_src, _dst, bidx, isFullRangeHSV(code));
115
116
case COLOR_HSV2BGR: case COLOR_HSV2BGR_FULL:
117
case COLOR_HSV2RGB: case COLOR_HSV2RGB_FULL:
118
return oclCvtColorHSV2BGR(_src, _dst, dcn, bidx, isFullRangeHSV(code));
119
120
case COLOR_HLS2BGR: case COLOR_HLS2BGR_FULL:
121
case COLOR_HLS2RGB: case COLOR_HLS2RGB_FULL:
122
return oclCvtColorHLS2BGR(_src, _dst, dcn, bidx, isFullRangeHSV(code));
123
124
case COLOR_RGBA2mRGBA:
125
return oclCvtColorRGBA2mRGBA(_src, _dst);
126
127
case COLOR_mRGBA2RGBA:
128
return oclCvtColormRGBA2RGBA(_src, _dst);
129
130
case COLOR_BGR2Lab: case COLOR_LBGR2Lab:
131
case COLOR_RGB2Lab: case COLOR_LRGB2Lab:
132
return oclCvtColorBGR2Lab(_src, _dst, bidx, is_sRGB(code));
133
134
case COLOR_BGR2Luv: case COLOR_LBGR2Luv:
135
case COLOR_RGB2Luv: case COLOR_LRGB2Luv:
136
return oclCvtColorBGR2Luv(_src, _dst, bidx, is_sRGB(code));
137
138
case COLOR_Lab2BGR: case COLOR_Lab2LBGR:
139
case COLOR_Lab2RGB: case COLOR_Lab2LRGB:
140
return oclCvtColorLab2BGR(_src, _dst, dcn, bidx, is_sRGB(code));
141
142
case COLOR_Luv2BGR: case COLOR_Luv2LBGR:
143
case COLOR_Luv2RGB: case COLOR_Luv2LRGB:
144
return oclCvtColorLuv2BGR(_src, _dst, dcn, bidx, is_sRGB(code));
145
146
default:
147
return false;
148
}
149
}
150
151
#endif
152
153
154
// helper function for dual-plane modes
155
156
void cvtColorTwoPlane( InputArray _ysrc, InputArray _uvsrc, OutputArray _dst, int code )
157
{
158
// only YUV420 is currently supported
159
switch (code)
160
{
161
case COLOR_YUV2BGR_NV21: case COLOR_YUV2RGB_NV21: case COLOR_YUV2BGR_NV12: case COLOR_YUV2RGB_NV12:
162
case COLOR_YUV2BGRA_NV21: case COLOR_YUV2RGBA_NV21: case COLOR_YUV2BGRA_NV12: case COLOR_YUV2RGBA_NV12:
163
break;
164
default:
165
CV_Error( CV_StsBadFlag, "Unknown/unsupported color conversion code" );
166
return;
167
}
168
169
cvtColorTwoPlaneYUV2BGRpair(_ysrc, _uvsrc, _dst, dstChannels(code), swapBlue(code), uIndex(code));
170
}
171
172
173
//////////////////////////////////////////////////////////////////////////////////////////
174
// The main function //
175
//////////////////////////////////////////////////////////////////////////////////////////
176
177
void cvtColor( InputArray _src, OutputArray _dst, int code, int dcn )
178
{
179
CV_INSTRUMENT_REGION();
180
181
CV_Assert(!_src.empty());
182
183
if(dcn <= 0)
184
dcn = dstChannels(code);
185
186
CV_OCL_RUN( _src.dims() <= 2 && _dst.isUMat() &&
187
!(CV_MAT_DEPTH(_src.type()) == CV_8U && (code == COLOR_Luv2BGR || code == COLOR_Luv2RGB)),
188
ocl_cvtColor(_src, _dst, code, dcn) )
189
190
switch( code )
191
{
192
case COLOR_BGR2BGRA: case COLOR_RGB2BGRA: case COLOR_BGRA2BGR:
193
case COLOR_RGBA2BGR: case COLOR_RGB2BGR: case COLOR_BGRA2RGBA:
194
cvtColorBGR2BGR(_src, _dst, dcn, swapBlue(code));
195
break;
196
197
case COLOR_BGR2BGR565: case COLOR_BGR2BGR555: case COLOR_BGRA2BGR565: case COLOR_BGRA2BGR555:
198
case COLOR_RGB2BGR565: case COLOR_RGB2BGR555: case COLOR_RGBA2BGR565: case COLOR_RGBA2BGR555:
199
cvtColorBGR25x5(_src, _dst, swapBlue(code), greenBits(code));
200
break;
201
202
case COLOR_BGR5652BGR: case COLOR_BGR5552BGR: case COLOR_BGR5652BGRA: case COLOR_BGR5552BGRA:
203
case COLOR_BGR5652RGB: case COLOR_BGR5552RGB: case COLOR_BGR5652RGBA: case COLOR_BGR5552RGBA:
204
cvtColor5x52BGR(_src, _dst, dcn, swapBlue(code), greenBits(code));
205
break;
206
207
case COLOR_BGR2GRAY: case COLOR_BGRA2GRAY:
208
case COLOR_RGB2GRAY: case COLOR_RGBA2GRAY:
209
cvtColorBGR2Gray(_src, _dst, swapBlue(code));
210
break;
211
212
case COLOR_BGR5652GRAY:
213
case COLOR_BGR5552GRAY:
214
cvtColor5x52Gray(_src, _dst, greenBits(code));
215
break;
216
217
case COLOR_GRAY2BGR:
218
case COLOR_GRAY2BGRA:
219
cvtColorGray2BGR(_src, _dst, dcn);
220
break;
221
222
case COLOR_GRAY2BGR565:
223
case COLOR_GRAY2BGR555:
224
cvtColorGray25x5(_src, _dst, greenBits(code));
225
break;
226
227
case COLOR_BGR2YCrCb: case COLOR_RGB2YCrCb:
228
case COLOR_BGR2YUV: case COLOR_RGB2YUV:
229
cvtColorBGR2YUV(_src, _dst, swapBlue(code), code == COLOR_BGR2YCrCb || code == COLOR_RGB2YCrCb);
230
break;
231
232
case COLOR_YCrCb2BGR: case COLOR_YCrCb2RGB:
233
case COLOR_YUV2BGR: case COLOR_YUV2RGB:
234
cvtColorYUV2BGR(_src, _dst, dcn, swapBlue(code), code == COLOR_YCrCb2BGR || code == COLOR_YCrCb2RGB);
235
break;
236
237
case COLOR_BGR2XYZ:
238
case COLOR_RGB2XYZ:
239
cvtColorBGR2XYZ(_src, _dst, swapBlue(code));
240
break;
241
242
case COLOR_XYZ2BGR:
243
case COLOR_XYZ2RGB:
244
cvtColorXYZ2BGR(_src, _dst, dcn, swapBlue(code));
245
break;
246
247
case COLOR_BGR2HSV: case COLOR_BGR2HSV_FULL:
248
case COLOR_RGB2HSV: case COLOR_RGB2HSV_FULL:
249
cvtColorBGR2HSV(_src, _dst, swapBlue(code), isFullRangeHSV(code));
250
break;
251
252
case COLOR_BGR2HLS: case COLOR_BGR2HLS_FULL:
253
case COLOR_RGB2HLS: case COLOR_RGB2HLS_FULL:
254
cvtColorBGR2HLS(_src, _dst, swapBlue(code), isFullRangeHSV(code));
255
break;
256
257
case COLOR_HSV2BGR: case COLOR_HSV2BGR_FULL:
258
case COLOR_HSV2RGB: case COLOR_HSV2RGB_FULL:
259
cvtColorHSV2BGR(_src, _dst, dcn, swapBlue(code), isFullRangeHSV(code));
260
break;
261
262
case COLOR_HLS2BGR: case COLOR_HLS2BGR_FULL:
263
case COLOR_HLS2RGB: case COLOR_HLS2RGB_FULL:
264
cvtColorHLS2BGR(_src, _dst, dcn, swapBlue(code), isFullRangeHSV(code));
265
break;
266
267
case COLOR_BGR2Lab: case COLOR_LBGR2Lab:
268
case COLOR_RGB2Lab: case COLOR_LRGB2Lab:
269
cvtColorBGR2Lab(_src, _dst, swapBlue(code), is_sRGB(code));
270
break;
271
272
case COLOR_BGR2Luv: case COLOR_LBGR2Luv:
273
case COLOR_RGB2Luv: case COLOR_LRGB2Luv:
274
cvtColorBGR2Luv(_src, _dst, swapBlue(code), is_sRGB(code));
275
break;
276
277
case COLOR_Lab2BGR: case COLOR_Lab2LBGR:
278
case COLOR_Lab2RGB: case COLOR_Lab2LRGB:
279
cvtColorLab2BGR(_src, _dst, dcn, swapBlue(code), is_sRGB(code));
280
break;
281
282
case COLOR_Luv2BGR: case COLOR_Luv2LBGR:
283
case COLOR_Luv2RGB: case COLOR_Luv2LRGB:
284
cvtColorLuv2BGR(_src, _dst, dcn, swapBlue(code), is_sRGB(code));
285
break;
286
287
case COLOR_BayerBG2GRAY: case COLOR_BayerGB2GRAY: case COLOR_BayerRG2GRAY: case COLOR_BayerGR2GRAY:
288
case COLOR_BayerBG2BGR: case COLOR_BayerGB2BGR: case COLOR_BayerRG2BGR: case COLOR_BayerGR2BGR:
289
case COLOR_BayerBG2BGR_VNG: case COLOR_BayerGB2BGR_VNG: case COLOR_BayerRG2BGR_VNG: case COLOR_BayerGR2BGR_VNG:
290
case COLOR_BayerBG2BGR_EA: case COLOR_BayerGB2BGR_EA: case COLOR_BayerRG2BGR_EA: case COLOR_BayerGR2BGR_EA:
291
case COLOR_BayerBG2BGRA: case COLOR_BayerGB2BGRA: case COLOR_BayerRG2BGRA: case COLOR_BayerGR2BGRA:
292
{
293
Mat src;
294
if (_src.getObj() == _dst.getObj()) // inplace processing (#6653)
295
_src.copyTo(src);
296
else
297
src = _src.getMat();
298
demosaicing(src, _dst, code, dcn);
299
break;
300
}
301
302
case COLOR_YUV2BGR_NV21: case COLOR_YUV2RGB_NV21: case COLOR_YUV2BGR_NV12: case COLOR_YUV2RGB_NV12:
303
case COLOR_YUV2BGRA_NV21: case COLOR_YUV2RGBA_NV21: case COLOR_YUV2BGRA_NV12: case COLOR_YUV2RGBA_NV12:
304
// http://www.fourcc.org/yuv.php#NV21 == yuv420sp -> a plane of 8 bit Y samples followed by an interleaved V/U plane containing 8 bit 2x2 subsampled chroma samples
305
// http://www.fourcc.org/yuv.php#NV12 -> a plane of 8 bit Y samples followed by an interleaved U/V plane containing 8 bit 2x2 subsampled colour difference samples
306
cvtColorTwoPlaneYUV2BGR(_src, _dst, dcn, swapBlue(code), uIndex(code));
307
break;
308
309
case COLOR_YUV2BGR_YV12: case COLOR_YUV2RGB_YV12: case COLOR_YUV2BGRA_YV12: case COLOR_YUV2RGBA_YV12:
310
case COLOR_YUV2BGR_IYUV: case COLOR_YUV2RGB_IYUV: case COLOR_YUV2BGRA_IYUV: case COLOR_YUV2RGBA_IYUV:
311
//http://www.fourcc.org/yuv.php#YV12 == yuv420p -> It comprises an NxM Y plane followed by (N/2)x(M/2) V and U planes.
312
//http://www.fourcc.org/yuv.php#IYUV == I420 -> It comprises an NxN Y plane followed by (N/2)x(N/2) U and V planes
313
cvtColorThreePlaneYUV2BGR(_src, _dst, dcn, swapBlue(code), uIndex(code));
314
break;
315
316
case COLOR_YUV2GRAY_420:
317
cvtColorYUV2Gray_420(_src, _dst);
318
break;
319
320
case COLOR_RGB2YUV_YV12: case COLOR_BGR2YUV_YV12: case COLOR_RGBA2YUV_YV12: case COLOR_BGRA2YUV_YV12:
321
case COLOR_RGB2YUV_IYUV: case COLOR_BGR2YUV_IYUV: case COLOR_RGBA2YUV_IYUV: case COLOR_BGRA2YUV_IYUV:
322
cvtColorBGR2ThreePlaneYUV(_src, _dst, swapBlue(code), uIndex(code));
323
break;
324
325
case COLOR_YUV2RGB_UYVY: case COLOR_YUV2BGR_UYVY: case COLOR_YUV2RGBA_UYVY: case COLOR_YUV2BGRA_UYVY:
326
case COLOR_YUV2RGB_YUY2: case COLOR_YUV2BGR_YUY2: case COLOR_YUV2RGB_YVYU: case COLOR_YUV2BGR_YVYU:
327
case COLOR_YUV2RGBA_YUY2: case COLOR_YUV2BGRA_YUY2: case COLOR_YUV2RGBA_YVYU: case COLOR_YUV2BGRA_YVYU:
328
//http://www.fourcc.org/yuv.php#UYVY
329
//http://www.fourcc.org/yuv.php#YUY2
330
//http://www.fourcc.org/yuv.php#YVYU
331
{
332
int ycn = (code==COLOR_YUV2RGB_UYVY || code==COLOR_YUV2BGR_UYVY ||
333
code==COLOR_YUV2RGBA_UYVY || code==COLOR_YUV2BGRA_UYVY) ? 1 : 0;
334
cvtColorOnePlaneYUV2BGR(_src, _dst, dcn, swapBlue(code), uIndex(code), ycn);
335
break;
336
}
337
338
case COLOR_YUV2GRAY_UYVY:
339
case COLOR_YUV2GRAY_YUY2:
340
cvtColorYUV2Gray_ch(_src, _dst, code == COLOR_YUV2GRAY_UYVY ? 1 : 0);
341
break;
342
343
case COLOR_RGBA2mRGBA:
344
cvtColorRGBA2mRGBA(_src, _dst);
345
break;
346
347
case COLOR_mRGBA2RGBA:
348
cvtColormRGBA2RGBA(_src, _dst);
349
break;
350
default:
351
CV_Error( CV_StsBadFlag, "Unknown/unsupported color conversion code" );
352
}
353
}
354
} //namespace cv
355
356
357
CV_IMPL void
358
cvCvtColor( const CvArr* srcarr, CvArr* dstarr, int code )
359
{
360
cv::Mat src = cv::cvarrToMat(srcarr), dst0 = cv::cvarrToMat(dstarr), dst = dst0;
361
CV_Assert( src.depth() == dst.depth() );
362
363
cv::cvtColor(src, dst, code, dst.channels());
364
CV_Assert( dst.data == dst0.data );
365
}
366
367