1 /*M///////////////////////////////////////////////////////////////////////////////////////
2 //
3 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4 //
5 //  By downloading, copying, installing or using the software you agree to this license.
6 //  If you do not agree to this license, do not download, install,
7 //  copy or use the software.
8 //
9 //
10 //                           License Agreement
11 //                For Open Source Computer Vision Library
12 //
13 // Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
14 // Copyright (C) 2009, Willow Garage Inc., all rights reserved.
15 // Third party copyrights are property of their respective owners.
16 //
17 // Redistribution and use in source and binary forms, with or without modification,
18 // are permitted provided that the following conditions are met:
19 //
20 //   * Redistribution's of source code must retain the above copyright notice,
21 //     this list of conditions and the following disclaimer.
22 //
23 //   * Redistribution's in binary form must reproduce the above copyright notice,
24 //     this list of conditions and the following disclaimer in the documentation
25 //     and/or other materials provided with the distribution.
26 //
27 //   * The name of the copyright holders may not be used to endorse or promote products
28 //     derived from this software without specific prior written permission.
29 //
30 // This software is provided by the copyright holders and contributors "as is" and
31 // any express or implied warranties, including, but not limited to, the implied
32 // warranties of merchantability and fitness for a particular purpose are disclaimed.
33 // In no event shall the Intel Corporation or contributors be liable for any direct,
34 // indirect, incidental, special, exemplary, or consequential damages
35 // (including, but not limited to, procurement of substitute goods or services;
36 // loss of use, data, or profits; or business interruption) however caused
37 // and on any theory of liability, whether in contract, strict liability,
38 // or tort (including negligence or otherwise) arising in any way out of
39 // the use of this software, even if advised of the possibility of such damage.
40 //
41 //M*/
42 
43 #include "precomp.hpp"
44 
45 using namespace cv;
46 using namespace cv::cuda;
47 
48 #if !defined (HAVE_CUDA) || defined (CUDA_DISABLER)
49 
cvtColor(InputArray,OutputArray,int,int,Stream &)50 void cv::cuda::cvtColor(InputArray, OutputArray, int, int, Stream&) { throw_no_cuda(); }
51 
demosaicing(InputArray,OutputArray,int,int,Stream &)52 void cv::cuda::demosaicing(InputArray, OutputArray, int, int, Stream&) { throw_no_cuda(); }
53 
swapChannels(InputOutputArray,const int[],Stream &)54 void cv::cuda::swapChannels(InputOutputArray, const int[], Stream&) { throw_no_cuda(); }
55 
gammaCorrection(InputArray,OutputArray,bool,Stream &)56 void cv::cuda::gammaCorrection(InputArray, OutputArray, bool, Stream&) { throw_no_cuda(); }
57 
alphaComp(InputArray,InputArray,OutputArray,int,Stream &)58 void cv::cuda::alphaComp(InputArray, InputArray, OutputArray, int, Stream&) { throw_no_cuda(); }
59 
60 
61 #else /* !defined (HAVE_CUDA) */
62 
63 #include "cvt_color_internal.h"
64 
65 namespace cv { namespace cuda {
66     namespace device
67     {
68         template <int cn>
69         void Bayer2BGR_8u_gpu(PtrStepSzb src, PtrStepSzb dst, bool blue_last, bool start_with_green, cudaStream_t stream);
70         template <int cn>
71         void Bayer2BGR_16u_gpu(PtrStepSzb src, PtrStepSzb dst, bool blue_last, bool start_with_green, cudaStream_t stream);
72 
73         template <int cn>
74         void MHCdemosaic(PtrStepSzb src, int2 sourceOffset, PtrStepSzb dst, int2 firstRed, cudaStream_t stream);
75     }
76 }}
77 
78 using namespace ::cv::cuda::device;
79 
80 namespace
81 {
82     typedef void (*gpu_func_t)(const GpuMat& _src, GpuMat& _dst, Stream& stream);
83 
BGR_to_RGB(InputArray _src,OutputArray _dst,int,Stream & stream)84     void BGR_to_RGB(InputArray _src, OutputArray _dst, int, Stream& stream)
85     {
86         using namespace cv::cuda::device;
87         static const gpu_func_t funcs[] = {BGR_to_RGB_8u, 0, BGR_to_RGB_16u, 0, 0, BGR_to_RGB_32f};
88 
89         GpuMat src = _src.getGpuMat();
90 
91         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
92         CV_Assert( src.channels() == 3 );
93 
94         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), 3));
95         GpuMat dst = _dst.getGpuMat();
96 
97         funcs[src.depth()](src, dst, stream);
98     }
99 
BGR_to_BGRA(InputArray _src,OutputArray _dst,int,Stream & stream)100     void BGR_to_BGRA(InputArray _src, OutputArray _dst, int, Stream& stream)
101     {
102         using namespace cv::cuda::device;
103         static const gpu_func_t funcs[] = {BGR_to_BGRA_8u, 0, BGR_to_BGRA_16u, 0, 0, BGR_to_BGRA_32f};
104 
105         GpuMat src = _src.getGpuMat();
106 
107         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
108         CV_Assert( src.channels() == 3 );
109 
110         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), 4));
111         GpuMat dst = _dst.getGpuMat();
112 
113         funcs[src.depth()](src, dst, stream);
114     }
115 
BGR_to_RGBA(InputArray _src,OutputArray _dst,int,Stream & stream)116     void BGR_to_RGBA(InputArray _src, OutputArray _dst, int, Stream& stream)
117     {
118         using namespace cv::cuda::device;
119         static const gpu_func_t funcs[] = {BGR_to_RGBA_8u, 0, BGR_to_RGBA_16u, 0, 0, BGR_to_RGBA_32f};
120 
121         GpuMat src = _src.getGpuMat();
122 
123         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
124         CV_Assert( src.channels() == 3 );
125 
126         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), 4));
127         GpuMat dst = _dst.getGpuMat();
128 
129         funcs[src.depth()](src, dst, stream);
130     }
131 
BGRA_to_BGR(InputArray _src,OutputArray _dst,int,Stream & stream)132     void BGRA_to_BGR(InputArray _src, OutputArray _dst, int, Stream& stream)
133     {
134         using namespace cv::cuda::device;
135         static const gpu_func_t funcs[] = {BGRA_to_BGR_8u, 0, BGRA_to_BGR_16u, 0, 0, BGRA_to_BGR_32f};
136 
137         GpuMat src = _src.getGpuMat();
138 
139         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
140         CV_Assert( src.channels() == 4 );
141 
142         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), 3));
143         GpuMat dst = _dst.getGpuMat();
144 
145         funcs[src.depth()](src, dst, stream);
146     }
147 
BGRA_to_RGB(InputArray _src,OutputArray _dst,int,Stream & stream)148     void BGRA_to_RGB(InputArray _src, OutputArray _dst, int, Stream& stream)
149     {
150         using namespace cv::cuda::device;
151         static const gpu_func_t funcs[] = {BGRA_to_RGB_8u, 0, BGRA_to_RGB_16u, 0, 0, BGRA_to_RGB_32f};
152 
153         GpuMat src = _src.getGpuMat();
154 
155         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
156         CV_Assert( src.channels() == 4 );
157 
158         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), 3));
159         GpuMat dst = _dst.getGpuMat();
160 
161         funcs[src.depth()](src, dst, stream);
162     }
163 
BGRA_to_RGBA(InputArray _src,OutputArray _dst,int,Stream & stream)164     void BGRA_to_RGBA(InputArray _src, OutputArray _dst, int, Stream& stream)
165     {
166         using namespace cv::cuda::device;
167         static const gpu_func_t funcs[] = {BGRA_to_RGBA_8u, 0, BGRA_to_RGBA_16u, 0, 0, BGRA_to_RGBA_32f};
168 
169         GpuMat src = _src.getGpuMat();
170 
171         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
172         CV_Assert( src.channels() == 4 );
173 
174         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), 4));
175         GpuMat dst = _dst.getGpuMat();
176 
177         funcs[src.depth()](src, dst, stream);
178     }
179 
BGR_to_BGR555(InputArray _src,OutputArray _dst,int,Stream & stream)180     void BGR_to_BGR555(InputArray _src, OutputArray _dst, int, Stream& stream)
181     {
182         GpuMat src = _src.getGpuMat();
183 
184         CV_Assert( src.depth() == CV_8U );
185         CV_Assert( src.channels() == 3 );
186 
187         _dst.create(src.size(), CV_8UC2);
188         GpuMat dst = _dst.getGpuMat();
189 
190         cv::cuda::device::BGR_to_BGR555(src, dst, stream);
191     }
192 
BGR_to_BGR565(InputArray _src,OutputArray _dst,int,Stream & stream)193     void BGR_to_BGR565(InputArray _src, OutputArray _dst, int, Stream& stream)
194     {
195         GpuMat src = _src.getGpuMat();
196 
197         CV_Assert( src.depth() == CV_8U );
198         CV_Assert( src.channels() == 3 );
199 
200         _dst.create(src.size(), CV_8UC2);
201         GpuMat dst = _dst.getGpuMat();
202 
203         cv::cuda::device::BGR_to_BGR565(src, dst, stream);
204     }
205 
RGB_to_BGR555(InputArray _src,OutputArray _dst,int,Stream & stream)206     void RGB_to_BGR555(InputArray _src, OutputArray _dst, int, Stream& stream)
207     {
208         GpuMat src = _src.getGpuMat();
209 
210         CV_Assert( src.depth() == CV_8U );
211         CV_Assert( src.channels() == 3 );
212 
213         _dst.create(src.size(), CV_8UC2);
214         GpuMat dst = _dst.getGpuMat();
215 
216         cv::cuda::device::RGB_to_BGR555(src, dst, stream);
217     }
218 
RGB_to_BGR565(InputArray _src,OutputArray _dst,int,Stream & stream)219     void RGB_to_BGR565(InputArray _src, OutputArray _dst, int, Stream& stream)
220     {
221         GpuMat src = _src.getGpuMat();
222 
223         CV_Assert( src.depth() == CV_8U );
224         CV_Assert( src.channels() == 3 );
225 
226         _dst.create(src.size(), CV_8UC2);
227         GpuMat dst = _dst.getGpuMat();
228 
229         cv::cuda::device::RGB_to_BGR565(src, dst, stream);
230     }
231 
BGRA_to_BGR555(InputArray _src,OutputArray _dst,int,Stream & stream)232     void BGRA_to_BGR555(InputArray _src, OutputArray _dst, int, Stream& stream)
233     {
234         GpuMat src = _src.getGpuMat();
235 
236         CV_Assert( src.depth() == CV_8U );
237         CV_Assert( src.channels() == 4 );
238 
239         _dst.create(src.size(), CV_8UC2);
240         GpuMat dst = _dst.getGpuMat();
241 
242         cv::cuda::device::BGRA_to_BGR555(src, dst, stream);
243     }
244 
BGRA_to_BGR565(InputArray _src,OutputArray _dst,int,Stream & stream)245     void BGRA_to_BGR565(InputArray _src, OutputArray _dst, int, Stream& stream)
246     {
247         GpuMat src = _src.getGpuMat();
248 
249         CV_Assert( src.depth() == CV_8U );
250         CV_Assert( src.channels() == 4 );
251 
252         _dst.create(src.size(), CV_8UC2);
253         GpuMat dst = _dst.getGpuMat();
254 
255         cv::cuda::device::BGRA_to_BGR565(src, dst, stream);
256     }
257 
RGBA_to_BGR555(InputArray _src,OutputArray _dst,int,Stream & stream)258     void RGBA_to_BGR555(InputArray _src, OutputArray _dst, int, Stream& stream)
259     {
260         GpuMat src = _src.getGpuMat();
261 
262         CV_Assert( src.depth() == CV_8U );
263         CV_Assert( src.channels() == 4 );
264 
265         _dst.create(src.size(), CV_8UC2);
266         GpuMat dst = _dst.getGpuMat();
267 
268         cv::cuda::device::RGBA_to_BGR555(src, dst, stream);
269     }
270 
RGBA_to_BGR565(InputArray _src,OutputArray _dst,int,Stream & stream)271     void RGBA_to_BGR565(InputArray _src, OutputArray _dst, int, Stream& stream)
272     {
273         GpuMat src = _src.getGpuMat();
274 
275         CV_Assert( src.depth() == CV_8U );
276         CV_Assert( src.channels() == 4 );
277 
278         _dst.create(src.size(), CV_8UC2);
279         GpuMat dst = _dst.getGpuMat();
280 
281         cv::cuda::device::RGBA_to_BGR565(src, dst, stream);
282     }
283 
BGR555_to_RGB(InputArray _src,OutputArray _dst,int,Stream & stream)284     void BGR555_to_RGB(InputArray _src, OutputArray _dst, int, Stream& stream)
285     {
286         GpuMat src = _src.getGpuMat();
287 
288         CV_Assert( src.depth() == CV_8U );
289         CV_Assert( src.channels() == 2 );
290 
291         _dst.create(src.size(), CV_8UC3);
292         GpuMat dst = _dst.getGpuMat();
293 
294         cv::cuda::device::BGR555_to_RGB(src, dst, stream);
295     }
296 
BGR565_to_RGB(InputArray _src,OutputArray _dst,int,Stream & stream)297     void BGR565_to_RGB(InputArray _src, OutputArray _dst, int, Stream& stream)
298     {
299         GpuMat src = _src.getGpuMat();
300 
301         CV_Assert( src.depth() == CV_8U );
302         CV_Assert( src.channels() == 2 );
303 
304         _dst.create(src.size(), CV_8UC3);
305         GpuMat dst = _dst.getGpuMat();
306 
307         cv::cuda::device::BGR565_to_RGB(src, dst, stream);
308     }
309 
BGR555_to_BGR(InputArray _src,OutputArray _dst,int,Stream & stream)310     void BGR555_to_BGR(InputArray _src, OutputArray _dst, int, Stream& stream)
311     {
312         GpuMat src = _src.getGpuMat();
313 
314         CV_Assert( src.depth() == CV_8U );
315         CV_Assert( src.channels() == 2 );
316 
317         _dst.create(src.size(), CV_8UC3);
318         GpuMat dst = _dst.getGpuMat();
319 
320         cv::cuda::device::BGR555_to_BGR(src, dst, stream);
321     }
322 
BGR565_to_BGR(InputArray _src,OutputArray _dst,int,Stream & stream)323     void BGR565_to_BGR(InputArray _src, OutputArray _dst, int, Stream& stream)
324     {
325         GpuMat src = _src.getGpuMat();
326 
327         CV_Assert( src.depth() == CV_8U );
328         CV_Assert( src.channels() == 2 );
329 
330         _dst.create(src.size(), CV_8UC3);
331         GpuMat dst = _dst.getGpuMat();
332 
333         cv::cuda::device::BGR565_to_BGR(src, dst, stream);
334     }
335 
BGR555_to_RGBA(InputArray _src,OutputArray _dst,int,Stream & stream)336     void BGR555_to_RGBA(InputArray _src, OutputArray _dst, int, Stream& stream)
337     {
338         GpuMat src = _src.getGpuMat();
339 
340         CV_Assert( src.depth() == CV_8U );
341         CV_Assert( src.channels() == 2 );
342 
343         _dst.create(src.size(), CV_8UC4);
344         GpuMat dst = _dst.getGpuMat();
345 
346         cv::cuda::device::BGR555_to_RGBA(src, dst, stream);
347     }
348 
BGR565_to_RGBA(InputArray _src,OutputArray _dst,int,Stream & stream)349     void BGR565_to_RGBA(InputArray _src, OutputArray _dst, int, Stream& stream)
350     {
351         GpuMat src = _src.getGpuMat();
352 
353         CV_Assert( src.depth() == CV_8U );
354         CV_Assert( src.channels() == 2 );
355 
356         _dst.create(src.size(), CV_8UC4);
357         GpuMat dst = _dst.getGpuMat();
358 
359         cv::cuda::device::BGR565_to_RGBA(src, dst, stream);
360     }
361 
BGR555_to_BGRA(InputArray _src,OutputArray _dst,int,Stream & stream)362     void BGR555_to_BGRA(InputArray _src, OutputArray _dst, int, Stream& stream)
363     {
364         GpuMat src = _src.getGpuMat();
365 
366         CV_Assert( src.depth() == CV_8U );
367         CV_Assert( src.channels() == 2 );
368 
369         _dst.create(src.size(), CV_8UC4);
370         GpuMat dst = _dst.getGpuMat();
371 
372         cv::cuda::device::BGR555_to_BGRA(src, dst, stream);
373     }
374 
BGR565_to_BGRA(InputArray _src,OutputArray _dst,int,Stream & stream)375     void BGR565_to_BGRA(InputArray _src, OutputArray _dst, int, Stream& stream)
376     {
377         GpuMat src = _src.getGpuMat();
378 
379         CV_Assert( src.depth() == CV_8U );
380         CV_Assert( src.channels() == 2 );
381 
382         _dst.create(src.size(), CV_8UC4);
383         GpuMat dst = _dst.getGpuMat();
384 
385         cv::cuda::device::BGR565_to_BGRA(src, dst, stream);
386     }
387 
GRAY_to_BGR(InputArray _src,OutputArray _dst,int,Stream & stream)388     void GRAY_to_BGR(InputArray _src, OutputArray _dst, int, Stream& stream)
389     {
390         using namespace cv::cuda::device;
391         static const gpu_func_t funcs[] = {GRAY_to_BGR_8u, 0, GRAY_to_BGR_16u, 0, 0, GRAY_to_BGR_32f};
392 
393         GpuMat src = _src.getGpuMat();
394 
395         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
396         CV_Assert( src.channels() == 1 );
397 
398         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), 3));
399         GpuMat dst = _dst.getGpuMat();
400 
401         funcs[src.depth()](src, dst, stream);
402     }
403 
GRAY_to_BGRA(InputArray _src,OutputArray _dst,int,Stream & stream)404     void GRAY_to_BGRA(InputArray _src, OutputArray _dst, int, Stream& stream)
405     {
406         using namespace cv::cuda::device;
407         static const gpu_func_t funcs[] = {GRAY_to_BGRA_8u, 0, GRAY_to_BGRA_16u, 0, 0, GRAY_to_BGRA_32f};
408 
409         GpuMat src = _src.getGpuMat();
410 
411         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
412         CV_Assert( src.channels() == 1 );
413 
414         _dst.create(src.size(), CV_MAKETYPE(src.depth(), 4));
415         GpuMat dst = _dst.getGpuMat();
416 
417         funcs[src.depth()](src, dst, stream);
418     }
419 
GRAY_to_BGR555(InputArray _src,OutputArray _dst,int,Stream & stream)420     void GRAY_to_BGR555(InputArray _src, OutputArray _dst, int, Stream& stream)
421     {
422         GpuMat src = _src.getGpuMat();
423 
424         CV_Assert( src.depth() == CV_8U );
425         CV_Assert( src.channels() == 1 );
426 
427         _dst.create(src.size(), CV_8UC2);
428         GpuMat dst = _dst.getGpuMat();
429 
430         cv::cuda::device::GRAY_to_BGR555(src, dst, stream);
431     }
432 
GRAY_to_BGR565(InputArray _src,OutputArray _dst,int,Stream & stream)433     void GRAY_to_BGR565(InputArray _src, OutputArray _dst, int, Stream& stream)
434     {
435         GpuMat src = _src.getGpuMat();
436 
437         CV_Assert( src.depth() == CV_8U );
438         CV_Assert( src.channels() == 1 );
439 
440         _dst.create(src.size(), CV_8UC2);
441         GpuMat dst = _dst.getGpuMat();
442 
443         cv::cuda::device::GRAY_to_BGR565(src, dst, stream);
444     }
445 
BGR555_to_GRAY(InputArray _src,OutputArray _dst,int,Stream & stream)446     void BGR555_to_GRAY(InputArray _src, OutputArray _dst, int, Stream& stream)
447     {
448         GpuMat src = _src.getGpuMat();
449 
450         CV_Assert( src.depth() == CV_8U );
451         CV_Assert( src.channels() == 2 );
452 
453         _dst.create(src.size(), CV_8UC1);
454         GpuMat dst = _dst.getGpuMat();
455 
456         cv::cuda::device::BGR555_to_GRAY(src, dst, stream);
457     }
458 
BGR565_to_GRAY(InputArray _src,OutputArray _dst,int,Stream & stream)459     void BGR565_to_GRAY(InputArray _src, OutputArray _dst, int, Stream& stream)
460     {
461         GpuMat src = _src.getGpuMat();
462 
463         CV_Assert( src.depth() == CV_8U );
464         CV_Assert( src.channels() == 2 );
465 
466         _dst.create(src.size(), CV_8UC1);
467         GpuMat dst = _dst.getGpuMat();
468 
469         cv::cuda::device::BGR565_to_GRAY(src, dst, stream);
470     }
471 
RGB_to_GRAY(InputArray _src,OutputArray _dst,int,Stream & stream)472     void RGB_to_GRAY(InputArray _src, OutputArray _dst, int, Stream& stream)
473     {
474         using namespace cv::cuda::device;
475         static const gpu_func_t funcs[] = {RGB_to_GRAY_8u, 0, RGB_to_GRAY_16u, 0, 0, RGB_to_GRAY_32f};
476 
477         GpuMat src = _src.getGpuMat();
478 
479         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
480         CV_Assert( src.channels() == 3 );
481 
482         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), 1));
483         GpuMat dst = _dst.getGpuMat();
484 
485         funcs[src.depth()](src, dst, stream);
486     }
487 
BGR_to_GRAY(InputArray _src,OutputArray _dst,int,Stream & stream)488     void BGR_to_GRAY(InputArray _src, OutputArray _dst, int, Stream& stream)
489     {
490         using namespace cv::cuda::device;
491         static const gpu_func_t funcs[] = {BGR_to_GRAY_8u, 0, BGR_to_GRAY_16u, 0, 0, BGR_to_GRAY_32f};
492 
493         GpuMat src = _src.getGpuMat();
494 
495         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
496         CV_Assert( src.channels() == 3 );
497 
498         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), 1));
499         GpuMat dst = _dst.getGpuMat();
500 
501         funcs[src.depth()](src, dst, stream);
502     }
503 
RGBA_to_GRAY(InputArray _src,OutputArray _dst,int,Stream & stream)504     void RGBA_to_GRAY(InputArray _src, OutputArray _dst, int, Stream& stream)
505     {
506         using namespace cv::cuda::device;
507         static const gpu_func_t funcs[] = {RGBA_to_GRAY_8u, 0, RGBA_to_GRAY_16u, 0, 0, RGBA_to_GRAY_32f};
508 
509         GpuMat src = _src.getGpuMat();
510 
511         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
512         CV_Assert( src.channels() == 4 );
513 
514         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), 1));
515         GpuMat dst = _dst.getGpuMat();
516 
517         funcs[src.depth()](src, dst, stream);
518     }
519 
BGRA_to_GRAY(InputArray _src,OutputArray _dst,int,Stream & stream)520     void BGRA_to_GRAY(InputArray _src, OutputArray _dst, int, Stream& stream)
521     {
522         using namespace cv::cuda::device;
523         static const gpu_func_t funcs[] = {BGRA_to_GRAY_8u, 0, BGRA_to_GRAY_16u, 0, 0, BGRA_to_GRAY_32f};
524 
525         GpuMat src = _src.getGpuMat();
526 
527         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
528         CV_Assert( src.channels() == 4 );
529 
530         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), 1));
531         GpuMat dst = _dst.getGpuMat();
532 
533         funcs[src.depth()](src, dst, stream);
534     }
535 
RGB_to_YUV(InputArray _src,OutputArray _dst,int dcn,Stream & stream)536     void RGB_to_YUV(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
537     {
538         using namespace cv::cuda::device;
539         static const gpu_func_t funcs[2][2][6] =
540         {
541             {
542                 {RGB_to_YUV_8u, 0, RGB_to_YUV_16u, 0, 0, RGB_to_YUV_32f},
543                 {RGBA_to_YUV_8u, 0, RGBA_to_YUV_16u, 0, 0, RGBA_to_YUV_32f}
544             },
545             {
546                 {RGB_to_YUV4_8u, 0, RGB_to_YUV4_16u, 0, 0, RGB_to_YUV4_32f},
547                 {RGBA_to_YUV4_8u, 0, RGBA_to_YUV4_16u, 0, 0, RGBA_to_YUV4_32f}
548             }
549         };
550 
551         if (dcn <= 0) dcn = 3;
552 
553         GpuMat src = _src.getGpuMat();
554 
555         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
556         CV_Assert( src.channels() == 3 || src.channels() == 4 );
557         CV_Assert( dcn == 3 || dcn == 4 );
558 
559         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
560         GpuMat dst = _dst.getGpuMat();
561 
562         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
563     }
564 
BGR_to_YUV(InputArray _src,OutputArray _dst,int dcn,Stream & stream)565     void BGR_to_YUV(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
566     {
567         using namespace cv::cuda::device;
568         static const gpu_func_t funcs[2][2][6] =
569         {
570             {
571                 {BGR_to_YUV_8u, 0, BGR_to_YUV_16u, 0, 0, BGR_to_YUV_32f},
572                 {BGRA_to_YUV_8u, 0, BGRA_to_YUV_16u, 0, 0, BGRA_to_YUV_32f}
573             },
574             {
575                 {BGR_to_YUV4_8u, 0, BGR_to_YUV4_16u, 0, 0, BGR_to_YUV4_32f},
576                 {BGRA_to_YUV4_8u, 0, BGRA_to_YUV4_16u, 0, 0, BGRA_to_YUV4_32f}
577             }
578         };
579 
580         if (dcn <= 0) dcn = 3;
581 
582         GpuMat src = _src.getGpuMat();
583 
584         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
585         CV_Assert( src.channels() == 3 || src.channels() == 4 );
586         CV_Assert( dcn == 3 || dcn == 4 );
587 
588         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
589         GpuMat dst = _dst.getGpuMat();
590 
591         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
592     }
593 
YUV_to_RGB(InputArray _src,OutputArray _dst,int dcn,Stream & stream)594     void YUV_to_RGB(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
595     {
596         using namespace cv::cuda::device;
597         static const gpu_func_t funcs[2][2][6] =
598         {
599             {
600                 {YUV_to_RGB_8u, 0, YUV_to_RGB_16u, 0, 0, YUV_to_RGB_32f},
601                 {YUV4_to_RGB_8u, 0, YUV4_to_RGB_16u, 0, 0, YUV4_to_RGB_32f}
602             },
603             {
604                 {YUV_to_RGBA_8u, 0, YUV_to_RGBA_16u, 0, 0, YUV_to_RGBA_32f},
605                 {YUV4_to_RGBA_8u, 0, YUV4_to_RGBA_16u, 0, 0, YUV4_to_RGBA_32f}
606             }
607         };
608 
609         if (dcn <= 0) dcn = 3;
610 
611         GpuMat src = _src.getGpuMat();
612 
613         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
614         CV_Assert( src.channels() == 3 || src.channels() == 4 );
615         CV_Assert( dcn == 3 || dcn == 4 );
616 
617         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
618         GpuMat dst = _dst.getGpuMat();
619 
620         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
621     }
622 
YUV_to_BGR(InputArray _src,OutputArray _dst,int dcn,Stream & stream)623     void YUV_to_BGR(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
624     {
625         using namespace cv::cuda::device;
626         static const gpu_func_t funcs[2][2][6] =
627         {
628             {
629                 {YUV_to_BGR_8u, 0, YUV_to_BGR_16u, 0, 0, YUV_to_BGR_32f},
630                 {YUV4_to_BGR_8u, 0, YUV4_to_BGR_16u, 0, 0, YUV4_to_BGR_32f}
631             },
632             {
633                 {YUV_to_BGRA_8u, 0, YUV_to_BGRA_16u, 0, 0, YUV_to_BGRA_32f},
634                 {YUV4_to_BGRA_8u, 0, YUV4_to_BGRA_16u, 0, 0, YUV4_to_BGRA_32f}
635             }
636         };
637 
638         if (dcn <= 0) dcn = 3;
639 
640         GpuMat src = _src.getGpuMat();
641 
642         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
643         CV_Assert( src.channels() == 3 || src.channels() == 4 );
644         CV_Assert( dcn == 3 || dcn == 4 );
645 
646         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
647         GpuMat dst = _dst.getGpuMat();
648 
649         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
650     }
651 
RGB_to_YCrCb(InputArray _src,OutputArray _dst,int dcn,Stream & stream)652     void RGB_to_YCrCb(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
653     {
654         using namespace cv::cuda::device;
655         static const gpu_func_t funcs[2][2][6] =
656         {
657             {
658                 {RGB_to_YCrCb_8u, 0, RGB_to_YCrCb_16u, 0, 0, RGB_to_YCrCb_32f},
659                 {RGBA_to_YCrCb_8u, 0, RGBA_to_YCrCb_16u, 0, 0, RGBA_to_YCrCb_32f}
660             },
661             {
662                 {RGB_to_YCrCb4_8u, 0, RGB_to_YCrCb4_16u, 0, 0, RGB_to_YCrCb4_32f},
663                 {RGBA_to_YCrCb4_8u, 0, RGBA_to_YCrCb4_16u, 0, 0, RGBA_to_YCrCb4_32f}
664             }
665         };
666 
667         if (dcn <= 0) dcn = 3;
668 
669         GpuMat src = _src.getGpuMat();
670 
671         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
672         CV_Assert( src.channels() == 3 || src.channels() == 4 );
673         CV_Assert( dcn == 3 || dcn == 4 );
674 
675         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
676         GpuMat dst = _dst.getGpuMat();
677 
678         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
679     }
680 
BGR_to_YCrCb(InputArray _src,OutputArray _dst,int dcn,Stream & stream)681     void BGR_to_YCrCb(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
682     {
683         using namespace cv::cuda::device;
684         static const gpu_func_t funcs[2][2][6] =
685         {
686             {
687                 {BGR_to_YCrCb_8u, 0, BGR_to_YCrCb_16u, 0, 0, BGR_to_YCrCb_32f},
688                 {BGRA_to_YCrCb_8u, 0, BGRA_to_YCrCb_16u, 0, 0, BGRA_to_YCrCb_32f}
689             },
690             {
691                 {BGR_to_YCrCb4_8u, 0, BGR_to_YCrCb4_16u, 0, 0, BGR_to_YCrCb4_32f},
692                 {BGRA_to_YCrCb4_8u, 0, BGRA_to_YCrCb4_16u, 0, 0, BGRA_to_YCrCb4_32f}
693             }
694         };
695 
696         if (dcn <= 0) dcn = 3;
697 
698         GpuMat src = _src.getGpuMat();
699 
700         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
701         CV_Assert( src.channels() == 3 || src.channels() == 4 );
702         CV_Assert( dcn == 3 || dcn == 4 );
703 
704         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
705         GpuMat dst = _dst.getGpuMat();
706 
707         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
708     }
709 
YCrCb_to_RGB(InputArray _src,OutputArray _dst,int dcn,Stream & stream)710     void YCrCb_to_RGB(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
711     {
712         using namespace cv::cuda::device;
713         static const gpu_func_t funcs[2][2][6] =
714         {
715             {
716                 {YCrCb_to_RGB_8u, 0, YCrCb_to_RGB_16u, 0, 0, YCrCb_to_RGB_32f},
717                 {YCrCb4_to_RGB_8u, 0, YCrCb4_to_RGB_16u, 0, 0, YCrCb4_to_RGB_32f}
718             },
719             {
720                 {YCrCb_to_RGBA_8u, 0, YCrCb_to_RGBA_16u, 0, 0, YCrCb_to_RGBA_32f},
721                 {YCrCb4_to_RGBA_8u, 0, YCrCb4_to_RGBA_16u, 0, 0, YCrCb4_to_RGBA_32f}
722             }
723         };
724 
725         if (dcn <= 0) dcn = 3;
726 
727         GpuMat src = _src.getGpuMat();
728 
729         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
730         CV_Assert( src.channels() == 3 || src.channels() == 4 );
731         CV_Assert( dcn == 3 || dcn == 4 );
732 
733         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
734         GpuMat dst = _dst.getGpuMat();
735 
736         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
737     }
738 
YCrCb_to_BGR(InputArray _src,OutputArray _dst,int dcn,Stream & stream)739     void YCrCb_to_BGR(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
740     {
741         using namespace cv::cuda::device;
742         static const gpu_func_t funcs[2][2][6] =
743         {
744             {
745                 {YCrCb_to_BGR_8u, 0, YCrCb_to_BGR_16u, 0, 0, YCrCb_to_BGR_32f},
746                 {YCrCb4_to_BGR_8u, 0, YCrCb4_to_BGR_16u, 0, 0, YCrCb4_to_BGR_32f}
747             },
748             {
749                 {YCrCb_to_BGRA_8u, 0, YCrCb_to_BGRA_16u, 0, 0, YCrCb_to_BGRA_32f},
750                 {YCrCb4_to_BGRA_8u, 0, YCrCb4_to_BGRA_16u, 0, 0, YCrCb4_to_BGRA_32f}
751             }
752         };
753 
754         if (dcn <= 0) dcn = 3;
755 
756         GpuMat src = _src.getGpuMat();
757 
758         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
759         CV_Assert( src.channels() == 3 || src.channels() == 4 );
760         CV_Assert( dcn == 3 || dcn == 4 );
761 
762         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
763         GpuMat dst = _dst.getGpuMat();
764 
765         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
766     }
767 
RGB_to_XYZ(InputArray _src,OutputArray _dst,int dcn,Stream & stream)768     void RGB_to_XYZ(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
769     {
770         using namespace cv::cuda::device;
771         static const gpu_func_t funcs[2][2][6] =
772         {
773             {
774                 {RGB_to_XYZ_8u, 0, RGB_to_XYZ_16u, 0, 0, RGB_to_XYZ_32f},
775                 {RGBA_to_XYZ_8u, 0, RGBA_to_XYZ_16u, 0, 0, RGBA_to_XYZ_32f}
776             },
777             {
778                 {RGB_to_XYZ4_8u, 0, RGB_to_XYZ4_16u, 0, 0, RGB_to_XYZ4_32f},
779                 {RGBA_to_XYZ4_8u, 0, RGBA_to_XYZ4_16u, 0, 0, RGBA_to_XYZ4_32f}
780             }
781         };
782 
783         if (dcn <= 0) dcn = 3;
784 
785         GpuMat src = _src.getGpuMat();
786 
787         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
788         CV_Assert( src.channels() == 3 || src.channels() == 4 );
789         CV_Assert( dcn == 3 || dcn == 4 );
790 
791         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
792         GpuMat dst = _dst.getGpuMat();
793 
794         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
795     }
796 
BGR_to_XYZ(InputArray _src,OutputArray _dst,int dcn,Stream & stream)797     void BGR_to_XYZ(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
798     {
799         using namespace cv::cuda::device;
800         static const gpu_func_t funcs[2][2][6] =
801         {
802             {
803                 {BGR_to_XYZ_8u, 0, BGR_to_XYZ_16u, 0, 0, BGR_to_XYZ_32f},
804                 {BGRA_to_XYZ_8u, 0, BGRA_to_XYZ_16u, 0, 0, BGRA_to_XYZ_32f}
805             },
806             {
807                 {BGR_to_XYZ4_8u, 0, BGR_to_XYZ4_16u, 0, 0, BGR_to_XYZ4_32f},
808                 {BGRA_to_XYZ4_8u, 0, BGRA_to_XYZ4_16u, 0, 0, BGRA_to_XYZ4_32f}
809             }
810         };
811 
812         if (dcn <= 0) dcn = 3;
813 
814         GpuMat src = _src.getGpuMat();
815 
816         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
817         CV_Assert( src.channels() == 3 || src.channels() == 4 );
818         CV_Assert( dcn == 3 || dcn == 4 );
819 
820         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
821         GpuMat dst = _dst.getGpuMat();
822 
823         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
824     }
825 
XYZ_to_RGB(InputArray _src,OutputArray _dst,int dcn,Stream & stream)826     void XYZ_to_RGB(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
827     {
828         using namespace cv::cuda::device;
829         static const gpu_func_t funcs[2][2][6] =
830         {
831             {
832                 {XYZ_to_RGB_8u, 0, XYZ_to_RGB_16u, 0, 0, XYZ_to_RGB_32f},
833                 {XYZ4_to_RGB_8u, 0, XYZ4_to_RGB_16u, 0, 0, XYZ4_to_RGB_32f}
834             },
835             {
836                 {XYZ_to_RGBA_8u, 0, XYZ_to_RGBA_16u, 0, 0, XYZ_to_RGBA_32f},
837                 {XYZ4_to_RGBA_8u, 0, XYZ4_to_RGBA_16u, 0, 0, XYZ4_to_RGBA_32f}
838             }
839         };
840 
841         if (dcn <= 0) dcn = 3;
842 
843         GpuMat src = _src.getGpuMat();
844 
845         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
846         CV_Assert( src.channels() == 3 || src.channels() == 4 );
847         CV_Assert( dcn == 3 || dcn == 4 );
848 
849         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
850         GpuMat dst = _dst.getGpuMat();
851 
852         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
853     }
854 
XYZ_to_BGR(InputArray _src,OutputArray _dst,int dcn,Stream & stream)855     void XYZ_to_BGR(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
856     {
857         using namespace cv::cuda::device;
858         static const gpu_func_t funcs[2][2][6] =
859         {
860             {
861                 {XYZ_to_BGR_8u, 0, XYZ_to_BGR_16u, 0, 0, XYZ_to_BGR_32f},
862                 {XYZ4_to_BGR_8u, 0, XYZ4_to_BGR_16u, 0, 0, XYZ4_to_BGR_32f}
863             },
864             {
865                 {XYZ_to_BGRA_8u, 0, XYZ_to_BGRA_16u, 0, 0, XYZ_to_BGRA_32f},
866                 {XYZ4_to_BGRA_8u, 0, XYZ4_to_BGRA_16u, 0, 0, XYZ4_to_BGRA_32f}
867             }
868         };
869 
870         if (dcn <= 0) dcn = 3;
871 
872         GpuMat src = _src.getGpuMat();
873 
874         CV_Assert( src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F );
875         CV_Assert( src.channels() == 3 || src.channels() == 4 );
876         CV_Assert( dcn == 3 || dcn == 4 );
877 
878         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
879         GpuMat dst = _dst.getGpuMat();
880 
881         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
882     }
883 
RGB_to_HSV(InputArray _src,OutputArray _dst,int dcn,Stream & stream)884     void RGB_to_HSV(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
885     {
886         using namespace cv::cuda::device;
887         static const gpu_func_t funcs[2][2][6] =
888         {
889             {
890                 {RGB_to_HSV_8u, 0, 0, 0, 0, RGB_to_HSV_32f},
891                 {RGBA_to_HSV_8u, 0, 0, 0, 0, RGBA_to_HSV_32f},
892             },
893             {
894                 {RGB_to_HSV4_8u, 0, 0, 0, 0, RGB_to_HSV4_32f},
895                 {RGBA_to_HSV4_8u, 0, 0, 0, 0, RGBA_to_HSV4_32f},
896             }
897         };
898 
899         if (dcn <= 0) dcn = 3;
900 
901         GpuMat src = _src.getGpuMat();
902 
903         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
904         CV_Assert( src.channels() == 3 || src.channels() == 4 );
905         CV_Assert( dcn == 3 || dcn == 4 );
906 
907         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
908         GpuMat dst = _dst.getGpuMat();
909 
910         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
911     }
912 
BGR_to_HSV(InputArray _src,OutputArray _dst,int dcn,Stream & stream)913     void BGR_to_HSV(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
914     {
915         using namespace cv::cuda::device;
916         static const gpu_func_t funcs[2][2][6] =
917         {
918             {
919                 {BGR_to_HSV_8u, 0, 0, 0, 0, BGR_to_HSV_32f},
920                 {BGRA_to_HSV_8u, 0, 0, 0, 0, BGRA_to_HSV_32f}
921             },
922             {
923                 {BGR_to_HSV4_8u, 0, 0, 0, 0, BGR_to_HSV4_32f},
924                 {BGRA_to_HSV4_8u, 0, 0, 0, 0, BGRA_to_HSV4_32f}
925             }
926         };
927 
928         if (dcn <= 0) dcn = 3;
929 
930         GpuMat src = _src.getGpuMat();
931 
932         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
933         CV_Assert( src.channels() == 3 || src.channels() == 4 );
934         CV_Assert( dcn == 3 || dcn == 4 );
935 
936         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
937         GpuMat dst = _dst.getGpuMat();
938 
939         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
940     }
941 
HSV_to_RGB(InputArray _src,OutputArray _dst,int dcn,Stream & stream)942     void HSV_to_RGB(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
943     {
944         using namespace cv::cuda::device;
945         static const gpu_func_t funcs[2][2][6] =
946         {
947             {
948                 {HSV_to_RGB_8u, 0, 0, 0, 0, HSV_to_RGB_32f},
949                 {HSV4_to_RGB_8u, 0, 0, 0, 0, HSV4_to_RGB_32f}
950             },
951             {
952                 {HSV_to_RGBA_8u, 0, 0, 0, 0, HSV_to_RGBA_32f},
953                 {HSV4_to_RGBA_8u, 0, 0, 0, 0, HSV4_to_RGBA_32f}
954             }
955         };
956 
957         if (dcn <= 0) dcn = 3;
958 
959         GpuMat src = _src.getGpuMat();
960 
961         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
962         CV_Assert( src.channels() == 3 || src.channels() == 4 );
963         CV_Assert( dcn == 3 || dcn == 4 );
964 
965         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
966         GpuMat dst = _dst.getGpuMat();
967 
968         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
969     }
970 
HSV_to_BGR(InputArray _src,OutputArray _dst,int dcn,Stream & stream)971     void HSV_to_BGR(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
972     {
973         using namespace cv::cuda::device;
974         static const gpu_func_t funcs[2][2][6] =
975         {
976             {
977                 {HSV_to_BGR_8u, 0, 0, 0, 0, HSV_to_BGR_32f},
978                 {HSV4_to_BGR_8u, 0, 0, 0, 0, HSV4_to_BGR_32f}
979             },
980             {
981                 {HSV_to_BGRA_8u, 0, 0, 0, 0, HSV_to_BGRA_32f},
982                 {HSV4_to_BGRA_8u, 0, 0, 0, 0, HSV4_to_BGRA_32f}
983             }
984         };
985 
986         if (dcn <= 0) dcn = 3;
987 
988         GpuMat src = _src.getGpuMat();
989 
990         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
991         CV_Assert( src.channels() == 3 || src.channels() == 4 );
992         CV_Assert( dcn == 3 || dcn == 4 );
993 
994         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
995         GpuMat dst = _dst.getGpuMat();
996 
997         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
998     }
999 
RGB_to_HLS(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1000     void RGB_to_HLS(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1001     {
1002         using namespace cv::cuda::device;
1003         static const gpu_func_t funcs[2][2][6] =
1004         {
1005             {
1006                 {RGB_to_HLS_8u, 0, 0, 0, 0, RGB_to_HLS_32f},
1007                 {RGBA_to_HLS_8u, 0, 0, 0, 0, RGBA_to_HLS_32f},
1008             },
1009             {
1010                 {RGB_to_HLS4_8u, 0, 0, 0, 0, RGB_to_HLS4_32f},
1011                 {RGBA_to_HLS4_8u, 0, 0, 0, 0, RGBA_to_HLS4_32f},
1012             }
1013         };
1014 
1015         if (dcn <= 0) dcn = 3;
1016 
1017         GpuMat src = _src.getGpuMat();
1018 
1019         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1020         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1021         CV_Assert( dcn == 3 || dcn == 4 );
1022 
1023         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1024         GpuMat dst = _dst.getGpuMat();
1025 
1026         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
1027     }
1028 
BGR_to_HLS(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1029     void BGR_to_HLS(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1030     {
1031         using namespace cv::cuda::device;
1032         static const gpu_func_t funcs[2][2][6] =
1033         {
1034             {
1035                 {BGR_to_HLS_8u, 0, 0, 0, 0, BGR_to_HLS_32f},
1036                 {BGRA_to_HLS_8u, 0, 0, 0, 0, BGRA_to_HLS_32f}
1037             },
1038             {
1039                 {BGR_to_HLS4_8u, 0, 0, 0, 0, BGR_to_HLS4_32f},
1040                 {BGRA_to_HLS4_8u, 0, 0, 0, 0, BGRA_to_HLS4_32f}
1041             }
1042         };
1043 
1044         if (dcn <= 0) dcn = 3;
1045 
1046         GpuMat src = _src.getGpuMat();
1047 
1048         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1049         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1050         CV_Assert( dcn == 3 || dcn == 4 );
1051 
1052         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1053         GpuMat dst = _dst.getGpuMat();
1054 
1055         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
1056     }
1057 
HLS_to_RGB(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1058     void HLS_to_RGB(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1059     {
1060         using namespace cv::cuda::device;
1061         static const gpu_func_t funcs[2][2][6] =
1062         {
1063             {
1064                 {HLS_to_RGB_8u, 0, 0, 0, 0, HLS_to_RGB_32f},
1065                 {HLS4_to_RGB_8u, 0, 0, 0, 0, HLS4_to_RGB_32f}
1066             },
1067             {
1068                 {HLS_to_RGBA_8u, 0, 0, 0, 0, HLS_to_RGBA_32f},
1069                 {HLS4_to_RGBA_8u, 0, 0, 0, 0, HLS4_to_RGBA_32f}
1070             }
1071         };
1072 
1073         if (dcn <= 0) dcn = 3;
1074 
1075         GpuMat src = _src.getGpuMat();
1076 
1077         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1078         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1079         CV_Assert( dcn == 3 || dcn == 4 );
1080 
1081         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1082         GpuMat dst = _dst.getGpuMat();
1083 
1084         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
1085     }
1086 
HLS_to_BGR(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1087     void HLS_to_BGR(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1088     {
1089         using namespace cv::cuda::device;
1090         static const gpu_func_t funcs[2][2][6] =
1091         {
1092             {
1093                 {HLS_to_BGR_8u, 0, 0, 0, 0, HLS_to_BGR_32f},
1094                 {HLS4_to_BGR_8u, 0, 0, 0, 0, HLS4_to_BGR_32f}
1095             },
1096             {
1097                 {HLS_to_BGRA_8u, 0, 0, 0, 0, HLS_to_BGRA_32f},
1098                 {HLS4_to_BGRA_8u, 0, 0, 0, 0, HLS4_to_BGRA_32f}
1099             }
1100         };
1101 
1102         if (dcn <= 0) dcn = 3;
1103 
1104         GpuMat src = _src.getGpuMat();
1105 
1106         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1107         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1108         CV_Assert( dcn == 3 || dcn == 4 );
1109 
1110         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1111         GpuMat dst = _dst.getGpuMat();
1112 
1113         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
1114     }
1115 
RGB_to_HSV_FULL(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1116     void RGB_to_HSV_FULL(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1117     {
1118         using namespace cv::cuda::device;
1119         static const gpu_func_t funcs[2][2][6] =
1120         {
1121             {
1122                 {RGB_to_HSV_FULL_8u, 0, 0, 0, 0, RGB_to_HSV_FULL_32f},
1123                 {RGBA_to_HSV_FULL_8u, 0, 0, 0, 0, RGBA_to_HSV_FULL_32f},
1124             },
1125             {
1126                 {RGB_to_HSV4_FULL_8u, 0, 0, 0, 0, RGB_to_HSV4_FULL_32f},
1127                 {RGBA_to_HSV4_FULL_8u, 0, 0, 0, 0, RGBA_to_HSV4_FULL_32f},
1128             }
1129         };
1130 
1131         if (dcn <= 0) dcn = 3;
1132 
1133         GpuMat src = _src.getGpuMat();
1134 
1135         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1136         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1137         CV_Assert( dcn == 3 || dcn == 4 );
1138 
1139         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1140         GpuMat dst = _dst.getGpuMat();
1141 
1142         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
1143     }
1144 
BGR_to_HSV_FULL(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1145     void BGR_to_HSV_FULL(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1146     {
1147         using namespace cv::cuda::device;
1148         static const gpu_func_t funcs[2][2][6] =
1149         {
1150             {
1151                 {BGR_to_HSV_FULL_8u, 0, 0, 0, 0, BGR_to_HSV_FULL_32f},
1152                 {BGRA_to_HSV_FULL_8u, 0, 0, 0, 0, BGRA_to_HSV_FULL_32f}
1153             },
1154             {
1155                 {BGR_to_HSV4_FULL_8u, 0, 0, 0, 0, BGR_to_HSV4_FULL_32f},
1156                 {BGRA_to_HSV4_FULL_8u, 0, 0, 0, 0, BGRA_to_HSV4_FULL_32f}
1157             }
1158         };
1159 
1160         if (dcn <= 0) dcn = 3;
1161 
1162         GpuMat src = _src.getGpuMat();
1163 
1164         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1165         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1166         CV_Assert( dcn == 3 || dcn == 4 );
1167 
1168         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1169         GpuMat dst = _dst.getGpuMat();
1170 
1171         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
1172     }
1173 
HSV_to_RGB_FULL(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1174     void HSV_to_RGB_FULL(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1175     {
1176         using namespace cv::cuda::device;
1177         static const gpu_func_t funcs[2][2][6] =
1178         {
1179             {
1180                 {HSV_to_RGB_FULL_8u, 0, 0, 0, 0, HSV_to_RGB_FULL_32f},
1181                 {HSV4_to_RGB_FULL_8u, 0, 0, 0, 0, HSV4_to_RGB_FULL_32f}
1182             },
1183             {
1184                 {HSV_to_RGBA_FULL_8u, 0, 0, 0, 0, HSV_to_RGBA_FULL_32f},
1185                 {HSV4_to_RGBA_FULL_8u, 0, 0, 0, 0, HSV4_to_RGBA_FULL_32f}
1186             }
1187         };
1188 
1189         if (dcn <= 0) dcn = 3;
1190 
1191         GpuMat src = _src.getGpuMat();
1192 
1193         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1194         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1195         CV_Assert( dcn == 3 || dcn == 4 );
1196 
1197         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1198         GpuMat dst = _dst.getGpuMat();
1199 
1200         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
1201     }
1202 
HSV_to_BGR_FULL(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1203     void HSV_to_BGR_FULL(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1204     {
1205         using namespace cv::cuda::device;
1206         static const gpu_func_t funcs[2][2][6] =
1207         {
1208             {
1209                 {HSV_to_BGR_FULL_8u, 0, 0, 0, 0, HSV_to_BGR_FULL_32f},
1210                 {HSV4_to_BGR_FULL_8u, 0, 0, 0, 0, HSV4_to_BGR_FULL_32f}
1211             },
1212             {
1213                 {HSV_to_BGRA_FULL_8u, 0, 0, 0, 0, HSV_to_BGRA_FULL_32f},
1214                 {HSV4_to_BGRA_FULL_8u, 0, 0, 0, 0, HSV4_to_BGRA_FULL_32f}
1215             }
1216         };
1217 
1218         if (dcn <= 0) dcn = 3;
1219 
1220         GpuMat src = _src.getGpuMat();
1221 
1222         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1223         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1224         CV_Assert( dcn == 3 || dcn == 4 );
1225 
1226         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1227         GpuMat dst = _dst.getGpuMat();
1228 
1229         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
1230     }
1231 
RGB_to_HLS_FULL(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1232     void RGB_to_HLS_FULL(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1233     {
1234         using namespace cv::cuda::device;
1235         static const gpu_func_t funcs[2][2][6] =
1236         {
1237             {
1238                 {RGB_to_HLS_FULL_8u, 0, 0, 0, 0, RGB_to_HLS_FULL_32f},
1239                 {RGBA_to_HLS_FULL_8u, 0, 0, 0, 0, RGBA_to_HLS_FULL_32f},
1240             },
1241             {
1242                 {RGB_to_HLS4_FULL_8u, 0, 0, 0, 0, RGB_to_HLS4_FULL_32f},
1243                 {RGBA_to_HLS4_FULL_8u, 0, 0, 0, 0, RGBA_to_HLS4_FULL_32f},
1244             }
1245         };
1246 
1247         if (dcn <= 0) dcn = 3;
1248 
1249         GpuMat src = _src.getGpuMat();
1250 
1251         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1252         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1253         CV_Assert( dcn == 3 || dcn == 4 );
1254 
1255         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1256         GpuMat dst = _dst.getGpuMat();
1257 
1258         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
1259     }
1260 
BGR_to_HLS_FULL(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1261     void BGR_to_HLS_FULL(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1262     {
1263         using namespace cv::cuda::device;
1264         static const gpu_func_t funcs[2][2][6] =
1265         {
1266             {
1267                 {BGR_to_HLS_FULL_8u, 0, 0, 0, 0, BGR_to_HLS_FULL_32f},
1268                 {BGRA_to_HLS_FULL_8u, 0, 0, 0, 0, BGRA_to_HLS_FULL_32f}
1269             },
1270             {
1271                 {BGR_to_HLS4_FULL_8u, 0, 0, 0, 0, BGR_to_HLS4_FULL_32f},
1272                 {BGRA_to_HLS4_FULL_8u, 0, 0, 0, 0, BGRA_to_HLS4_FULL_32f}
1273             }
1274         };
1275 
1276         if (dcn <= 0) dcn = 3;
1277 
1278         GpuMat src = _src.getGpuMat();
1279 
1280         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1281         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1282         CV_Assert( dcn == 3 || dcn == 4 );
1283 
1284         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1285         GpuMat dst = _dst.getGpuMat();
1286 
1287         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
1288     }
1289 
HLS_to_RGB_FULL(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1290     void HLS_to_RGB_FULL(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1291     {
1292         using namespace cv::cuda::device;
1293         static const gpu_func_t funcs[2][2][6] =
1294         {
1295             {
1296                 {HLS_to_RGB_FULL_8u, 0, 0, 0, 0, HLS_to_RGB_FULL_32f},
1297                 {HLS4_to_RGB_FULL_8u, 0, 0, 0, 0, HLS4_to_RGB_FULL_32f}
1298             },
1299             {
1300                 {HLS_to_RGBA_FULL_8u, 0, 0, 0, 0, HLS_to_RGBA_FULL_32f},
1301                 {HLS4_to_RGBA_FULL_8u, 0, 0, 0, 0, HLS4_to_RGBA_FULL_32f}
1302             }
1303         };
1304 
1305         if (dcn <= 0) dcn = 3;
1306 
1307         GpuMat src = _src.getGpuMat();
1308 
1309         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1310         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1311         CV_Assert( dcn == 3 || dcn == 4 );
1312 
1313         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1314         GpuMat dst = _dst.getGpuMat();
1315 
1316         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
1317     }
1318 
HLS_to_BGR_FULL(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1319     void HLS_to_BGR_FULL(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1320     {
1321         using namespace cv::cuda::device;
1322         static const gpu_func_t funcs[2][2][6] =
1323         {
1324             {
1325                 {HLS_to_BGR_FULL_8u, 0, 0, 0, 0, HLS_to_BGR_FULL_32f},
1326                 {HLS4_to_BGR_FULL_8u, 0, 0, 0, 0, HLS4_to_BGR_FULL_32f}
1327             },
1328             {
1329                 {HLS_to_BGRA_FULL_8u, 0, 0, 0, 0, HLS_to_BGRA_FULL_32f},
1330                 {HLS4_to_BGRA_FULL_8u, 0, 0, 0, 0, HLS4_to_BGRA_FULL_32f}
1331             }
1332         };
1333 
1334         if (dcn <= 0) dcn = 3;
1335 
1336         GpuMat src = _src.getGpuMat();
1337 
1338         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1339         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1340         CV_Assert( dcn == 3 || dcn == 4 );
1341 
1342         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1343         GpuMat dst = _dst.getGpuMat();
1344 
1345         funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, stream);
1346     }
1347 
BGR_to_Lab(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1348     void BGR_to_Lab(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1349     {
1350         using namespace cv::cuda::device;
1351         static const gpu_func_t funcs[2][2][2] =
1352         {
1353             {
1354                 {BGR_to_Lab_8u, BGR_to_Lab_32f},
1355                 {BGRA_to_Lab_8u, BGRA_to_Lab_32f}
1356             },
1357             {
1358                 {BGR_to_Lab4_8u, BGR_to_Lab4_32f},
1359                 {BGRA_to_Lab4_8u, BGRA_to_Lab4_32f}
1360             }
1361         };
1362 
1363         if (dcn <= 0) dcn = 3;
1364 
1365         GpuMat src = _src.getGpuMat();
1366 
1367         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1368         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1369         CV_Assert( dcn == 3 || dcn == 4 );
1370 
1371         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1372         GpuMat dst = _dst.getGpuMat();
1373 
1374         funcs[dcn == 4][src.channels() == 4][src.depth() == CV_32F](src, dst, stream);
1375     }
1376 
RGB_to_Lab(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1377     void RGB_to_Lab(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1378     {
1379         using namespace cv::cuda::device;
1380         static const gpu_func_t funcs[2][2][2] =
1381         {
1382             {
1383                 {RGB_to_Lab_8u, RGB_to_Lab_32f},
1384                 {RGBA_to_Lab_8u, RGBA_to_Lab_32f}
1385             },
1386             {
1387                 {RGB_to_Lab4_8u, RGB_to_Lab4_32f},
1388                 {RGBA_to_Lab4_8u, RGBA_to_Lab4_32f}
1389             }
1390         };
1391 
1392         if (dcn <= 0) dcn = 3;
1393 
1394         GpuMat src = _src.getGpuMat();
1395 
1396         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1397         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1398         CV_Assert( dcn == 3 || dcn == 4 );
1399 
1400         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1401         GpuMat dst = _dst.getGpuMat();
1402 
1403         funcs[dcn == 4][src.channels() == 4][src.depth() == CV_32F](src, dst, stream);
1404     }
1405 
LBGR_to_Lab(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1406     void LBGR_to_Lab(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1407     {
1408         using namespace cv::cuda::device;
1409         static const gpu_func_t funcs[2][2][2] =
1410         {
1411             {
1412                 {LBGR_to_Lab_8u, LBGR_to_Lab_32f},
1413                 {LBGRA_to_Lab_8u, LBGRA_to_Lab_32f}
1414             },
1415             {
1416                 {LBGR_to_Lab4_8u, LBGR_to_Lab4_32f},
1417                 {LBGRA_to_Lab4_8u, LBGRA_to_Lab4_32f}
1418             }
1419         };
1420 
1421         if (dcn <= 0) dcn = 3;
1422 
1423         GpuMat src = _src.getGpuMat();
1424 
1425         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1426         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1427         CV_Assert( dcn == 3 || dcn == 4 );
1428 
1429         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1430         GpuMat dst = _dst.getGpuMat();
1431 
1432         funcs[dcn == 4][src.channels() == 4][src.depth() == CV_32F](src, dst, stream);
1433     }
1434 
LRGB_to_Lab(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1435     void LRGB_to_Lab(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1436     {
1437         using namespace cv::cuda::device;
1438         static const gpu_func_t funcs[2][2][2] =
1439         {
1440             {
1441                 {LRGB_to_Lab_8u, LRGB_to_Lab_32f},
1442                 {LRGBA_to_Lab_8u, LRGBA_to_Lab_32f}
1443             },
1444             {
1445                 {LRGB_to_Lab4_8u, LRGB_to_Lab4_32f},
1446                 {LRGBA_to_Lab4_8u, LRGBA_to_Lab4_32f}
1447             }
1448         };
1449 
1450         if (dcn <= 0) dcn = 3;
1451 
1452         GpuMat src = _src.getGpuMat();
1453 
1454         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1455         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1456         CV_Assert( dcn == 3 || dcn == 4 );
1457 
1458         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1459         GpuMat dst = _dst.getGpuMat();
1460 
1461         funcs[dcn == 4][src.channels() == 4][src.depth() == CV_32F](src, dst, stream);
1462     }
1463 
Lab_to_BGR(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1464     void Lab_to_BGR(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1465     {
1466         using namespace cv::cuda::device;
1467         static const gpu_func_t funcs[2][2][2] =
1468         {
1469             {
1470                 {Lab_to_BGR_8u, Lab_to_BGR_32f},
1471                 {Lab4_to_BGR_8u, Lab4_to_BGR_32f}
1472             },
1473             {
1474                 {Lab_to_BGRA_8u, Lab_to_BGRA_32f},
1475                 {Lab4_to_BGRA_8u, Lab4_to_BGRA_32f}
1476             }
1477         };
1478 
1479         if (dcn <= 0) dcn = 3;
1480 
1481         GpuMat src = _src.getGpuMat();
1482 
1483         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1484         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1485         CV_Assert( dcn == 3 || dcn == 4 );
1486 
1487         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1488         GpuMat dst = _dst.getGpuMat();
1489 
1490         funcs[dcn == 4][src.channels() == 4][src.depth() == CV_32F](src, dst, stream);
1491     }
1492 
Lab_to_RGB(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1493     void Lab_to_RGB(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1494     {
1495         using namespace cv::cuda::device;
1496         static const gpu_func_t funcs[2][2][2] =
1497         {
1498             {
1499                 {Lab_to_RGB_8u, Lab_to_RGB_32f},
1500                 {Lab4_to_RGB_8u, Lab4_to_RGB_32f}
1501             },
1502             {
1503                 {Lab_to_RGBA_8u, Lab_to_RGBA_32f},
1504                 {Lab4_to_RGBA_8u, Lab4_to_RGBA_32f}
1505             }
1506         };
1507 
1508         if (dcn <= 0) dcn = 3;
1509 
1510         GpuMat src = _src.getGpuMat();
1511 
1512         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1513         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1514         CV_Assert( dcn == 3 || dcn == 4 );
1515 
1516         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1517         GpuMat dst = _dst.getGpuMat();
1518 
1519         funcs[dcn == 4][src.channels() == 4][src.depth() == CV_32F](src, dst, stream);
1520     }
1521 
Lab_to_LBGR(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1522     void Lab_to_LBGR(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1523     {
1524         using namespace cv::cuda::device;
1525         static const gpu_func_t funcs[2][2][2] =
1526         {
1527             {
1528                 {Lab_to_LBGR_8u, Lab_to_LBGR_32f},
1529                 {Lab4_to_LBGR_8u, Lab4_to_LBGR_32f}
1530             },
1531             {
1532                 {Lab_to_LBGRA_8u, Lab_to_LBGRA_32f},
1533                 {Lab4_to_LBGRA_8u, Lab4_to_LBGRA_32f}
1534             }
1535         };
1536 
1537         if (dcn <= 0) dcn = 3;
1538 
1539         GpuMat src = _src.getGpuMat();
1540 
1541         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1542         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1543         CV_Assert( dcn == 3 || dcn == 4 );
1544 
1545         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1546         GpuMat dst = _dst.getGpuMat();
1547 
1548         funcs[dcn == 4][src.channels() == 4][src.depth() == CV_32F](src, dst, stream);
1549     }
1550 
Lab_to_LRGB(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1551     void Lab_to_LRGB(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1552     {
1553         using namespace cv::cuda::device;
1554         static const gpu_func_t funcs[2][2][2] =
1555         {
1556             {
1557                 {Lab_to_LRGB_8u, Lab_to_LRGB_32f},
1558                 {Lab4_to_LRGB_8u, Lab4_to_LRGB_32f}
1559             },
1560             {
1561                 {Lab_to_LRGBA_8u, Lab_to_LRGBA_32f},
1562                 {Lab4_to_LRGBA_8u, Lab4_to_LRGBA_32f}
1563             }
1564         };
1565 
1566         if (dcn <= 0) dcn = 3;
1567 
1568         GpuMat src = _src.getGpuMat();
1569 
1570         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1571         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1572         CV_Assert( dcn == 3 || dcn == 4 );
1573 
1574         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1575         GpuMat dst = _dst.getGpuMat();
1576 
1577         funcs[dcn == 4][src.channels() == 4][src.depth() == CV_32F](src, dst, stream);
1578     }
1579 
BGR_to_Luv(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1580     void BGR_to_Luv(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1581     {
1582         using namespace cv::cuda::device;
1583         static const gpu_func_t funcs[2][2][2] =
1584         {
1585             {
1586                 {BGR_to_Luv_8u, BGR_to_Luv_32f},
1587                 {BGRA_to_Luv_8u, BGRA_to_Luv_32f}
1588             },
1589             {
1590                 {BGR_to_Luv4_8u, BGR_to_Luv4_32f},
1591                 {BGRA_to_Luv4_8u, BGRA_to_Luv4_32f}
1592             }
1593         };
1594 
1595         if (dcn <= 0) dcn = 3;
1596 
1597         GpuMat src = _src.getGpuMat();
1598 
1599         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1600         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1601         CV_Assert( dcn == 3 || dcn == 4 );
1602 
1603         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1604         GpuMat dst = _dst.getGpuMat();
1605 
1606         funcs[dcn == 4][src.channels() == 4][src.depth() == CV_32F](src, dst, stream);
1607     }
1608 
RGB_to_Luv(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1609     void RGB_to_Luv(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1610     {
1611         using namespace cv::cuda::device;
1612         static const gpu_func_t funcs[2][2][2] =
1613         {
1614             {
1615                 {RGB_to_Luv_8u, RGB_to_Luv_32f},
1616                 {RGBA_to_Luv_8u, RGBA_to_Luv_32f}
1617             },
1618             {
1619                 {RGB_to_Luv4_8u, RGB_to_Luv4_32f},
1620                 {RGBA_to_Luv4_8u, RGBA_to_Luv4_32f}
1621             }
1622         };
1623 
1624         if (dcn <= 0) dcn = 3;
1625 
1626         GpuMat src = _src.getGpuMat();
1627 
1628         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1629         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1630         CV_Assert( dcn == 3 || dcn == 4 );
1631 
1632         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1633         GpuMat dst = _dst.getGpuMat();
1634 
1635         funcs[dcn == 4][src.channels() == 4][src.depth() == CV_32F](src, dst, stream);
1636     }
1637 
LBGR_to_Luv(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1638     void LBGR_to_Luv(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1639     {
1640         using namespace cv::cuda::device;
1641         static const gpu_func_t funcs[2][2][2] =
1642         {
1643             {
1644                 {LBGR_to_Luv_8u, LBGR_to_Luv_32f},
1645                 {LBGRA_to_Luv_8u, LBGRA_to_Luv_32f}
1646             },
1647             {
1648                 {LBGR_to_Luv4_8u, LBGR_to_Luv4_32f},
1649                 {LBGRA_to_Luv4_8u, LBGRA_to_Luv4_32f}
1650             }
1651         };
1652 
1653         if (dcn <= 0) dcn = 3;
1654 
1655         GpuMat src = _src.getGpuMat();
1656 
1657         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1658         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1659         CV_Assert( dcn == 3 || dcn == 4 );
1660 
1661         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1662         GpuMat dst = _dst.getGpuMat();
1663 
1664         funcs[dcn == 4][src.channels() == 4][src.depth() == CV_32F](src, dst, stream);
1665     }
1666 
LRGB_to_Luv(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1667     void LRGB_to_Luv(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1668     {
1669         using namespace cv::cuda::device;
1670         static const gpu_func_t funcs[2][2][2] =
1671         {
1672             {
1673                 {LRGB_to_Luv_8u, LRGB_to_Luv_32f},
1674                 {LRGBA_to_Luv_8u, LRGBA_to_Luv_32f}
1675             },
1676             {
1677                 {LRGB_to_Luv4_8u, LRGB_to_Luv4_32f},
1678                 {LRGBA_to_Luv4_8u, LRGBA_to_Luv4_32f}
1679             }
1680         };
1681 
1682         if (dcn <= 0) dcn = 3;
1683 
1684         GpuMat src = _src.getGpuMat();
1685 
1686         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1687         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1688         CV_Assert( dcn == 3 || dcn == 4 );
1689 
1690         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1691         GpuMat dst = _dst.getGpuMat();
1692 
1693         funcs[dcn == 4][src.channels() == 4][src.depth() == CV_32F](src, dst, stream);
1694     }
1695 
Luv_to_BGR(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1696     void Luv_to_BGR(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1697     {
1698         using namespace cv::cuda::device;
1699         static const gpu_func_t funcs[2][2][2] =
1700         {
1701             {
1702                 {Luv_to_BGR_8u, Luv_to_BGR_32f},
1703                 {Luv4_to_BGR_8u, Luv4_to_BGR_32f}
1704             },
1705             {
1706                 {Luv_to_BGRA_8u, Luv_to_BGRA_32f},
1707                 {Luv4_to_BGRA_8u, Luv4_to_BGRA_32f}
1708             }
1709         };
1710 
1711         if (dcn <= 0) dcn = 3;
1712 
1713         GpuMat src = _src.getGpuMat();
1714 
1715         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1716         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1717         CV_Assert( dcn == 3 || dcn == 4 );
1718 
1719         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1720         GpuMat dst = _dst.getGpuMat();
1721 
1722         funcs[dcn == 4][src.channels() == 4][src.depth() == CV_32F](src, dst, stream);
1723     }
1724 
Luv_to_RGB(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1725     void Luv_to_RGB(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1726     {
1727         using namespace cv::cuda::device;
1728         static const gpu_func_t funcs[2][2][2] =
1729         {
1730             {
1731                 {Luv_to_RGB_8u, Luv_to_RGB_32f},
1732                 {Luv4_to_RGB_8u, Luv4_to_RGB_32f}
1733             },
1734             {
1735                 {Luv_to_RGBA_8u, Luv_to_RGBA_32f},
1736                 {Luv4_to_RGBA_8u, Luv4_to_RGBA_32f}
1737             }
1738         };
1739 
1740         if (dcn <= 0) dcn = 3;
1741 
1742         GpuMat src = _src.getGpuMat();
1743 
1744         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1745         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1746         CV_Assert( dcn == 3 || dcn == 4 );
1747 
1748         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1749         GpuMat dst = _dst.getGpuMat();
1750 
1751         funcs[dcn == 4][src.channels() == 4][src.depth() == CV_32F](src, dst, stream);
1752     }
1753 
Luv_to_LBGR(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1754     void Luv_to_LBGR(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1755     {
1756         using namespace cv::cuda::device;
1757         static const gpu_func_t funcs[2][2][2] =
1758         {
1759             {
1760                 {Luv_to_LBGR_8u, Luv_to_LBGR_32f},
1761                 {Luv4_to_LBGR_8u, Luv4_to_LBGR_32f}
1762             },
1763             {
1764                 {Luv_to_LBGRA_8u, Luv_to_LBGRA_32f},
1765                 {Luv4_to_LBGRA_8u, Luv4_to_LBGRA_32f}
1766             }
1767         };
1768 
1769         if (dcn <= 0) dcn = 3;
1770 
1771         GpuMat src = _src.getGpuMat();
1772 
1773         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1774         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1775         CV_Assert( dcn == 3 || dcn == 4 );
1776 
1777         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1778         GpuMat dst = _dst.getGpuMat();
1779 
1780         funcs[dcn == 4][src.channels() == 4][src.depth() == CV_32F](src, dst, stream);
1781     }
1782 
Luv_to_LRGB(InputArray _src,OutputArray _dst,int dcn,Stream & stream)1783     void Luv_to_LRGB(InputArray _src, OutputArray _dst, int dcn, Stream& stream)
1784     {
1785         using namespace cv::cuda::device;
1786         static const gpu_func_t funcs[2][2][2] =
1787         {
1788             {
1789                 {Luv_to_LRGB_8u, Luv_to_LRGB_32f},
1790                 {Luv4_to_LRGB_8u, Luv4_to_LRGB_32f}
1791             },
1792             {
1793                 {Luv_to_LRGBA_8u, Luv_to_LRGBA_32f},
1794                 {Luv4_to_LRGBA_8u, Luv4_to_LRGBA_32f}
1795             }
1796         };
1797 
1798         if (dcn <= 0) dcn = 3;
1799 
1800         GpuMat src = _src.getGpuMat();
1801 
1802         CV_Assert( src.depth() == CV_8U || src.depth() == CV_32F );
1803         CV_Assert( src.channels() == 3 || src.channels() == 4 );
1804         CV_Assert( dcn == 3 || dcn == 4 );
1805 
1806         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1807         GpuMat dst = _dst.getGpuMat();
1808 
1809         funcs[dcn == 4][src.channels() == 4][src.depth() == CV_32F](src, dst, stream);
1810     }
1811 
RGBA_to_mBGRA(InputArray _src,OutputArray _dst,int,Stream & _stream)1812     void RGBA_to_mBGRA(InputArray _src, OutputArray _dst, int, Stream& _stream)
1813     {
1814     #if (CUDA_VERSION < 5000)
1815         (void) _src;
1816         (void) _dst;
1817         (void) _stream;
1818         CV_Error( Error::StsBadFlag, "Unknown/unsupported color conversion code" );
1819     #else
1820         GpuMat src = _src.getGpuMat();
1821 
1822         CV_Assert( src.type() == CV_8UC4 || src.type() == CV_16UC4 );
1823 
1824         _dst.create(src.size(), src.type());
1825         GpuMat dst = _dst.getGpuMat();
1826 
1827         cudaStream_t stream = StreamAccessor::getStream(_stream);
1828         NppStreamHandler h(stream);
1829 
1830         NppiSize oSizeROI;
1831         oSizeROI.width = src.cols;
1832         oSizeROI.height = src.rows;
1833 
1834         if (src.depth() == CV_8U)
1835             nppSafeCall( nppiAlphaPremul_8u_AC4R(src.ptr<Npp8u>(), static_cast<int>(src.step), dst.ptr<Npp8u>(), static_cast<int>(dst.step), oSizeROI) );
1836         else
1837             nppSafeCall( nppiAlphaPremul_16u_AC4R(src.ptr<Npp16u>(), static_cast<int>(src.step), dst.ptr<Npp16u>(), static_cast<int>(dst.step), oSizeROI) );
1838 
1839         if (stream == 0)
1840             cudaSafeCall( cudaDeviceSynchronize() );
1841     #endif
1842     }
1843 
bayer_to_BGR(InputArray _src,OutputArray _dst,int dcn,bool blue_last,bool start_with_green,Stream & stream)1844     void bayer_to_BGR(InputArray _src, OutputArray _dst, int dcn, bool blue_last, bool start_with_green, Stream& stream)
1845     {
1846         typedef void (*func_t)(PtrStepSzb src, PtrStepSzb dst, bool blue_last, bool start_with_green, cudaStream_t stream);
1847         static const func_t funcs[3][4] =
1848         {
1849             {0,0,Bayer2BGR_8u_gpu<3>, Bayer2BGR_8u_gpu<4>},
1850             {0,0,0,0},
1851             {0,0,Bayer2BGR_16u_gpu<3>, Bayer2BGR_16u_gpu<4>}
1852         };
1853 
1854         if (dcn <= 0) dcn = 3;
1855 
1856         GpuMat src = _src.getGpuMat();
1857 
1858         CV_Assert( src.type() == CV_8UC1 || src.type() == CV_16UC1 );
1859         CV_Assert( src.rows > 2 && src.cols > 2 );
1860         CV_Assert( dcn == 3 || dcn == 4 );
1861 
1862         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), dcn));
1863         GpuMat dst = _dst.getGpuMat();
1864 
1865         funcs[src.depth()][dcn - 1](src, dst, blue_last, start_with_green, StreamAccessor::getStream(stream));
1866     }
bayerBG_to_BGR(InputArray src,OutputArray dst,int dcn,Stream & stream)1867     void bayerBG_to_BGR(InputArray src, OutputArray dst, int dcn, Stream& stream)
1868     {
1869         bayer_to_BGR(src, dst, dcn, false, false, stream);
1870     }
bayeRGB_to_BGR(InputArray src,OutputArray dst,int dcn,Stream & stream)1871     void bayeRGB_to_BGR(InputArray src, OutputArray dst, int dcn, Stream& stream)
1872     {
1873         bayer_to_BGR(src, dst, dcn, false, true, stream);
1874     }
bayerRG_to_BGR(InputArray src,OutputArray dst,int dcn,Stream & stream)1875     void bayerRG_to_BGR(InputArray src, OutputArray dst, int dcn, Stream& stream)
1876     {
1877         bayer_to_BGR(src, dst, dcn, true, false, stream);
1878     }
bayerGR_to_BGR(InputArray src,OutputArray dst,int dcn,Stream & stream)1879     void bayerGR_to_BGR(InputArray src, OutputArray dst, int dcn, Stream& stream)
1880     {
1881         bayer_to_BGR(src, dst, dcn, true, true, stream);
1882     }
1883 
bayer_to_gray(InputArray _src,OutputArray _dst,bool blue_last,bool start_with_green,Stream & stream)1884     void bayer_to_gray(InputArray _src, OutputArray _dst, bool blue_last, bool start_with_green, Stream& stream)
1885     {
1886         typedef void (*func_t)(PtrStepSzb src, PtrStepSzb dst, bool blue_last, bool start_with_green, cudaStream_t stream);
1887         static const func_t funcs[3] =
1888         {
1889             Bayer2BGR_8u_gpu<1>,
1890             0,
1891             Bayer2BGR_16u_gpu<1>,
1892         };
1893 
1894         GpuMat src = _src.getGpuMat();
1895 
1896         CV_Assert( src.type() == CV_8UC1 || src.type() == CV_16UC1 );
1897         CV_Assert( src.rows > 2 && src.cols > 2 );
1898 
1899         _dst.create(src.size(), CV_MAKE_TYPE(src.depth(), 1));
1900         GpuMat dst = _dst.getGpuMat();
1901 
1902         funcs[src.depth()](src, dst, blue_last, start_with_green, StreamAccessor::getStream(stream));
1903     }
bayerBG_to_gray(InputArray src,OutputArray dst,int,Stream & stream)1904     void bayerBG_to_gray(InputArray src, OutputArray dst, int /*dcn*/, Stream& stream)
1905     {
1906         bayer_to_gray(src, dst, false, false, stream);
1907     }
bayeRGB_to_GRAY(InputArray src,OutputArray dst,int,Stream & stream)1908     void bayeRGB_to_GRAY(InputArray src, OutputArray dst, int /*dcn*/, Stream& stream)
1909     {
1910         bayer_to_gray(src, dst, false, true, stream);
1911     }
bayerRG_to_gray(InputArray src,OutputArray dst,int,Stream & stream)1912     void bayerRG_to_gray(InputArray src, OutputArray dst, int /*dcn*/, Stream& stream)
1913     {
1914         bayer_to_gray(src, dst, true, false, stream);
1915     }
bayerGR_to_gray(InputArray src,OutputArray dst,int,Stream & stream)1916     void bayerGR_to_gray(InputArray src, OutputArray dst, int /*dcn*/, Stream& stream)
1917     {
1918         bayer_to_gray(src, dst, true, true, stream);
1919     }
1920 }
1921 
1922 ////////////////////////////////////////////////////////////////////////
1923 // cvtColor
1924 
cvtColor(InputArray src,OutputArray dst,int code,int dcn,Stream & stream)1925 void cv::cuda::cvtColor(InputArray src, OutputArray dst, int code, int dcn, Stream& stream)
1926 {
1927     typedef void (*func_t)(InputArray src, OutputArray dst, int dcn, Stream& stream);
1928     static const func_t funcs[] =
1929     {
1930         BGR_to_BGRA,            // CV_BGR2BGRA    =0
1931         BGRA_to_BGR,            // CV_BGRA2BGR    =1
1932         BGR_to_RGBA,            // CV_BGR2RGBA    =2
1933         BGRA_to_RGB,            // CV_RGBA2BGR    =3
1934         BGR_to_RGB,             // CV_BGR2RGB     =4
1935         BGRA_to_RGBA,           // CV_BGRA2RGBA   =5
1936 
1937         BGR_to_GRAY,            // CV_BGR2GRAY    =6
1938         RGB_to_GRAY,            // CV_RGB2GRAY    =7
1939         GRAY_to_BGR,            // CV_GRAY2BGR    =8
1940         GRAY_to_BGRA,           // CV_GRAY2BGRA   =9
1941         BGRA_to_GRAY,           // CV_BGRA2GRAY   =10
1942         RGBA_to_GRAY,           // CV_RGBA2GRAY   =11
1943 
1944         BGR_to_BGR565,          // CV_BGR2BGR565  =12
1945         RGB_to_BGR565,          // CV_RGB2BGR565  =13
1946         BGR565_to_BGR,          // CV_BGR5652BGR  =14
1947         BGR565_to_RGB,          // CV_BGR5652RGB  =15
1948         BGRA_to_BGR565,         // CV_BGRA2BGR565 =16
1949         RGBA_to_BGR565,         // CV_RGBA2BGR565 =17
1950         BGR565_to_BGRA,         // CV_BGR5652BGRA =18
1951         BGR565_to_RGBA,         // CV_BGR5652RGBA =19
1952 
1953         GRAY_to_BGR565,         // CV_GRAY2BGR565 =20
1954         BGR565_to_GRAY,         // CV_BGR5652GRAY =21
1955 
1956         BGR_to_BGR555,          // CV_BGR2BGR555  =22
1957         RGB_to_BGR555,          // CV_RGB2BGR555  =23
1958         BGR555_to_BGR,          // CV_BGR5552BGR  =24
1959         BGR555_to_RGB,          // CV_BGR5552RGB  =25
1960         BGRA_to_BGR555,         // CV_BGRA2BGR555 =26
1961         RGBA_to_BGR555,         // CV_RGBA2BGR555 =27
1962         BGR555_to_BGRA,         // CV_BGR5552BGRA =28
1963         BGR555_to_RGBA,         // CV_BGR5552RGBA =29
1964 
1965         GRAY_to_BGR555,         // CV_GRAY2BGR555 =30
1966         BGR555_to_GRAY,         // CV_BGR5552GRAY =31
1967 
1968         BGR_to_XYZ,             // CV_BGR2XYZ     =32
1969         RGB_to_XYZ,             // CV_RGB2XYZ     =33
1970         XYZ_to_BGR,             // CV_XYZ2BGR     =34
1971         XYZ_to_RGB,             // CV_XYZ2RGB     =35
1972 
1973         BGR_to_YCrCb,           // CV_BGR2YCrCb   =36
1974         RGB_to_YCrCb,           // CV_RGB2YCrCb   =37
1975         YCrCb_to_BGR,           // CV_YCrCb2BGR   =38
1976         YCrCb_to_RGB,           // CV_YCrCb2RGB   =39
1977 
1978         BGR_to_HSV,             // CV_BGR2HSV     =40
1979         RGB_to_HSV,             // CV_RGB2HSV     =41
1980 
1981         0,                      //                =42
1982         0,                      //                =43
1983 
1984         BGR_to_Lab,             // CV_BGR2Lab     =44
1985         RGB_to_Lab,             // CV_RGB2Lab     =45
1986 
1987         bayerBG_to_BGR,         // CV_BayerBG2BGR =46
1988         bayeRGB_to_BGR,         // CV_BayeRGB2BGR =47
1989         bayerRG_to_BGR,         // CV_BayerRG2BGR =48
1990         bayerGR_to_BGR,         // CV_BayerGR2BGR =49
1991 
1992         BGR_to_Luv,             // CV_BGR2Luv     =50
1993         RGB_to_Luv,             // CV_RGB2Luv     =51
1994 
1995         BGR_to_HLS,             // CV_BGR2HLS     =52
1996         RGB_to_HLS,             // CV_RGB2HLS     =53
1997 
1998         HSV_to_BGR,             // CV_HSV2BGR     =54
1999         HSV_to_RGB,             // CV_HSV2RGB     =55
2000 
2001         Lab_to_BGR,             // CV_Lab2BGR     =56
2002         Lab_to_RGB,             // CV_Lab2RGB     =57
2003         Luv_to_BGR,             // CV_Luv2BGR     =58
2004         Luv_to_RGB,             // CV_Luv2RGB     =59
2005 
2006         HLS_to_BGR,             // CV_HLS2BGR     =60
2007         HLS_to_RGB,             // CV_HLS2RGB     =61
2008 
2009         0,                      // CV_BayerBG2BGR_VNG =62
2010         0,                      // CV_BayeRGB2BGR_VNG =63
2011         0,                      // CV_BayerRG2BGR_VNG =64
2012         0,                      // CV_BayerGR2BGR_VNG =65
2013 
2014         BGR_to_HSV_FULL,        // CV_BGR2HSV_FULL = 66
2015         RGB_to_HSV_FULL,        // CV_RGB2HSV_FULL = 67
2016         BGR_to_HLS_FULL,        // CV_BGR2HLS_FULL = 68
2017         RGB_to_HLS_FULL,        // CV_RGB2HLS_FULL = 69
2018 
2019         HSV_to_BGR_FULL,        // CV_HSV2BGR_FULL = 70
2020         HSV_to_RGB_FULL,        // CV_HSV2RGB_FULL = 71
2021         HLS_to_BGR_FULL,        // CV_HLS2BGR_FULL = 72
2022         HLS_to_RGB_FULL,        // CV_HLS2RGB_FULL = 73
2023 
2024         LBGR_to_Lab,            // CV_LBGR2Lab     = 74
2025         LRGB_to_Lab,            // CV_LRGB2Lab     = 75
2026         LBGR_to_Luv,            // CV_LBGR2Luv     = 76
2027         LRGB_to_Luv,            // CV_LRGB2Luv     = 77
2028 
2029         Lab_to_LBGR,            // CV_Lab2LBGR     = 78
2030         Lab_to_LRGB,            // CV_Lab2LRGB     = 79
2031         Luv_to_LBGR,            // CV_Luv2LBGR     = 80
2032         Luv_to_LRGB,            // CV_Luv2LRGB     = 81
2033 
2034         BGR_to_YUV,             // CV_BGR2YUV      = 82
2035         RGB_to_YUV,             // CV_RGB2YUV      = 83
2036         YUV_to_BGR,             // CV_YUV2BGR      = 84
2037         YUV_to_RGB,             // CV_YUV2RGB      = 85
2038 
2039         bayerBG_to_gray,        // CV_BayerBG2GRAY = 86
2040         bayeRGB_to_GRAY,        // CV_BayeRGB2GRAY = 87
2041         bayerRG_to_gray,        // CV_BayerRG2GRAY = 88
2042         bayerGR_to_gray,        // CV_BayerGR2GRAY = 89
2043 
2044         //YUV 4:2:0 formats family
2045         0,                      // CV_YUV2RGB_NV12 = 90,
2046         0,                      // CV_YUV2BGR_NV12 = 91,
2047         0,                      // CV_YUV2RGB_NV21 = 92,
2048         0,                      // CV_YUV2BGR_NV21 = 93,
2049 
2050         0,                      // CV_YUV2RGBA_NV12 = 94,
2051         0,                      // CV_YUV2BGRA_NV12 = 95,
2052         0,                      // CV_YUV2RGBA_NV21 = 96,
2053         0,                      // CV_YUV2BGRA_NV21 = 97,
2054 
2055         0,                      // CV_YUV2RGB_YV12 = 98,
2056         0,                      // CV_YUV2BGR_YV12 = 99,
2057         0,                      // CV_YUV2RGB_IYUV = 100,
2058         0,                      // CV_YUV2BGR_IYUV = 101,
2059 
2060         0,                      // CV_YUV2RGBA_YV12 = 102,
2061         0,                      // CV_YUV2BGRA_YV12 = 103,
2062         0,                      // CV_YUV2RGBA_IYUV = 104,
2063         0,                      // CV_YUV2BGRA_IYUV = 105,
2064 
2065         0,                      // CV_YUV2GRAY_420 = 106,
2066 
2067         //YUV 4:2:2 formats family
2068         0,                      // CV_YUV2RGB_UYVY = 107,
2069         0,                      // CV_YUV2BGR_UYVY = 108,
2070         0,                      // //CV_YUV2RGB_VYUY = 109,
2071         0,                      // //CV_YUV2BGR_VYUY = 110,
2072 
2073         0,                      // CV_YUV2RGBA_UYVY = 111,
2074         0,                      // CV_YUV2BGRA_UYVY = 112,
2075         0,                      // //CV_YUV2RGBA_VYUY = 113,
2076         0,                      // //CV_YUV2BGRA_VYUY = 114,
2077 
2078         0,                      // CV_YUV2RGB_YUY2 = 115,
2079         0,                      // CV_YUV2BGR_YUY2 = 116,
2080         0,                      // CV_YUV2RGB_YVYU = 117,
2081         0,                      // CV_YUV2BGR_YVYU = 118,
2082 
2083         0,                      // CV_YUV2RGBA_YUY2 = 119,
2084         0,                      // CV_YUV2BGRA_YUY2 = 120,
2085         0,                      // CV_YUV2RGBA_YVYU = 121,
2086         0,                      // CV_YUV2BGRA_YVYU = 122,
2087 
2088         0,                      // CV_YUV2GRAY_UYVY = 123,
2089         0,                      // CV_YUV2GRAY_YUY2 = 124,
2090 
2091         // alpha premultiplication
2092         RGBA_to_mBGRA,          // CV_RGBA2mRGBA = 125,
2093         0,                      // CV_mRGBA2RGBA = 126,
2094 
2095         0,                      // CV_COLORCVT_MAX  = 127
2096     };
2097 
2098     CV_Assert( code < 128 );
2099 
2100     func_t func = funcs[code];
2101 
2102     if (func == 0)
2103         CV_Error(Error::StsBadFlag, "Unknown/unsupported color conversion code");
2104 
2105     func(src, dst, dcn, stream);
2106 }
2107 
2108 ////////////////////////////////////////////////////////////////////////
2109 // demosaicing
2110 
demosaicing(InputArray _src,OutputArray _dst,int code,int dcn,Stream & stream)2111 void cv::cuda::demosaicing(InputArray _src, OutputArray _dst, int code, int dcn, Stream& stream)
2112 {
2113     CV_Assert( !_src.empty() );
2114 
2115     switch (code)
2116     {
2117     case cv::COLOR_BayerBG2GRAY: case cv::COLOR_BayerGB2GRAY: case cv::COLOR_BayerRG2GRAY: case cv::COLOR_BayerGR2GRAY:
2118         bayer_to_gray(_src, _dst, code == cv::COLOR_BayerBG2GRAY || code == cv::COLOR_BayerGB2GRAY, code == cv::COLOR_BayerGB2GRAY || code == cv::COLOR_BayerGR2GRAY, stream);
2119         break;
2120 
2121     case cv::COLOR_BayerBG2BGR: case cv::COLOR_BayerGB2BGR: case cv::COLOR_BayerRG2BGR: case cv::COLOR_BayerGR2BGR:
2122         bayer_to_BGR(_src, _dst, dcn, code == cv::COLOR_BayerBG2BGR || code == cv::COLOR_BayerGB2BGR, code == cv::COLOR_BayerGB2BGR || code == cv::COLOR_BayerGR2BGR, stream);
2123         break;
2124 
2125     case COLOR_BayerBG2BGR_MHT: case COLOR_BayerGB2BGR_MHT: case COLOR_BayerRG2BGR_MHT: case COLOR_BayerGR2BGR_MHT:
2126     {
2127         if (dcn <= 0) dcn = 3;
2128 
2129         GpuMat src = _src.getGpuMat();
2130         const int depth = _src.depth();
2131 
2132         CV_Assert( depth == CV_8U );
2133         CV_Assert( src.channels() == 1 );
2134         CV_Assert( dcn == 3 || dcn == 4 );
2135 
2136         _dst.create(_src.size(), CV_MAKE_TYPE(depth, dcn));
2137         GpuMat dst = _dst.getGpuMat();
2138 
2139         dst.setTo(Scalar::all(0), stream);
2140 
2141         Size wholeSize;
2142         Point ofs;
2143         src.locateROI(wholeSize, ofs);
2144         PtrStepSzb srcWhole(wholeSize.height, wholeSize.width, src.datastart, src.step);
2145 
2146         const int2 firstRed = make_int2(code == COLOR_BayerRG2BGR_MHT || code == COLOR_BayerGB2BGR_MHT ? 0 : 1,
2147                                         code == COLOR_BayerRG2BGR_MHT || code == COLOR_BayerGR2BGR_MHT ? 0 : 1);
2148 
2149         if (dcn == 3)
2150             cv::cuda::device::MHCdemosaic<3>(srcWhole, make_int2(ofs.x, ofs.y), dst, firstRed, StreamAccessor::getStream(stream));
2151         else
2152             cv::cuda::device::MHCdemosaic<4>(srcWhole, make_int2(ofs.x, ofs.y), dst, firstRed, StreamAccessor::getStream(stream));
2153 
2154         break;
2155     }
2156 
2157     case COLOR_BayerBG2GRAY_MHT: case COLOR_BayerGB2GRAY_MHT: case COLOR_BayerRG2GRAY_MHT: case COLOR_BayerGR2GRAY_MHT:
2158     {
2159         GpuMat src = _src.getGpuMat();
2160         const int depth = _src.depth();
2161 
2162         CV_Assert( depth == CV_8U );
2163 
2164         _dst.create(_src.size(), CV_MAKE_TYPE(depth, 1));
2165         GpuMat dst = _dst.getGpuMat();
2166 
2167         dst.setTo(Scalar::all(0), stream);
2168 
2169         Size wholeSize;
2170         Point ofs;
2171         src.locateROI(wholeSize, ofs);
2172         PtrStepSzb srcWhole(wholeSize.height, wholeSize.width, src.datastart, src.step);
2173 
2174         const int2 firstRed = make_int2(code == COLOR_BayerRG2BGR_MHT || code == COLOR_BayerGB2BGR_MHT ? 0 : 1,
2175                                         code == COLOR_BayerRG2BGR_MHT || code == COLOR_BayerGR2BGR_MHT ? 0 : 1);
2176 
2177         cv::cuda::device::MHCdemosaic<1>(srcWhole, make_int2(ofs.x, ofs.y), dst, firstRed, StreamAccessor::getStream(stream));
2178 
2179         break;
2180     }
2181 
2182     default:
2183         CV_Error(Error::StsBadFlag, "Unknown / unsupported color conversion code");
2184     }
2185 }
2186 
2187 ////////////////////////////////////////////////////////////////////////
2188 // swapChannels
2189 
swapChannels(InputOutputArray _image,const int dstOrder[4],Stream & _stream)2190 void cv::cuda::swapChannels(InputOutputArray _image, const int dstOrder[4], Stream& _stream)
2191 {
2192     GpuMat image = _image.getGpuMat();
2193 
2194     CV_Assert( image.type() == CV_8UC4 );
2195 
2196     cudaStream_t stream = StreamAccessor::getStream(_stream);
2197     NppStreamHandler h(stream);
2198 
2199     NppiSize sz;
2200     sz.width  = image.cols;
2201     sz.height = image.rows;
2202 
2203     nppSafeCall( nppiSwapChannels_8u_C4IR(image.ptr<Npp8u>(), static_cast<int>(image.step), sz, dstOrder) );
2204 
2205     if (stream == 0)
2206         cudaSafeCall( cudaDeviceSynchronize() );
2207 }
2208 
2209 ////////////////////////////////////////////////////////////////////////
2210 // gammaCorrection
2211 
gammaCorrection(InputArray _src,OutputArray _dst,bool forward,Stream & stream)2212 void cv::cuda::gammaCorrection(InputArray _src, OutputArray _dst, bool forward, Stream& stream)
2213 {
2214 #if (CUDA_VERSION < 5000)
2215     (void) _src;
2216     (void) _dst;
2217     (void) forward;
2218     (void) stream;
2219     CV_Error(Error::StsNotImplemented, "This function works only with CUDA 5.0 or higher");
2220 #else
2221     typedef NppStatus (*func_t)(const Npp8u* pSrc, int nSrcStep, Npp8u* pDst, int nDstStep, NppiSize oSizeROI);
2222     typedef NppStatus (*func_inplace_t)(Npp8u* pSrcDst, int nSrcDstStep, NppiSize oSizeROI);
2223 
2224     static const func_t funcs[2][5] =
2225     {
2226         {0, 0, 0, nppiGammaInv_8u_C3R, nppiGammaInv_8u_AC4R},
2227         {0, 0, 0, nppiGammaFwd_8u_C3R, nppiGammaFwd_8u_AC4R}
2228     };
2229     static const func_inplace_t funcs_inplace[2][5] =
2230     {
2231         {0, 0, 0, nppiGammaInv_8u_C3IR, nppiGammaInv_8u_AC4IR},
2232         {0, 0, 0, nppiGammaFwd_8u_C3IR, nppiGammaFwd_8u_AC4IR}
2233     };
2234 
2235     GpuMat src = _src.getGpuMat();
2236 
2237     CV_Assert( src.type() == CV_8UC3 || src.type() == CV_8UC4 );
2238 
2239     _dst.create(src.size(), src.type());
2240     GpuMat dst = _dst.getGpuMat();
2241 
2242     NppStreamHandler h(StreamAccessor::getStream(stream));
2243 
2244     NppiSize oSizeROI;
2245     oSizeROI.width = src.cols;
2246     oSizeROI.height = src.rows;
2247 
2248     if (dst.data == src.data)
2249         funcs_inplace[forward][src.channels()](dst.ptr<Npp8u>(), static_cast<int>(src.step), oSizeROI);
2250     else
2251         funcs[forward][src.channels()](src.ptr<Npp8u>(), static_cast<int>(src.step), dst.ptr<Npp8u>(), static_cast<int>(dst.step), oSizeROI);
2252 
2253 #endif
2254 }
2255 
2256 ////////////////////////////////////////////////////////////////////////
2257 // alphaComp
2258 
2259 namespace
2260 {
2261     template <int DEPTH> struct NppAlphaCompFunc
2262     {
2263         typedef typename NPPTypeTraits<DEPTH>::npp_type npp_t;
2264 
2265         typedef NppStatus (*func_t)(const npp_t* pSrc1, int nSrc1Step, const npp_t* pSrc2, int nSrc2Step, npp_t* pDst, int nDstStep, NppiSize oSizeROI, NppiAlphaOp eAlphaOp);
2266     };
2267 
2268     template <int DEPTH, typename NppAlphaCompFunc<DEPTH>::func_t func> struct NppAlphaComp
2269     {
2270         typedef typename NPPTypeTraits<DEPTH>::npp_type npp_t;
2271 
call__anonb81fffaa0211::NppAlphaComp2272         static void call(const GpuMat& img1, const GpuMat& img2, GpuMat& dst, NppiAlphaOp eAlphaOp, cudaStream_t stream)
2273         {
2274             NppStreamHandler h(stream);
2275 
2276             NppiSize oSizeROI;
2277             oSizeROI.width = img1.cols;
2278             oSizeROI.height = img2.rows;
2279 
2280             nppSafeCall( func(img1.ptr<npp_t>(), static_cast<int>(img1.step), img2.ptr<npp_t>(), static_cast<int>(img2.step),
2281                               dst.ptr<npp_t>(), static_cast<int>(dst.step), oSizeROI, eAlphaOp) );
2282 
2283             if (stream == 0)
2284                 cudaSafeCall( cudaDeviceSynchronize() );
2285         }
2286     };
2287 }
2288 
alphaComp(InputArray _img1,InputArray _img2,OutputArray _dst,int alpha_op,Stream & stream)2289 void cv::cuda::alphaComp(InputArray _img1, InputArray _img2, OutputArray _dst, int alpha_op, Stream& stream)
2290 {
2291     static const NppiAlphaOp npp_alpha_ops[] = {
2292         NPPI_OP_ALPHA_OVER,
2293         NPPI_OP_ALPHA_IN,
2294         NPPI_OP_ALPHA_OUT,
2295         NPPI_OP_ALPHA_ATOP,
2296         NPPI_OP_ALPHA_XOR,
2297         NPPI_OP_ALPHA_PLUS,
2298         NPPI_OP_ALPHA_OVER_PREMUL,
2299         NPPI_OP_ALPHA_IN_PREMUL,
2300         NPPI_OP_ALPHA_OUT_PREMUL,
2301         NPPI_OP_ALPHA_ATOP_PREMUL,
2302         NPPI_OP_ALPHA_XOR_PREMUL,
2303         NPPI_OP_ALPHA_PLUS_PREMUL,
2304         NPPI_OP_ALPHA_PREMUL
2305     };
2306 
2307     typedef void (*func_t)(const GpuMat& img1, const GpuMat& img2, GpuMat& dst, NppiAlphaOp eAlphaOp, cudaStream_t stream);
2308     static const func_t funcs[] =
2309     {
2310         NppAlphaComp<CV_8U, nppiAlphaComp_8u_AC4R>::call,
2311         0,
2312         NppAlphaComp<CV_16U, nppiAlphaComp_16u_AC4R>::call,
2313         0,
2314         NppAlphaComp<CV_32S, nppiAlphaComp_32s_AC4R>::call,
2315         NppAlphaComp<CV_32F, nppiAlphaComp_32f_AC4R>::call
2316     };
2317 
2318     GpuMat img1 = _img1.getGpuMat();
2319     GpuMat img2 = _img2.getGpuMat();
2320 
2321     CV_Assert( img1.type() == CV_8UC4 || img1.type() == CV_16UC4 || img1.type() == CV_32SC4 || img1.type() == CV_32FC4 );
2322     CV_Assert( img1.size() == img2.size() && img1.type() == img2.type() );
2323 
2324     _dst.create(img1.size(), img1.type());
2325     GpuMat dst = _dst.getGpuMat();
2326 
2327     const func_t func = funcs[img1.depth()];
2328 
2329     func(img1, img2, dst, npp_alpha_ops[alpha_op], StreamAccessor::getStream(stream));
2330 }
2331 
2332 #endif /* !defined (HAVE_CUDA) */
2333