Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/modules/imgproc/src/color.hpp
16354 views
1
// This file is part of OpenCV project.
2
// It is subject to the license terms in the LICENSE file found in the top-level directory
3
// of this distribution and at http://opencv.org/license.html
4
5
#include "opencv2/imgproc.hpp"
6
#include "opencv2/core/utility.hpp"
7
#include <limits>
8
#include "opencl_kernels_imgproc.hpp"
9
#include "hal_replacement.hpp"
10
#include "opencv2/core/hal/intrin.hpp"
11
#include "opencv2/core/softfloat.hpp"
12
13
#define CV_DESCALE(x,n) (((x) + (1 << ((n)-1))) >> (n))
14
15
namespace cv
16
{
17
18
//constants for conversion from/to RGB and Gray, YUV, YCrCb according to BT.601
19
const float B2YF = 0.114f;
20
const float G2YF = 0.587f;
21
const float R2YF = 0.299f;
22
23
enum
24
{
25
gray_shift = 15,
26
yuv_shift = 14,
27
xyz_shift = 12,
28
R2Y = 4899, // == R2YF*16384
29
G2Y = 9617, // == G2YF*16384
30
B2Y = 1868, // == B2YF*16384
31
RY15 = 9798, // == R2YF*32768 + 0.5
32
GY15 = 19235, // == G2YF*32768 + 0.5
33
BY15 = 3735, // == B2YF*32768 + 0.5
34
BLOCK_SIZE = 256
35
};
36
37
template<typename _Tp> struct ColorChannel
38
{
39
typedef float worktype_f;
40
static _Tp max() { return std::numeric_limits<_Tp>::max(); }
41
static _Tp half() { return (_Tp)(max()/2 + 1); }
42
};
43
44
template<> struct ColorChannel<float>
45
{
46
typedef float worktype_f;
47
static float max() { return 1.f; }
48
static float half() { return 0.5f; }
49
};
50
51
/*template<> struct ColorChannel<double>
52
{
53
typedef double worktype_f;
54
static double max() { return 1.; }
55
static double half() { return 0.5; }
56
};*/
57
58
//
59
// Helper functions
60
//
61
62
namespace {
63
64
inline bool isHSV(int code)
65
{
66
switch(code)
67
{
68
case COLOR_HSV2BGR: case COLOR_HSV2RGB: case COLOR_HSV2BGR_FULL: case COLOR_HSV2RGB_FULL:
69
case COLOR_BGR2HSV: case COLOR_RGB2HSV: case COLOR_BGR2HSV_FULL: case COLOR_RGB2HSV_FULL:
70
return true;
71
default:
72
return false;
73
}
74
}
75
76
inline bool isLab(int code)
77
{
78
switch (code)
79
{
80
case COLOR_Lab2BGR: case COLOR_Lab2RGB: case COLOR_Lab2LBGR: case COLOR_Lab2LRGB:
81
case COLOR_BGR2Lab: case COLOR_RGB2Lab: case COLOR_LBGR2Lab: case COLOR_LRGB2Lab:
82
return true;
83
default:
84
return false;
85
}
86
}
87
88
inline bool is_sRGB(int code)
89
{
90
switch (code)
91
{
92
case COLOR_BGR2Lab: case COLOR_RGB2Lab: case COLOR_BGR2Luv: case COLOR_RGB2Luv:
93
case COLOR_Lab2BGR: case COLOR_Lab2RGB: case COLOR_Luv2BGR: case COLOR_Luv2RGB:
94
return true;
95
default:
96
return false;
97
}
98
}
99
100
inline bool swapBlue(int code)
101
{
102
switch (code)
103
{
104
case COLOR_BGR2BGRA: case COLOR_BGRA2BGR:
105
case COLOR_BGR2BGR565: case COLOR_BGR2BGR555: case COLOR_BGRA2BGR565: case COLOR_BGRA2BGR555:
106
case COLOR_BGR5652BGR: case COLOR_BGR5552BGR: case COLOR_BGR5652BGRA: case COLOR_BGR5552BGRA:
107
case COLOR_BGR2GRAY: case COLOR_BGRA2GRAY:
108
case COLOR_BGR2YCrCb: case COLOR_BGR2YUV:
109
case COLOR_YCrCb2BGR: case COLOR_YUV2BGR:
110
case COLOR_BGR2XYZ: case COLOR_XYZ2BGR:
111
case COLOR_BGR2HSV: case COLOR_BGR2HLS: case COLOR_BGR2HSV_FULL: case COLOR_BGR2HLS_FULL:
112
case COLOR_YUV2BGR_YV12: case COLOR_YUV2BGRA_YV12: case COLOR_YUV2BGR_IYUV: case COLOR_YUV2BGRA_IYUV:
113
case COLOR_YUV2BGR_NV21: case COLOR_YUV2BGRA_NV21: case COLOR_YUV2BGR_NV12: case COLOR_YUV2BGRA_NV12:
114
case COLOR_Lab2BGR: case COLOR_Luv2BGR: case COLOR_Lab2LBGR: case COLOR_Luv2LBGR:
115
case COLOR_BGR2Lab: case COLOR_BGR2Luv: case COLOR_LBGR2Lab: case COLOR_LBGR2Luv:
116
case COLOR_HSV2BGR: case COLOR_HLS2BGR: case COLOR_HSV2BGR_FULL: case COLOR_HLS2BGR_FULL:
117
case COLOR_YUV2BGR_UYVY: case COLOR_YUV2BGRA_UYVY: case COLOR_YUV2BGR_YUY2:
118
case COLOR_YUV2BGRA_YUY2: case COLOR_YUV2BGR_YVYU: case COLOR_YUV2BGRA_YVYU:
119
case COLOR_BGR2YUV_IYUV: case COLOR_BGRA2YUV_IYUV: case COLOR_BGR2YUV_YV12: case COLOR_BGRA2YUV_YV12:
120
return false;
121
default:
122
return true;
123
}
124
}
125
126
inline bool isFullRangeHSV(int code)
127
{
128
switch (code)
129
{
130
case COLOR_BGR2HSV_FULL: case COLOR_RGB2HSV_FULL: case COLOR_BGR2HLS_FULL: case COLOR_RGB2HLS_FULL:
131
case COLOR_HSV2BGR_FULL: case COLOR_HSV2RGB_FULL: case COLOR_HLS2BGR_FULL: case COLOR_HLS2RGB_FULL:
132
return true;
133
default:
134
return false;
135
}
136
}
137
138
inline int dstChannels(int code)
139
{
140
switch( code )
141
{
142
case COLOR_BGR2BGRA: case COLOR_RGB2BGRA: case COLOR_BGRA2RGBA:
143
case COLOR_BGR5652BGRA: case COLOR_BGR5552BGRA: case COLOR_BGR5652RGBA: case COLOR_BGR5552RGBA:
144
case COLOR_GRAY2BGRA:
145
case COLOR_YUV2BGRA_NV21: case COLOR_YUV2RGBA_NV21: case COLOR_YUV2BGRA_NV12: case COLOR_YUV2RGBA_NV12:
146
case COLOR_YUV2BGRA_YV12: case COLOR_YUV2RGBA_YV12: case COLOR_YUV2BGRA_IYUV: case COLOR_YUV2RGBA_IYUV:
147
case COLOR_YUV2RGBA_UYVY: case COLOR_YUV2BGRA_UYVY: case COLOR_YUV2RGBA_YVYU: case COLOR_YUV2BGRA_YVYU:
148
case COLOR_YUV2RGBA_YUY2: case COLOR_YUV2BGRA_YUY2:
149
150
return 4;
151
152
case COLOR_BGRA2BGR: case COLOR_RGBA2BGR: case COLOR_RGB2BGR:
153
case COLOR_BGR5652BGR: case COLOR_BGR5552BGR: case COLOR_BGR5652RGB: case COLOR_BGR5552RGB:
154
case COLOR_GRAY2BGR:
155
case COLOR_YUV2BGR_NV21: case COLOR_YUV2RGB_NV21: case COLOR_YUV2BGR_NV12: case COLOR_YUV2RGB_NV12:
156
case COLOR_YUV2BGR_YV12: case COLOR_YUV2RGB_YV12: case COLOR_YUV2BGR_IYUV: case COLOR_YUV2RGB_IYUV:
157
case COLOR_YUV2RGB_UYVY: case COLOR_YUV2BGR_UYVY: case COLOR_YUV2RGB_YVYU: case COLOR_YUV2BGR_YVYU:
158
case COLOR_YUV2RGB_YUY2: case COLOR_YUV2BGR_YUY2:
159
160
return 3;
161
162
default:
163
return 0;
164
}
165
}
166
167
inline int greenBits(int code)
168
{
169
switch( code )
170
{
171
case COLOR_BGR2BGR565: case COLOR_RGB2BGR565: case COLOR_BGRA2BGR565: case COLOR_RGBA2BGR565:
172
case COLOR_BGR5652BGR: case COLOR_BGR5652RGB: case COLOR_BGR5652BGRA: case COLOR_BGR5652RGBA:
173
case COLOR_BGR5652GRAY: case COLOR_GRAY2BGR565:
174
175
return 6;
176
177
case COLOR_BGR2BGR555: case COLOR_RGB2BGR555: case COLOR_BGRA2BGR555: case COLOR_RGBA2BGR555:
178
case COLOR_BGR5552BGR: case COLOR_BGR5552RGB: case COLOR_BGR5552BGRA: case COLOR_BGR5552RGBA:
179
case COLOR_BGR5552GRAY: case COLOR_GRAY2BGR555:
180
181
return 5;
182
183
default:
184
return 0;
185
}
186
}
187
188
inline int uIndex(int code)
189
{
190
switch( code )
191
{
192
case COLOR_RGB2YUV_YV12: case COLOR_BGR2YUV_YV12: case COLOR_RGBA2YUV_YV12: case COLOR_BGRA2YUV_YV12:
193
194
return 2;
195
196
case COLOR_YUV2RGB_YVYU: case COLOR_YUV2BGR_YVYU: case COLOR_YUV2RGBA_YVYU: case COLOR_YUV2BGRA_YVYU:
197
case COLOR_RGB2YUV_IYUV: case COLOR_BGR2YUV_IYUV: case COLOR_RGBA2YUV_IYUV: case COLOR_BGRA2YUV_IYUV:
198
case COLOR_YUV2BGR_NV21: case COLOR_YUV2RGB_NV21: case COLOR_YUV2BGRA_NV21: case COLOR_YUV2RGBA_NV21:
199
case COLOR_YUV2BGR_YV12: case COLOR_YUV2RGB_YV12: case COLOR_YUV2BGRA_YV12: case COLOR_YUV2RGBA_YV12:
200
201
return 1;
202
203
case COLOR_YUV2BGR_NV12: case COLOR_YUV2RGB_NV12: case COLOR_YUV2BGRA_NV12: case COLOR_YUV2RGBA_NV12:
204
case COLOR_YUV2BGR_IYUV: case COLOR_YUV2RGB_IYUV: case COLOR_YUV2BGRA_IYUV: case COLOR_YUV2RGBA_IYUV:
205
case COLOR_YUV2RGB_UYVY: case COLOR_YUV2BGR_UYVY: case COLOR_YUV2RGBA_UYVY: case COLOR_YUV2BGRA_UYVY:
206
case COLOR_YUV2RGB_YUY2: case COLOR_YUV2BGR_YUY2: case COLOR_YUV2RGBA_YUY2: case COLOR_YUV2BGRA_YUY2:
207
208
return 0;
209
210
default:
211
return -1;
212
}
213
}
214
215
} // namespace::
216
217
template<int i0, int i1 = -1, int i2 = -1>
218
struct Set
219
{
220
static bool contains(int i)
221
{
222
return (i == i0 || i == i1 || i == i2);
223
}
224
};
225
226
template<int i0, int i1>
227
struct Set<i0, i1, -1>
228
{
229
static bool contains(int i)
230
{
231
return (i == i0 || i == i1);
232
}
233
};
234
235
template<int i0>
236
struct Set<i0, -1, -1>
237
{
238
static bool contains(int i)
239
{
240
return (i == i0);
241
}
242
};
243
244
enum SizePolicy
245
{
246
TO_YUV, FROM_YUV, NONE
247
};
248
249
template< typename VScn, typename VDcn, typename VDepth, SizePolicy sizePolicy = NONE >
250
struct CvtHelper
251
{
252
CvtHelper(InputArray _src, OutputArray _dst, int dcn)
253
{
254
CV_Assert(!_src.empty());
255
256
int stype = _src.type();
257
scn = CV_MAT_CN(stype), depth = CV_MAT_DEPTH(stype);
258
259
CV_Check(scn, VScn::contains(scn), "Invalid number of channels in input image");
260
CV_Check(dcn, VDcn::contains(dcn), "Invalid number of channels in output image");
261
CV_CheckDepth(depth, VDepth::contains(depth), "Unsupported depth of input image");
262
263
if (_src.getObj() == _dst.getObj()) // inplace processing (#6653)
264
_src.copyTo(src);
265
else
266
src = _src.getMat();
267
Size sz = src.size();
268
switch (sizePolicy)
269
{
270
case TO_YUV:
271
CV_Assert( sz.width % 2 == 0 && sz.height % 2 == 0);
272
dstSz = Size(sz.width, sz.height / 2 * 3);
273
break;
274
case FROM_YUV:
275
CV_Assert( sz.width % 2 == 0 && sz.height % 3 == 0);
276
dstSz = Size(sz.width, sz.height * 2 / 3);
277
break;
278
case NONE:
279
default:
280
dstSz = sz;
281
break;
282
}
283
_dst.create(dstSz, CV_MAKETYPE(depth, dcn));
284
dst = _dst.getMat();
285
}
286
Mat src, dst;
287
int depth, scn;
288
Size dstSz;
289
};
290
291
#ifdef HAVE_OPENCL
292
293
template< typename VScn, typename VDcn, typename VDepth, SizePolicy sizePolicy = NONE >
294
struct OclHelper
295
{
296
OclHelper( InputArray _src, OutputArray _dst, int dcn) :
297
nArgs(0)
298
{
299
src = _src.getUMat();
300
Size sz = src.size(), dstSz;
301
int scn = src.channels();
302
int depth = src.depth();
303
304
CV_Assert( VScn::contains(scn) && VDcn::contains(dcn) && VDepth::contains(depth) );
305
switch (sizePolicy)
306
{
307
case TO_YUV:
308
CV_Assert( sz.width % 2 == 0 && sz.height % 2 == 0 );
309
dstSz = Size(sz.width, sz.height / 2 * 3);
310
break;
311
case FROM_YUV:
312
CV_Assert( sz.width % 2 == 0 && sz.height % 3 == 0 );
313
dstSz = Size(sz.width, sz.height * 2 / 3);
314
break;
315
case NONE:
316
default:
317
dstSz = sz;
318
break;
319
}
320
321
_dst.create(dstSz, CV_MAKETYPE(depth, dcn));
322
dst = _dst.getUMat();
323
}
324
325
bool createKernel(cv::String name, ocl::ProgramSource& source, cv::String options)
326
{
327
ocl::Device dev = ocl::Device::getDefault();
328
int pxPerWIy = dev.isIntel() && (dev.type() & ocl::Device::TYPE_GPU) ? 4 : 1;
329
int pxPerWIx = 1;
330
331
cv::String baseOptions = format("-D depth=%d -D scn=%d -D PIX_PER_WI_Y=%d ",
332
src.depth(), src.channels(), pxPerWIy);
333
334
switch (sizePolicy)
335
{
336
case TO_YUV:
337
if (dev.isIntel() &&
338
src.cols % 4 == 0 && src.step % 4 == 0 && src.offset % 4 == 0 &&
339
dst.step % 4 == 0 && dst.offset % 4 == 0)
340
{
341
pxPerWIx = 2;
342
}
343
globalSize[0] = (size_t)dst.cols/(2*pxPerWIx);
344
globalSize[1] = ((size_t)dst.rows/3 + pxPerWIy - 1) / pxPerWIy;
345
baseOptions += format("-D PIX_PER_WI_X=%d ", pxPerWIx);
346
break;
347
case FROM_YUV:
348
globalSize[0] = (size_t)dst.cols/2;
349
globalSize[1] = ((size_t)dst.rows/2 + pxPerWIy - 1) / pxPerWIy;
350
break;
351
case NONE:
352
default:
353
globalSize[0] = (size_t)src.cols;
354
globalSize[1] = ((size_t)src.rows + pxPerWIy - 1) / pxPerWIy;
355
break;
356
}
357
358
k.create(name.c_str(), source, baseOptions + options);
359
360
if(k.empty())
361
return false;
362
363
nArgs = k.set(0, ocl::KernelArg::ReadOnlyNoSize(src));
364
nArgs = k.set(nArgs, ocl::KernelArg::WriteOnly(dst));
365
return true;
366
}
367
368
bool run()
369
{
370
return k.run(2, globalSize, NULL, false);
371
}
372
373
template<typename T>
374
void setArg(const T& arg)
375
{
376
nArgs = k.set(nArgs, arg);
377
}
378
379
UMat src, dst;
380
ocl::Kernel k;
381
size_t globalSize[2];
382
int nArgs;
383
};
384
385
#endif
386
387
///////////////////////////// Top-level template function ////////////////////////////////
388
389
template <typename Cvt>
390
class CvtColorLoop_Invoker : public ParallelLoopBody
391
{
392
typedef typename Cvt::channel_type _Tp;
393
public:
394
395
CvtColorLoop_Invoker(const uchar * src_data_, size_t src_step_, uchar * dst_data_, size_t dst_step_, int width_, const Cvt& _cvt) :
396
ParallelLoopBody(), src_data(src_data_), src_step(src_step_), dst_data(dst_data_), dst_step(dst_step_),
397
width(width_), cvt(_cvt)
398
{
399
}
400
401
virtual void operator()(const Range& range) const CV_OVERRIDE
402
{
403
CV_TRACE_FUNCTION();
404
405
const uchar* yS = src_data + static_cast<size_t>(range.start) * src_step;
406
uchar* yD = dst_data + static_cast<size_t>(range.start) * dst_step;
407
408
for( int i = range.start; i < range.end; ++i, yS += src_step, yD += dst_step )
409
cvt(reinterpret_cast<const _Tp*>(yS), reinterpret_cast<_Tp*>(yD), width);
410
}
411
412
private:
413
const uchar * src_data;
414
const size_t src_step;
415
uchar * dst_data;
416
const size_t dst_step;
417
const int width;
418
const Cvt& cvt;
419
420
const CvtColorLoop_Invoker& operator= (const CvtColorLoop_Invoker&);
421
};
422
423
template <typename Cvt>
424
void CvtColorLoop(const uchar * src_data, size_t src_step, uchar * dst_data, size_t dst_step, int width, int height, const Cvt& cvt)
425
{
426
parallel_for_(Range(0, height),
427
CvtColorLoop_Invoker<Cvt>(src_data, src_step, dst_data, dst_step, width, cvt),
428
(width * height) / static_cast<double>(1<<16));
429
}
430
431
#if defined (HAVE_IPP) && (IPP_VERSION_X100 >= 700)
432
# define NEED_IPP 1
433
#else
434
# define NEED_IPP 0
435
#endif
436
437
#if NEED_IPP
438
439
#define MAX_IPP8u 255
440
#define MAX_IPP16u 65535
441
#define MAX_IPP32f 1.0
442
443
typedef IppStatus (CV_STDCALL* ippiReorderFunc)(const void *, int, void *, int, IppiSize, const int *);
444
typedef IppStatus (CV_STDCALL* ippiGeneralFunc)(const void *, int, void *, int, IppiSize);
445
typedef IppStatus (CV_STDCALL* ippiColor2GrayFunc)(const void *, int, void *, int, IppiSize, const Ipp32f *);
446
447
template <typename Cvt>
448
class CvtColorIPPLoop_Invoker :
449
public ParallelLoopBody
450
{
451
public:
452
453
CvtColorIPPLoop_Invoker(const uchar * src_data_, size_t src_step_, uchar * dst_data_, size_t dst_step_, int width_, const Cvt& _cvt, bool *_ok) :
454
ParallelLoopBody(), src_data(src_data_), src_step(src_step_), dst_data(dst_data_), dst_step(dst_step_), width(width_), cvt(_cvt), ok(_ok)
455
{
456
*ok = true;
457
}
458
459
virtual void operator()(const Range& range) const CV_OVERRIDE
460
{
461
const void *yS = src_data + src_step * range.start;
462
void *yD = dst_data + dst_step * range.start;
463
if( !cvt(yS, static_cast<int>(src_step), yD, static_cast<int>(dst_step), width, range.end - range.start) )
464
*ok = false;
465
else
466
{
467
CV_IMPL_ADD(CV_IMPL_IPP|CV_IMPL_MT);
468
}
469
}
470
471
private:
472
const uchar * src_data;
473
const size_t src_step;
474
uchar * dst_data;
475
const size_t dst_step;
476
const int width;
477
const Cvt& cvt;
478
bool *ok;
479
480
const CvtColorIPPLoop_Invoker& operator= (const CvtColorIPPLoop_Invoker&);
481
};
482
483
484
template <typename Cvt>
485
bool CvtColorIPPLoop(const uchar * src_data, size_t src_step, uchar * dst_data, size_t dst_step, int width, int height, const Cvt& cvt)
486
{
487
bool ok;
488
parallel_for_(Range(0, height), CvtColorIPPLoop_Invoker<Cvt>(src_data, src_step, dst_data, dst_step, width, cvt, &ok), (width * height)/(double)(1<<16) );
489
return ok;
490
}
491
492
493
template <typename Cvt>
494
bool CvtColorIPPLoopCopy(const uchar * src_data, size_t src_step, int src_type, uchar * dst_data, size_t dst_step, int width, int height, const Cvt& cvt)
495
{
496
Mat temp;
497
Mat src(Size(width, height), src_type, const_cast<uchar*>(src_data), src_step);
498
Mat source = src;
499
if( src_data == dst_data )
500
{
501
src.copyTo(temp);
502
source = temp;
503
}
504
bool ok;
505
parallel_for_(Range(0, source.rows),
506
CvtColorIPPLoop_Invoker<Cvt>(source.data, source.step, dst_data, dst_step,
507
source.cols, cvt, &ok),
508
source.total()/(double)(1<<16) );
509
return ok;
510
}
511
512
513
struct IPPGeneralFunctor
514
{
515
IPPGeneralFunctor(ippiGeneralFunc _func) : ippiColorConvertGeneral(_func){}
516
bool operator()(const void *src, int srcStep, void *dst, int dstStep, int cols, int rows) const
517
{
518
return ippiColorConvertGeneral ? CV_INSTRUMENT_FUN_IPP(ippiColorConvertGeneral, src, srcStep, dst, dstStep, ippiSize(cols, rows)) >= 0 : false;
519
}
520
private:
521
ippiGeneralFunc ippiColorConvertGeneral;
522
};
523
524
525
struct IPPReorderFunctor
526
{
527
IPPReorderFunctor(ippiReorderFunc _func, int _order0, int _order1, int _order2) : ippiColorConvertReorder(_func)
528
{
529
order[0] = _order0;
530
order[1] = _order1;
531
order[2] = _order2;
532
order[3] = 3;
533
}
534
bool operator()(const void *src, int srcStep, void *dst, int dstStep, int cols, int rows) const
535
{
536
return ippiColorConvertReorder ? CV_INSTRUMENT_FUN_IPP(ippiColorConvertReorder, src, srcStep, dst, dstStep, ippiSize(cols, rows), order) >= 0 : false;
537
}
538
private:
539
ippiReorderFunc ippiColorConvertReorder;
540
int order[4];
541
};
542
543
544
struct IPPReorderGeneralFunctor
545
{
546
IPPReorderGeneralFunctor(ippiReorderFunc _func1, ippiGeneralFunc _func2, int _order0, int _order1, int _order2, int _depth) :
547
ippiColorConvertReorder(_func1), ippiColorConvertGeneral(_func2), depth(_depth)
548
{
549
order[0] = _order0;
550
order[1] = _order1;
551
order[2] = _order2;
552
order[3] = 3;
553
}
554
bool operator()(const void *src, int srcStep, void *dst, int dstStep, int cols, int rows) const
555
{
556
if (ippiColorConvertReorder == 0 || ippiColorConvertGeneral == 0)
557
return false;
558
559
Mat temp;
560
temp.create(rows, cols, CV_MAKETYPE(depth, 3));
561
if(CV_INSTRUMENT_FUN_IPP(ippiColorConvertReorder, src, srcStep, temp.ptr(), (int)temp.step[0], ippiSize(cols, rows), order) < 0)
562
return false;
563
return CV_INSTRUMENT_FUN_IPP(ippiColorConvertGeneral, temp.ptr(), (int)temp.step[0], dst, dstStep, ippiSize(cols, rows)) >= 0;
564
}
565
private:
566
ippiReorderFunc ippiColorConvertReorder;
567
ippiGeneralFunc ippiColorConvertGeneral;
568
int order[4];
569
int depth;
570
};
571
572
573
struct IPPGeneralReorderFunctor
574
{
575
IPPGeneralReorderFunctor(ippiGeneralFunc _func1, ippiReorderFunc _func2, int _order0, int _order1, int _order2, int _depth) :
576
ippiColorConvertGeneral(_func1), ippiColorConvertReorder(_func2), depth(_depth)
577
{
578
order[0] = _order0;
579
order[1] = _order1;
580
order[2] = _order2;
581
order[3] = 3;
582
}
583
bool operator()(const void *src, int srcStep, void *dst, int dstStep, int cols, int rows) const
584
{
585
if (ippiColorConvertGeneral == 0 || ippiColorConvertReorder == 0)
586
return false;
587
588
Mat temp;
589
temp.create(rows, cols, CV_MAKETYPE(depth, 3));
590
if(CV_INSTRUMENT_FUN_IPP(ippiColorConvertGeneral, src, srcStep, temp.ptr(), (int)temp.step[0], ippiSize(cols, rows)) < 0)
591
return false;
592
return CV_INSTRUMENT_FUN_IPP(ippiColorConvertReorder, temp.ptr(), (int)temp.step[0], dst, dstStep, ippiSize(cols, rows), order) >= 0;
593
}
594
private:
595
ippiGeneralFunc ippiColorConvertGeneral;
596
ippiReorderFunc ippiColorConvertReorder;
597
int order[4];
598
int depth;
599
};
600
601
extern ippiReorderFunc ippiSwapChannelsC3C4RTab[8];
602
extern ippiReorderFunc ippiSwapChannelsC4C3RTab[8];
603
extern ippiReorderFunc ippiSwapChannelsC3RTab[8];
604
605
#endif
606
607
#ifdef HAVE_OPENCL
608
609
bool oclCvtColorBGR2Luv( InputArray _src, OutputArray _dst, int bidx, bool srgb );
610
bool oclCvtColorBGR2Lab( InputArray _src, OutputArray _dst, int bidx, bool srgb );
611
bool oclCvtColorLab2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx, bool srgb);
612
bool oclCvtColorLuv2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx, bool srgb);
613
bool oclCvtColorBGR2XYZ( InputArray _src, OutputArray _dst, int bidx );
614
bool oclCvtColorXYZ2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx );
615
616
bool oclCvtColorHSV2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx, bool full );
617
bool oclCvtColorHLS2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx, bool full );
618
bool oclCvtColorBGR2HLS( InputArray _src, OutputArray _dst, int bidx, bool full );
619
bool oclCvtColorBGR2HSV( InputArray _src, OutputArray _dst, int bidx, bool full );
620
621
bool oclCvtColorBGR2BGR( InputArray _src, OutputArray _dst, int dcn, bool reverse );
622
bool oclCvtColorBGR25x5( InputArray _src, OutputArray _dst, int bidx, int gbits );
623
bool oclCvtColor5x52BGR( InputArray _src, OutputArray _dst, int dcn, int bidx, int gbits );
624
bool oclCvtColor5x52Gray( InputArray _src, OutputArray _dst, int gbits );
625
bool oclCvtColorGray25x5( InputArray _src, OutputArray _dst, int gbits );
626
bool oclCvtColorBGR2Gray( InputArray _src, OutputArray _dst, int bidx );
627
bool oclCvtColorGray2BGR( InputArray _src, OutputArray _dst, int dcn );
628
bool oclCvtColorRGBA2mRGBA( InputArray _src, OutputArray _dst );
629
bool oclCvtColormRGBA2RGBA( InputArray _src, OutputArray _dst );
630
631
bool oclCvtColorBGR2YCrCb( InputArray _src, OutputArray _dst, int bidx);
632
bool oclCvtcolorYCrCb2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx);
633
bool oclCvtColorBGR2YUV( InputArray _src, OutputArray _dst, int bidx );
634
bool oclCvtColorYUV2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx );
635
636
bool oclCvtColorOnePlaneYUV2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx, int uidx, int yidx );
637
bool oclCvtColorTwoPlaneYUV2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx, int uidx );
638
bool oclCvtColorThreePlaneYUV2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx, int uidx );
639
bool oclCvtColorBGR2ThreePlaneYUV( InputArray _src, OutputArray _dst, int bidx, int uidx );
640
bool oclCvtColorYUV2Gray_420( InputArray _src, OutputArray _dst );
641
642
#endif
643
644
void cvtColorBGR2Lab( InputArray _src, OutputArray _dst, bool swapb, bool srgb);
645
void cvtColorBGR2Luv( InputArray _src, OutputArray _dst, bool swapb, bool srgb);
646
void cvtColorLab2BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb, bool srgb );
647
void cvtColorLuv2BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb, bool srgb );
648
void cvtColorBGR2XYZ( InputArray _src, OutputArray _dst, bool swapb );
649
void cvtColorXYZ2BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb );
650
651
void cvtColorBGR2YUV( InputArray _src, OutputArray _dst, bool swapb, bool crcb);
652
void cvtColorYUV2BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb, bool crcb);
653
654
void cvtColorOnePlaneYUV2BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb, int uidx, int ycn);
655
void cvtColorTwoPlaneYUV2BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb, int uidx );
656
void cvtColorTwoPlaneYUV2BGRpair( InputArray _ysrc, InputArray _uvsrc, OutputArray _dst, int dcn, bool swapb, int uidx );
657
void cvtColorThreePlaneYUV2BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb, int uidx );
658
void cvtColorBGR2ThreePlaneYUV( InputArray _src, OutputArray _dst, bool swapb, int uidx);
659
void cvtColorYUV2Gray_420( InputArray _src, OutputArray _dst );
660
void cvtColorYUV2Gray_ch( InputArray _src, OutputArray _dst, int coi );
661
662
void cvtColorBGR2HLS( InputArray _src, OutputArray _dst, bool swapb, bool fullRange );
663
void cvtColorBGR2HSV( InputArray _src, OutputArray _dst, bool swapb, bool fullRange );
664
void cvtColorHLS2BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb, bool fullRange);
665
void cvtColorHSV2BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb, bool fullRange);
666
667
void cvtColorBGR2BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb);
668
void cvtColorBGR25x5( InputArray _src, OutputArray _dst, bool swapb, int gbits);
669
void cvtColor5x52BGR( InputArray _src, OutputArray _dst, int dcn, bool swapb, int gbits);
670
void cvtColorBGR2Gray( InputArray _src, OutputArray _dst, bool swapb);
671
void cvtColorGray2BGR( InputArray _src, OutputArray _dst, int dcn);
672
void cvtColor5x52Gray( InputArray _src, OutputArray _dst, int gbits);
673
void cvtColorGray25x5( InputArray _src, OutputArray _dst, int gbits);
674
void cvtColorRGBA2mRGBA(InputArray _src, OutputArray _dst);
675
void cvtColormRGBA2RGBA(InputArray _src, OutputArray _dst);
676
677
} //namespace cv
678
679