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