1
#include "perf_precomp.hpp"
6
using std::tr1::make_tuple;
9
//extra color conversions supported implicitly
12
CX_BGRA2HLS = COLOR_COLORCVT_MAX + COLOR_BGR2HLS,
13
CX_BGRA2HLS_FULL = COLOR_COLORCVT_MAX + COLOR_BGR2HLS_FULL,
14
CX_BGRA2HSV = COLOR_COLORCVT_MAX + COLOR_BGR2HSV,
15
CX_BGRA2HSV_FULL = COLOR_COLORCVT_MAX + COLOR_BGR2HSV_FULL,
16
CX_BGRA2Lab = COLOR_COLORCVT_MAX + COLOR_BGR2Lab,
17
CX_BGRA2Luv = COLOR_COLORCVT_MAX + COLOR_BGR2Luv,
18
CX_BGRA2XYZ = COLOR_COLORCVT_MAX + COLOR_BGR2XYZ,
19
CX_BGRA2YCrCb = COLOR_COLORCVT_MAX + COLOR_BGR2YCrCb,
20
CX_BGRA2YUV = COLOR_COLORCVT_MAX + COLOR_BGR2YUV,
21
CX_HLS2BGRA = COLOR_COLORCVT_MAX + COLOR_HLS2BGR,
22
CX_HLS2BGRA_FULL = COLOR_COLORCVT_MAX + COLOR_HLS2BGR_FULL,
23
CX_HLS2RGBA = COLOR_COLORCVT_MAX + COLOR_HLS2RGB,
24
CX_HLS2RGBA_FULL = COLOR_COLORCVT_MAX + COLOR_HLS2RGB_FULL,
25
CX_HSV2BGRA = COLOR_COLORCVT_MAX + COLOR_HSV2BGR,
26
CX_HSV2BGRA_FULL = COLOR_COLORCVT_MAX + COLOR_HSV2BGR_FULL,
27
CX_HSV2RGBA = COLOR_COLORCVT_MAX + COLOR_HSV2RGB,
28
CX_HSV2RGBA_FULL = COLOR_COLORCVT_MAX + COLOR_HSV2RGB_FULL,
29
CX_Lab2BGRA = COLOR_COLORCVT_MAX + COLOR_Lab2BGR,
30
CX_Lab2LBGRA = COLOR_COLORCVT_MAX + COLOR_Lab2LBGR,
31
CX_Lab2LRGBA = COLOR_COLORCVT_MAX + COLOR_Lab2LRGB,
32
CX_Lab2RGBA = COLOR_COLORCVT_MAX + COLOR_Lab2RGB,
33
CX_LBGRA2Lab = COLOR_COLORCVT_MAX + COLOR_LBGR2Lab,
34
CX_LBGRA2Luv = COLOR_COLORCVT_MAX + COLOR_LBGR2Luv,
35
CX_LRGBA2Lab = COLOR_COLORCVT_MAX + COLOR_LRGB2Lab,
36
CX_LRGBA2Luv = COLOR_COLORCVT_MAX + COLOR_LRGB2Luv,
37
CX_Luv2BGRA = COLOR_COLORCVT_MAX + COLOR_Luv2BGR,
38
CX_Luv2LBGRA = COLOR_COLORCVT_MAX + COLOR_Luv2LBGR,
39
CX_Luv2LRGBA = COLOR_COLORCVT_MAX + COLOR_Luv2LRGB,
40
CX_Luv2RGBA = COLOR_COLORCVT_MAX + COLOR_Luv2RGB,
41
CX_RGBA2HLS = COLOR_COLORCVT_MAX + COLOR_RGB2HLS,
42
CX_RGBA2HLS_FULL = COLOR_COLORCVT_MAX + COLOR_RGB2HLS_FULL,
43
CX_RGBA2HSV = COLOR_COLORCVT_MAX + COLOR_RGB2HSV,
44
CX_RGBA2HSV_FULL = COLOR_COLORCVT_MAX + COLOR_RGB2HSV_FULL,
45
CX_RGBA2Lab = COLOR_COLORCVT_MAX + COLOR_RGB2Lab,
46
CX_RGBA2Luv = COLOR_COLORCVT_MAX + COLOR_RGB2Luv,
47
CX_RGBA2XYZ = COLOR_COLORCVT_MAX + COLOR_RGB2XYZ,
48
CX_RGBA2YCrCb = COLOR_COLORCVT_MAX + COLOR_RGB2YCrCb,
49
CX_RGBA2YUV = COLOR_COLORCVT_MAX + COLOR_RGB2YUV,
50
CX_XYZ2BGRA = COLOR_COLORCVT_MAX + COLOR_XYZ2BGR,
51
CX_XYZ2RGBA = COLOR_COLORCVT_MAX + COLOR_XYZ2RGB,
52
CX_YCrCb2BGRA = COLOR_COLORCVT_MAX + COLOR_YCrCb2BGR,
53
CX_YCrCb2RGBA = COLOR_COLORCVT_MAX + COLOR_YCrCb2RGB,
54
CX_YUV2BGRA = COLOR_COLORCVT_MAX + COLOR_YUV2BGR,
55
CX_YUV2RGBA = COLOR_COLORCVT_MAX + COLOR_YUV2RGB
59
COLOR_BGR2BGR555, COLOR_BGR2BGR565, COLOR_BGR2BGRA, COLOR_BGR2GRAY,
60
COLOR_BGR2HLS, COLOR_BGR2HLS_FULL, COLOR_BGR2HSV, COLOR_BGR2HSV_FULL,
61
COLOR_BGR2Lab, COLOR_BGR2Luv, COLOR_BGR2RGB, COLOR_BGR2RGBA, COLOR_BGR2XYZ,
62
COLOR_BGR2YCrCb, COLOR_BGR2YUV, COLOR_BGR5552BGR, COLOR_BGR5552BGRA,
64
COLOR_BGR5552GRAY, COLOR_BGR5552RGB, COLOR_BGR5552RGBA, COLOR_BGR5652BGR,
65
COLOR_BGR5652BGRA, COLOR_BGR5652GRAY, COLOR_BGR5652RGB, COLOR_BGR5652RGBA,
67
COLOR_BGRA2BGR, COLOR_BGRA2BGR555, COLOR_BGRA2BGR565, COLOR_BGRA2GRAY, COLOR_BGRA2RGBA,
68
CX_BGRA2HLS, CX_BGRA2HLS_FULL, CX_BGRA2HSV, CX_BGRA2HSV_FULL,
69
CX_BGRA2Lab, CX_BGRA2Luv, CX_BGRA2XYZ,
70
CX_BGRA2YCrCb, CX_BGRA2YUV,
72
COLOR_GRAY2BGR, COLOR_GRAY2BGR555, COLOR_GRAY2BGR565, COLOR_GRAY2BGRA,
74
COLOR_HLS2BGR, COLOR_HLS2BGR_FULL, COLOR_HLS2RGB, COLOR_HLS2RGB_FULL,
75
CX_HLS2BGRA, CX_HLS2BGRA_FULL, CX_HLS2RGBA, CX_HLS2RGBA_FULL,
77
COLOR_HSV2BGR, COLOR_HSV2BGR_FULL, COLOR_HSV2RGB, COLOR_HSV2RGB_FULL,
78
CX_HSV2BGRA, CX_HSV2BGRA_FULL, CX_HSV2RGBA, CX_HSV2RGBA_FULL,
80
COLOR_Lab2BGR, COLOR_Lab2LBGR, COLOR_Lab2LRGB, COLOR_Lab2RGB,
81
CX_Lab2BGRA, CX_Lab2LBGRA, CX_Lab2LRGBA, CX_Lab2RGBA,
83
COLOR_LBGR2Lab, COLOR_LBGR2Luv, COLOR_LRGB2Lab, COLOR_LRGB2Luv,
84
CX_LBGRA2Lab, CX_LBGRA2Luv, CX_LRGBA2Lab, CX_LRGBA2Luv,
86
COLOR_Luv2BGR, COLOR_Luv2LBGR, COLOR_Luv2LRGB, COLOR_Luv2RGB,
87
CX_Luv2BGRA, CX_Luv2LBGRA, CX_Luv2LRGBA, CX_Luv2RGBA,
89
COLOR_RGB2BGR555, COLOR_RGB2BGR565, COLOR_RGB2GRAY,
90
COLOR_RGB2HLS, COLOR_RGB2HLS_FULL, COLOR_RGB2HSV, COLOR_RGB2HSV_FULL,
91
COLOR_RGB2Lab, COLOR_RGB2Luv, COLOR_RGB2XYZ, COLOR_RGB2YCrCb, COLOR_RGB2YUV,
93
COLOR_RGBA2BGR, COLOR_RGBA2BGR555, COLOR_RGBA2BGR565, COLOR_RGBA2GRAY,
94
CX_RGBA2HLS, CX_RGBA2HLS_FULL, CX_RGBA2HSV, CX_RGBA2HSV_FULL,
95
CX_RGBA2Lab, CX_RGBA2Luv, CX_RGBA2XYZ,
96
CX_RGBA2YCrCb, CX_RGBA2YUV,
98
COLOR_XYZ2BGR, COLOR_XYZ2RGB, CX_XYZ2BGRA, CX_XYZ2RGBA,
100
COLOR_YCrCb2BGR, COLOR_YCrCb2RGB, CX_YCrCb2BGRA, CX_YCrCb2RGBA,
101
COLOR_YUV2BGR, COLOR_YUV2RGB, CX_YUV2BGRA, CX_YUV2RGBA
105
CV_ENUM(CvtModeBayer,
106
COLOR_BayerBG2BGR, COLOR_BayerBG2BGR_VNG, COLOR_BayerBG2GRAY,
107
COLOR_BayerGB2BGR, COLOR_BayerGB2BGR_VNG, COLOR_BayerGB2GRAY,
108
COLOR_BayerGR2BGR, COLOR_BayerGR2BGR_VNG, COLOR_BayerGR2GRAY,
109
COLOR_BayerRG2BGR, COLOR_BayerRG2BGR_VNG, COLOR_BayerRG2GRAY
113
CV_ENUM(CvtMode2, COLOR_YUV2BGR_NV12, COLOR_YUV2BGRA_NV12, COLOR_YUV2RGB_NV12, COLOR_YUV2RGBA_NV12, COLOR_YUV2BGR_NV21, COLOR_YUV2BGRA_NV21, COLOR_YUV2RGB_NV21, COLOR_YUV2RGBA_NV21,
114
COLOR_YUV2BGR_YV12, COLOR_YUV2BGRA_YV12, COLOR_YUV2RGB_YV12, COLOR_YUV2RGBA_YV12, COLOR_YUV2BGR_IYUV, COLOR_YUV2BGRA_IYUV, COLOR_YUV2RGB_IYUV, COLOR_YUV2RGBA_IYUV,
115
COLOR_YUV2GRAY_420, COLOR_YUV2RGB_UYVY, COLOR_YUV2BGR_UYVY, COLOR_YUV2RGBA_UYVY, COLOR_YUV2BGRA_UYVY, COLOR_YUV2RGB_YUY2, COLOR_YUV2BGR_YUY2, COLOR_YUV2RGB_YVYU,
116
COLOR_YUV2BGR_YVYU, COLOR_YUV2RGBA_YUY2, COLOR_YUV2BGRA_YUY2, COLOR_YUV2RGBA_YVYU, COLOR_YUV2BGRA_YVYU)
118
CV_ENUM(CvtMode3, COLOR_RGB2YUV_IYUV, COLOR_BGR2YUV_IYUV, COLOR_RGBA2YUV_IYUV, COLOR_BGRA2YUV_IYUV,
119
COLOR_RGB2YUV_YV12, COLOR_BGR2YUV_YV12, COLOR_RGBA2YUV_YV12, COLOR_BGRA2YUV_YV12)
123
ChPair(int _scn, int _dcn): scn(_scn), dcn(_dcn) {}
127
ChPair getConversionInfo(int cvtMode)
131
case COLOR_BayerBG2GRAY: case COLOR_BayerGB2GRAY:
132
case COLOR_BayerGR2GRAY: case COLOR_BayerRG2GRAY:
133
case COLOR_YUV2GRAY_420:
135
case COLOR_GRAY2BGR555: case COLOR_GRAY2BGR565:
137
case COLOR_BayerBG2BGR: case COLOR_BayerBG2BGR_VNG:
138
case COLOR_BayerGB2BGR: case COLOR_BayerGB2BGR_VNG:
139
case COLOR_BayerGR2BGR: case COLOR_BayerGR2BGR_VNG:
140
case COLOR_BayerRG2BGR: case COLOR_BayerRG2BGR_VNG:
142
case COLOR_YUV2BGR_NV12: case COLOR_YUV2RGB_NV12:
143
case COLOR_YUV2BGR_NV21: case COLOR_YUV2RGB_NV21:
144
case COLOR_YUV2BGR_YV12: case COLOR_YUV2RGB_YV12:
145
case COLOR_YUV2BGR_IYUV: case COLOR_YUV2RGB_IYUV:
147
case COLOR_GRAY2BGRA:
148
case COLOR_YUV2BGRA_NV12: case COLOR_YUV2RGBA_NV12:
149
case COLOR_YUV2BGRA_NV21: case COLOR_YUV2RGBA_NV21:
150
case COLOR_YUV2BGRA_YV12: case COLOR_YUV2RGBA_YV12:
151
case COLOR_YUV2BGRA_IYUV: case COLOR_YUV2RGBA_IYUV:
153
case COLOR_BGR5552GRAY: case COLOR_BGR5652GRAY:
155
case COLOR_BGR5552BGR: case COLOR_BGR5552RGB:
156
case COLOR_BGR5652BGR: case COLOR_BGR5652RGB:
157
case COLOR_YUV2RGB_UYVY: case COLOR_YUV2BGR_UYVY:
158
case COLOR_YUV2RGB_YUY2: case COLOR_YUV2BGR_YUY2:
159
case COLOR_YUV2RGB_YVYU: case COLOR_YUV2BGR_YVYU:
161
case COLOR_BGR5552BGRA: case COLOR_BGR5552RGBA:
162
case COLOR_BGR5652BGRA: case COLOR_BGR5652RGBA:
163
case COLOR_YUV2RGBA_UYVY: case COLOR_YUV2BGRA_UYVY:
164
case COLOR_YUV2RGBA_YUY2: case COLOR_YUV2BGRA_YUY2:
165
case COLOR_YUV2RGBA_YVYU: case COLOR_YUV2BGRA_YVYU:
167
case COLOR_BGR2GRAY: case COLOR_RGB2GRAY:
168
case COLOR_RGB2YUV_IYUV: case COLOR_RGB2YUV_YV12:
169
case COLOR_BGR2YUV_IYUV: case COLOR_BGR2YUV_YV12:
171
case COLOR_BGR2BGR555: case COLOR_BGR2BGR565:
172
case COLOR_RGB2BGR555: case COLOR_RGB2BGR565:
174
case COLOR_BGR2HLS: case COLOR_BGR2HLS_FULL:
175
case COLOR_BGR2HSV: case COLOR_BGR2HSV_FULL:
176
case COLOR_BGR2Lab: case COLOR_BGR2Luv:
177
case COLOR_BGR2RGB: case COLOR_BGR2XYZ:
178
case COLOR_BGR2YCrCb: case COLOR_BGR2YUV:
179
case COLOR_HLS2BGR: case COLOR_HLS2BGR_FULL:
180
case COLOR_HLS2RGB: case COLOR_HLS2RGB_FULL:
181
case COLOR_HSV2BGR: case COLOR_HSV2BGR_FULL:
182
case COLOR_HSV2RGB: case COLOR_HSV2RGB_FULL:
183
case COLOR_Lab2BGR: case COLOR_Lab2LBGR:
184
case COLOR_Lab2LRGB: case COLOR_Lab2RGB:
185
case COLOR_LBGR2Lab: case COLOR_LBGR2Luv:
186
case COLOR_LRGB2Lab: case COLOR_LRGB2Luv:
187
case COLOR_Luv2BGR: case COLOR_Luv2LBGR:
188
case COLOR_Luv2LRGB: case COLOR_Luv2RGB:
189
case COLOR_RGB2HLS: case COLOR_RGB2HLS_FULL:
190
case COLOR_RGB2HSV: case COLOR_RGB2HSV_FULL:
191
case COLOR_RGB2Lab: case COLOR_RGB2Luv:
192
case COLOR_RGB2XYZ: case COLOR_RGB2YCrCb:
193
case COLOR_RGB2YUV: case COLOR_XYZ2BGR:
194
case COLOR_XYZ2RGB: case COLOR_YCrCb2BGR:
195
case COLOR_YCrCb2RGB: case COLOR_YUV2BGR:
198
case COLOR_BGR2BGRA: case COLOR_BGR2RGBA:
199
case CX_HLS2BGRA: case CX_HLS2BGRA_FULL:
200
case CX_HLS2RGBA: case CX_HLS2RGBA_FULL:
201
case CX_HSV2BGRA: case CX_HSV2BGRA_FULL:
202
case CX_HSV2RGBA: case CX_HSV2RGBA_FULL:
203
case CX_Lab2BGRA: case CX_Lab2LBGRA:
204
case CX_Lab2LRGBA: case CX_Lab2RGBA:
205
case CX_Luv2BGRA: case CX_Luv2LBGRA:
206
case CX_Luv2LRGBA: case CX_Luv2RGBA:
207
case CX_XYZ2BGRA: case CX_XYZ2RGBA:
208
case CX_YCrCb2BGRA: case CX_YCrCb2RGBA:
209
case CX_YUV2BGRA: case CX_YUV2RGBA:
211
case COLOR_BGRA2GRAY: case COLOR_RGBA2GRAY:
212
case COLOR_RGBA2YUV_IYUV: case COLOR_RGBA2YUV_YV12:
213
case COLOR_BGRA2YUV_IYUV: case COLOR_BGRA2YUV_YV12:
215
case COLOR_BGRA2BGR555: case COLOR_BGRA2BGR565:
216
case COLOR_RGBA2BGR555: case COLOR_RGBA2BGR565:
218
case COLOR_BGRA2BGR: case CX_BGRA2HLS:
219
case CX_BGRA2HLS_FULL: case CX_BGRA2HSV:
220
case CX_BGRA2HSV_FULL: case CX_BGRA2Lab:
221
case CX_BGRA2Luv: case CX_BGRA2XYZ:
222
case CX_BGRA2YCrCb: case CX_BGRA2YUV:
223
case CX_LBGRA2Lab: case CX_LBGRA2Luv:
224
case CX_LRGBA2Lab: case CX_LRGBA2Luv:
225
case COLOR_RGBA2BGR: case CX_RGBA2HLS:
226
case CX_RGBA2HLS_FULL: case CX_RGBA2HSV:
227
case CX_RGBA2HSV_FULL: case CX_RGBA2Lab:
228
case CX_RGBA2Luv: case CX_RGBA2XYZ:
229
case CX_RGBA2YCrCb: case CX_RGBA2YUV:
231
case COLOR_BGRA2RGBA:
234
ADD_FAILURE() << "Unknown conversion type";
240
typedef std::tr1::tuple<Size, CvtMode> Size_CvtMode_t;
241
typedef perf::TestBaseWithParam<Size_CvtMode_t> Size_CvtMode;
243
PERF_TEST_P(Size_CvtMode, cvtColor8u,
245
testing::Values(::perf::szODD, ::perf::szVGA, ::perf::sz1080p),
250
Size sz = get<0>(GetParam());
251
int _mode = get<1>(GetParam()), mode = _mode;
252
ChPair ch = getConversionInfo(mode);
253
mode %= COLOR_COLORCVT_MAX;
255
Mat src(sz, CV_8UC(ch.scn));
256
Mat dst(sz, CV_8UC(ch.dcn));
259
declare.in(src, WARMUP_RNG).out(dst);
261
int runs = sz.width <= 320 ? 100 : 5;
262
TEST_CYCLE_MULTIRUN(runs) cvtColor(src, dst, mode, ch.dcn);
264
#if defined(__APPLE__) && defined(HAVE_IPP)
265
SANITY_CHECK(dst, _mode == CX_BGRA2HLS_FULL ? 2 : 1);
266
#elif defined(_MSC_VER) && _MSC_VER >= 1900 /* MSVC 14 */
267
if (_mode == CX_Luv2BGRA)
268
SANITY_CHECK_NOTHING();
270
SANITY_CHECK(dst, 1);
272
SANITY_CHECK(dst, 1);
276
typedef std::tr1::tuple<Size, CvtModeBayer> Size_CvtMode_Bayer_t;
277
typedef perf::TestBaseWithParam<Size_CvtMode_Bayer_t> Size_CvtMode_Bayer;
279
PERF_TEST_P(Size_CvtMode_Bayer, cvtColorBayer8u,
281
testing::Values(::perf::szODD, ::perf::szVGA),
286
Size sz = get<0>(GetParam());
287
int mode = get<1>(GetParam());
288
ChPair ch = getConversionInfo(mode);
289
mode %= COLOR_COLORCVT_MAX;
291
Mat src(sz, CV_8UC(ch.scn));
292
Mat dst(sz, CV_8UC(ch.dcn));
295
declare.in(src, WARMUP_RNG).out(dst);
297
TEST_CYCLE() cvtColor(src, dst, mode, ch.dcn);
299
SANITY_CHECK(dst, 1);
302
typedef std::tr1::tuple<Size, CvtMode2> Size_CvtMode2_t;
303
typedef perf::TestBaseWithParam<Size_CvtMode2_t> Size_CvtMode2;
305
PERF_TEST_P(Size_CvtMode2, cvtColorYUV420,
307
testing::Values(szVGA, sz1080p, Size(130, 60)),
312
Size sz = get<0>(GetParam());
313
int mode = get<1>(GetParam());
314
ChPair ch = getConversionInfo(mode);
316
Mat src(sz.height + sz.height / 2, sz.width, CV_8UC(ch.scn));
317
Mat dst(sz, CV_8UC(ch.dcn));
319
declare.in(src, WARMUP_RNG).out(dst);
321
int runs = (sz.width <= 640) ? 8 : 1;
322
TEST_CYCLE_MULTIRUN(runs) cvtColor(src, dst, mode, ch.dcn);
324
SANITY_CHECK(dst, 1);
327
typedef std::tr1::tuple<Size, CvtMode3> Size_CvtMode3_t;
328
typedef perf::TestBaseWithParam<Size_CvtMode3_t> Size_CvtMode3;
330
PERF_TEST_P(Size_CvtMode3, cvtColorRGB2YUV420p,
332
testing::Values(szVGA, sz720p, sz1080p, Size(130, 60)),
337
Size sz = get<0>(GetParam());
338
int mode = get<1>(GetParam());
339
ChPair ch = getConversionInfo(mode);
341
Mat src(sz, CV_8UC(ch.scn));
342
Mat dst(sz.height + sz.height / 2, sz.width, CV_8UC(ch.dcn));
345
declare.in(src, WARMUP_RNG).out(dst);
347
int runs = (sz.width <= 640) ? 10 : 1;
348
TEST_CYCLE_MULTIRUN(runs) cvtColor(src, dst, mode, ch.dcn);
350
SANITY_CHECK(dst, 1);
353
CV_ENUM(EdgeAwareBayerMode, COLOR_BayerBG2BGR_EA, COLOR_BayerGB2BGR_EA, COLOR_BayerRG2BGR_EA, COLOR_BayerGR2BGR_EA)
355
typedef std::tr1::tuple<Size, EdgeAwareBayerMode> EdgeAwareParams;
356
typedef perf::TestBaseWithParam<EdgeAwareParams> EdgeAwareDemosaicingTest;
358
PERF_TEST_P(EdgeAwareDemosaicingTest, demosaicingEA,
360
testing::Values(szVGA, sz720p, sz1080p, Size(130, 60)),
361
EdgeAwareBayerMode::all()
365
Size sz = get<0>(GetParam());
366
int mode = get<1>(GetParam());
368
Mat src(sz, CV_8UC1);
369
Mat dst(sz, CV_8UC3);
371
declare.in(src, WARMUP_RNG).out(dst);
373
TEST_CYCLE() cvtColor(src, dst, mode, 3);
375
SANITY_CHECK(dst, 1);