CLAHE Python bindings
[profile/ivi/opencv.git] / modules / imgproc / perf / perf_cvt_color.cpp
1 #include "perf_precomp.hpp"
2
3 using namespace std;
4 using namespace cv;
5 using namespace perf;
6 using std::tr1::make_tuple;
7 using std::tr1::get;
8
9 //extra color conversions supported implicitly
10 enum
11 {
12     CX_BGRA2HLS      = CV_COLORCVT_MAX + CV_BGR2HLS,
13     CX_BGRA2HLS_FULL = CV_COLORCVT_MAX + CV_BGR2HLS_FULL,
14     CX_BGRA2HSV      = CV_COLORCVT_MAX + CV_BGR2HSV,
15     CX_BGRA2HSV_FULL = CV_COLORCVT_MAX + CV_BGR2HSV_FULL,
16     CX_BGRA2Lab      = CV_COLORCVT_MAX + CV_BGR2Lab,
17     CX_BGRA2Luv      = CV_COLORCVT_MAX + CV_BGR2Luv,
18     CX_BGRA2XYZ      = CV_COLORCVT_MAX + CV_BGR2XYZ,
19     CX_BGRA2YCrCb    = CV_COLORCVT_MAX + CV_BGR2YCrCb,
20     CX_BGRA2YUV      = CV_COLORCVT_MAX + CV_BGR2YUV,
21     CX_HLS2BGRA      = CV_COLORCVT_MAX + CV_HLS2BGR,
22     CX_HLS2BGRA_FULL = CV_COLORCVT_MAX + CV_HLS2BGR_FULL,
23     CX_HLS2RGBA      = CV_COLORCVT_MAX + CV_HLS2RGB,
24     CX_HLS2RGBA_FULL = CV_COLORCVT_MAX + CV_HLS2RGB_FULL,
25     CX_HSV2BGRA      = CV_COLORCVT_MAX + CV_HSV2BGR,
26     CX_HSV2BGRA_FULL = CV_COLORCVT_MAX + CV_HSV2BGR_FULL,
27     CX_HSV2RGBA      = CV_COLORCVT_MAX + CV_HSV2RGB,
28     CX_HSV2RGBA_FULL = CV_COLORCVT_MAX + CV_HSV2RGB_FULL,
29     CX_Lab2BGRA      = CV_COLORCVT_MAX + CV_Lab2BGR,
30     CX_Lab2LBGRA     = CV_COLORCVT_MAX + CV_Lab2LBGR,
31     CX_Lab2LRGBA     = CV_COLORCVT_MAX + CV_Lab2LRGB,
32     CX_Lab2RGBA      = CV_COLORCVT_MAX + CV_Lab2RGB,
33     CX_LBGRA2Lab     = CV_COLORCVT_MAX + CV_LBGR2Lab,
34     CX_LBGRA2Luv     = CV_COLORCVT_MAX + CV_LBGR2Luv,
35     CX_LRGBA2Lab     = CV_COLORCVT_MAX + CV_LRGB2Lab,
36     CX_LRGBA2Luv     = CV_COLORCVT_MAX + CV_LRGB2Luv,
37     CX_Luv2BGRA      = CV_COLORCVT_MAX + CV_Luv2BGR,
38     CX_Luv2LBGRA     = CV_COLORCVT_MAX + CV_Luv2LBGR,
39     CX_Luv2LRGBA     = CV_COLORCVT_MAX + CV_Luv2LRGB,
40     CX_Luv2RGBA      = CV_COLORCVT_MAX + CV_Luv2RGB,
41     CX_RGBA2HLS      = CV_COLORCVT_MAX + CV_RGB2HLS,
42     CX_RGBA2HLS_FULL = CV_COLORCVT_MAX + CV_RGB2HLS_FULL,
43     CX_RGBA2HSV      = CV_COLORCVT_MAX + CV_RGB2HSV,
44     CX_RGBA2HSV_FULL = CV_COLORCVT_MAX + CV_RGB2HSV_FULL,
45     CX_RGBA2Lab      = CV_COLORCVT_MAX + CV_RGB2Lab,
46     CX_RGBA2Luv      = CV_COLORCVT_MAX + CV_RGB2Luv,
47     CX_RGBA2XYZ      = CV_COLORCVT_MAX + CV_RGB2XYZ,
48     CX_RGBA2YCrCb    = CV_COLORCVT_MAX + CV_RGB2YCrCb,
49     CX_RGBA2YUV      = CV_COLORCVT_MAX + CV_RGB2YUV,
50     CX_XYZ2BGRA      = CV_COLORCVT_MAX + CV_XYZ2BGR,
51     CX_XYZ2RGBA      = CV_COLORCVT_MAX + CV_XYZ2RGB,
52     CX_YCrCb2BGRA    = CV_COLORCVT_MAX + CV_YCrCb2BGR,
53     CX_YCrCb2RGBA    = CV_COLORCVT_MAX + CV_YCrCb2RGB,
54     CX_YUV2BGRA      = CV_COLORCVT_MAX + CV_YUV2BGR,
55     CX_YUV2RGBA      = CV_COLORCVT_MAX + CV_YUV2RGB
56 };
57
58 CV_ENUM(CvtMode,
59     CV_BGR2BGR555, CV_BGR2BGR565, CV_BGR2BGRA, CV_BGR2GRAY,
60     CV_BGR2HLS, CV_BGR2HLS_FULL, CV_BGR2HSV, CV_BGR2HSV_FULL,
61     CV_BGR2Lab, CV_BGR2Luv, CV_BGR2RGB, CV_BGR2RGBA, CV_BGR2XYZ,
62     CV_BGR2YCrCb, CV_BGR2YUV, CV_BGR5552BGR, CV_BGR5552BGRA,
63
64     CV_BGR5552GRAY, CV_BGR5552RGB, CV_BGR5552RGBA, CV_BGR5652BGR,
65     CV_BGR5652BGRA, CV_BGR5652GRAY, CV_BGR5652RGB, CV_BGR5652RGBA,
66
67     CV_BGRA2BGR, CV_BGRA2BGR555, CV_BGRA2BGR565, CV_BGRA2GRAY, CV_BGRA2RGBA,
68     CX_BGRA2HLS, CX_BGRA2HLS_FULL, CX_BGRA2HSV, CX_BGRA2HSV_FULL,
69     CX_BGRA2Lab, CX_BGRA2Luv, CX_BGRA2XYZ,
70     CX_BGRA2YCrCb, CX_BGRA2YUV,
71
72     CV_GRAY2BGR, CV_GRAY2BGR555, CV_GRAY2BGR565, CV_GRAY2BGRA,
73
74     CV_HLS2BGR, CV_HLS2BGR_FULL, CV_HLS2RGB, CV_HLS2RGB_FULL,
75     CX_HLS2BGRA, CX_HLS2BGRA_FULL, CX_HLS2RGBA, CX_HLS2RGBA_FULL,
76
77     CV_HSV2BGR, CV_HSV2BGR_FULL, CV_HSV2RGB, CV_HSV2RGB_FULL,
78     CX_HSV2BGRA, CX_HSV2BGRA_FULL, CX_HSV2RGBA,    CX_HSV2RGBA_FULL,
79
80     CV_Lab2BGR, CV_Lab2LBGR, CV_Lab2LRGB, CV_Lab2RGB,
81     CX_Lab2BGRA, CX_Lab2LBGRA, CX_Lab2LRGBA, CX_Lab2RGBA,
82
83     CV_LBGR2Lab, CV_LBGR2Luv, CV_LRGB2Lab, CV_LRGB2Luv,
84     CX_LBGRA2Lab, CX_LBGRA2Luv, CX_LRGBA2Lab, CX_LRGBA2Luv,
85
86     CV_Luv2BGR, CV_Luv2LBGR, CV_Luv2LRGB, CV_Luv2RGB,
87     CX_Luv2BGRA, CX_Luv2LBGRA, CX_Luv2LRGBA, CX_Luv2RGBA,
88
89     CV_RGB2BGR555, CV_RGB2BGR565, CV_RGB2GRAY,
90     CV_RGB2HLS, CV_RGB2HLS_FULL, CV_RGB2HSV, CV_RGB2HSV_FULL,
91     CV_RGB2Lab, CV_RGB2Luv, CV_RGB2XYZ, CV_RGB2YCrCb, CV_RGB2YUV,
92
93     CV_RGBA2BGR, CV_RGBA2BGR555, CV_RGBA2BGR565, CV_RGBA2GRAY,
94     CX_RGBA2HLS, CX_RGBA2HLS_FULL, CX_RGBA2HSV, CX_RGBA2HSV_FULL,
95     CX_RGBA2Lab, CX_RGBA2Luv, CX_RGBA2XYZ,
96     CX_RGBA2YCrCb, CX_RGBA2YUV,
97
98     CV_XYZ2BGR, CV_XYZ2RGB, CX_XYZ2BGRA, CX_XYZ2RGBA,
99
100     CV_YCrCb2BGR, CV_YCrCb2RGB, CX_YCrCb2BGRA, CX_YCrCb2RGBA,
101     CV_YUV2BGR, CV_YUV2RGB, CX_YUV2BGRA, CX_YUV2RGBA
102     )
103
104
105 CV_ENUM(CvtModeBayer,
106     CV_BayerBG2BGR, CV_BayerBG2BGR_VNG, CV_BayerBG2GRAY,
107     CV_BayerGB2BGR, CV_BayerGB2BGR_VNG, CV_BayerGB2GRAY,
108     CV_BayerGR2BGR, CV_BayerGR2BGR_VNG, CV_BayerGR2GRAY,
109     CV_BayerRG2BGR, CV_BayerRG2BGR_VNG, CV_BayerRG2GRAY
110     )
111
112
113 CV_ENUM(CvtMode2, CV_YUV2BGR_NV12, CV_YUV2BGRA_NV12, CV_YUV2RGB_NV12, CV_YUV2RGBA_NV12, CV_YUV2BGR_NV21, CV_YUV2BGRA_NV21, CV_YUV2RGB_NV21, CV_YUV2RGBA_NV21,
114                   CV_YUV2BGR_YV12, CV_YUV2BGRA_YV12, CV_YUV2RGB_YV12, CV_YUV2RGBA_YV12, CV_YUV2BGR_IYUV, CV_YUV2BGRA_IYUV, CV_YUV2RGB_IYUV, CV_YUV2RGBA_IYUV,
115                   COLOR_YUV2GRAY_420, CV_YUV2RGB_UYVY, CV_YUV2BGR_UYVY, CV_YUV2RGBA_UYVY, CV_YUV2BGRA_UYVY, CV_YUV2RGB_YUY2, CV_YUV2BGR_YUY2, CV_YUV2RGB_YVYU,
116                   CV_YUV2BGR_YVYU, CV_YUV2RGBA_YUY2, CV_YUV2BGRA_YUY2, CV_YUV2RGBA_YVYU, CV_YUV2BGRA_YVYU)
117
118 CV_ENUM(CvtMode3, CV_RGB2YUV_IYUV, CV_BGR2YUV_IYUV, CV_RGBA2YUV_IYUV, CV_BGRA2YUV_IYUV,
119                   CV_RGB2YUV_YV12, CV_BGR2YUV_YV12, CV_RGBA2YUV_YV12, CV_BGRA2YUV_YV12)
120
121 struct ChPair
122 {
123     ChPair(int _scn, int _dcn): scn(_scn), dcn(_dcn) {}
124     int scn, dcn;
125 };
126
127 ChPair getConversionInfo(int cvtMode)
128 {
129     switch(cvtMode)
130     {
131     case CV_BayerBG2GRAY: case CV_BayerGB2GRAY:
132     case CV_BayerGR2GRAY: case CV_BayerRG2GRAY:
133     case CV_YUV2GRAY_420:
134         return ChPair(1,1);
135     case CV_GRAY2BGR555: case CV_GRAY2BGR565:
136         return ChPair(1,2);
137     case CV_BayerBG2BGR: case CV_BayerBG2BGR_VNG:
138     case CV_BayerGB2BGR: case CV_BayerGB2BGR_VNG:
139     case CV_BayerGR2BGR: case CV_BayerGR2BGR_VNG:
140     case CV_BayerRG2BGR: case CV_BayerRG2BGR_VNG:
141     case CV_GRAY2BGR:
142     case CV_YUV2BGR_NV12: case CV_YUV2RGB_NV12:
143     case CV_YUV2BGR_NV21: case CV_YUV2RGB_NV21:
144     case CV_YUV2BGR_YV12: case CV_YUV2RGB_YV12:
145     case CV_YUV2BGR_IYUV: case CV_YUV2RGB_IYUV:
146         return ChPair(1,3);
147     case CV_GRAY2BGRA:
148     case CV_YUV2BGRA_NV12: case CV_YUV2RGBA_NV12:
149     case CV_YUV2BGRA_NV21: case CV_YUV2RGBA_NV21:
150     case CV_YUV2BGRA_YV12: case CV_YUV2RGBA_YV12:
151     case CV_YUV2BGRA_IYUV: case CV_YUV2RGBA_IYUV:
152         return ChPair(1,4);
153     case CV_BGR5552GRAY: case CV_BGR5652GRAY:
154         return ChPair(2,1);
155     case CV_BGR5552BGR: case CV_BGR5552RGB:
156     case CV_BGR5652BGR: case CV_BGR5652RGB:
157     case CV_YUV2RGB_UYVY: case CV_YUV2BGR_UYVY:
158     case CV_YUV2RGBA_UYVY: case CV_YUV2BGRA_UYVY:
159     case CV_YUV2RGB_YUY2: case CV_YUV2BGR_YUY2:
160     case CV_YUV2RGB_YVYU: case CV_YUV2BGR_YVYU:
161     case CV_YUV2RGBA_YUY2: case CV_YUV2BGRA_YUY2:
162     case CV_YUV2RGBA_YVYU: case CV_YUV2BGRA_YVYU:
163         return ChPair(2,3);
164     case CV_BGR5552BGRA: case CV_BGR5552RGBA:
165     case CV_BGR5652BGRA: case CV_BGR5652RGBA:
166         return ChPair(2,4);
167     case CV_BGR2GRAY: case CV_RGB2GRAY:
168     case CV_RGB2YUV_IYUV: case CV_RGB2YUV_YV12:
169     case CV_BGR2YUV_IYUV: case CV_BGR2YUV_YV12:
170         return ChPair(3,1);
171     case CV_BGR2BGR555: case CV_BGR2BGR565:
172     case CV_RGB2BGR555: case CV_RGB2BGR565:
173         return ChPair(3,2);
174     case CV_BGR2HLS: case CV_BGR2HLS_FULL:
175     case CV_BGR2HSV: case CV_BGR2HSV_FULL:
176     case CV_BGR2Lab: case CV_BGR2Luv:
177     case CV_BGR2RGB: case CV_BGR2XYZ:
178     case CV_BGR2YCrCb: case CV_BGR2YUV:
179     case CV_HLS2BGR: case CV_HLS2BGR_FULL:
180     case CV_HLS2RGB: case CV_HLS2RGB_FULL:
181     case CV_HSV2BGR: case CV_HSV2BGR_FULL:
182     case CV_HSV2RGB: case CV_HSV2RGB_FULL:
183     case CV_Lab2BGR: case CV_Lab2LBGR:
184     case CV_Lab2LRGB: case CV_Lab2RGB:
185     case CV_LBGR2Lab: case CV_LBGR2Luv:
186     case CV_LRGB2Lab: case CV_LRGB2Luv:
187     case CV_Luv2BGR: case CV_Luv2LBGR:
188     case CV_Luv2LRGB: case CV_Luv2RGB:
189     case CV_RGB2HLS: case CV_RGB2HLS_FULL:
190     case CV_RGB2HSV: case CV_RGB2HSV_FULL:
191     case CV_RGB2Lab: case CV_RGB2Luv:
192     case CV_RGB2XYZ: case CV_RGB2YCrCb:
193     case CV_RGB2YUV: case CV_XYZ2BGR:
194     case CV_XYZ2RGB: case CV_YCrCb2BGR:
195     case CV_YCrCb2RGB: case CV_YUV2BGR:
196     case CV_YUV2RGB:
197         return ChPair(3,3);
198     case CV_BGR2BGRA: case CV_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:
210         return ChPair(3,4);
211     case CV_BGRA2GRAY: case CV_RGBA2GRAY:
212     case CV_RGBA2YUV_IYUV: case CV_RGBA2YUV_YV12:
213     case CV_BGRA2YUV_IYUV: case CV_BGRA2YUV_YV12:
214         return ChPair(4,1);
215     case CV_BGRA2BGR555: case CV_BGRA2BGR565:
216     case CV_RGBA2BGR555: case CV_RGBA2BGR565:
217         return ChPair(4,2);
218     case CV_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 CV_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:
230         return ChPair(4,3);
231     case CV_BGRA2RGBA:
232         return ChPair(4,4);
233     default:
234         ADD_FAILURE() << "Unknown conversion type";
235         break;
236     };
237     return ChPair(0,0);
238 }
239
240 typedef std::tr1::tuple<Size, CvtMode> Size_CvtMode_t;
241 typedef perf::TestBaseWithParam<Size_CvtMode_t> Size_CvtMode;
242
243 PERF_TEST_P(Size_CvtMode, cvtColor8u,
244             testing::Combine(
245                 testing::Values(::perf::szODD, ::perf::szVGA, ::perf::sz1080p),
246                 CvtMode::all()
247                 )
248             )
249 {
250     Size sz = get<0>(GetParam());
251     int mode = get<1>(GetParam());
252     ChPair ch = getConversionInfo(mode);
253     mode %= CV_COLORCVT_MAX;
254
255     Mat src(sz, CV_8UC(ch.scn));
256     Mat dst(sz, CV_8UC(ch.dcn));
257
258     declare.time(100);
259     declare.in(src, WARMUP_RNG).out(dst);
260
261     int runs = sz.width <= 320 ? 70 : 1;
262     TEST_CYCLE_MULTIRUN(runs) cvtColor(src, dst, mode, ch.dcn);
263
264     SANITY_CHECK(dst, 1);
265 }
266
267 typedef std::tr1::tuple<Size, CvtModeBayer> Size_CvtMode_Bayer_t;
268 typedef perf::TestBaseWithParam<Size_CvtMode_Bayer_t> Size_CvtMode_Bayer;
269
270 PERF_TEST_P(Size_CvtMode_Bayer, cvtColorBayer8u,
271             testing::Combine(
272                 testing::Values(::perf::szODD, ::perf::szVGA),
273                 CvtModeBayer::all()
274                 )
275             )
276 {
277     Size sz = get<0>(GetParam());
278     int mode = get<1>(GetParam());
279     ChPair ch = getConversionInfo(mode);
280     mode %= CV_COLORCVT_MAX;
281
282     Mat src(sz, CV_8UC(ch.scn));
283     Mat dst(sz, CV_8UC(ch.dcn));
284
285     declare.time(100);
286     declare.in(src, WARMUP_RNG).out(dst);
287
288     TEST_CYCLE() cvtColor(src, dst, mode, ch.dcn);
289
290     SANITY_CHECK(dst, 1);
291 }
292
293 typedef std::tr1::tuple<Size, CvtMode2> Size_CvtMode2_t;
294 typedef perf::TestBaseWithParam<Size_CvtMode2_t> Size_CvtMode2;
295
296 PERF_TEST_P(Size_CvtMode2, cvtColorYUV420,
297             testing::Combine(
298                 testing::Values(szVGA, sz1080p, Size(130, 60)),
299                 CvtMode2::all()
300                 )
301             )
302 {
303     Size sz = get<0>(GetParam());
304     int mode = get<1>(GetParam());
305     ChPair ch = getConversionInfo(mode);
306
307     Mat src(sz.height + sz.height / 2, sz.width, CV_8UC(ch.scn));
308     Mat dst(sz, CV_8UC(ch.dcn));
309
310     declare.in(src, WARMUP_RNG).out(dst);
311
312     int runs = (sz.width <= 640) ? 8 : 1;
313     TEST_CYCLE_MULTIRUN(runs) cvtColor(src, dst, mode, ch.dcn);
314
315     SANITY_CHECK(dst, 1);
316 }
317
318 typedef std::tr1::tuple<Size, CvtMode3> Size_CvtMode3_t;
319 typedef perf::TestBaseWithParam<Size_CvtMode3_t> Size_CvtMode3;
320
321 PERF_TEST_P(Size_CvtMode3, cvtColorRGB2YUV420p,
322             testing::Combine(
323                 testing::Values(szVGA, sz720p, sz1080p, Size(130, 60)),
324                 CvtMode3::all()
325                 )
326             )
327 {
328     Size sz = get<0>(GetParam());
329     int mode = get<1>(GetParam());
330     ChPair ch = getConversionInfo(mode);
331
332     Mat src(sz, CV_8UC(ch.scn));
333     Mat dst(sz.height + sz.height / 2, sz.width, CV_8UC(ch.dcn));
334
335     declare.time(100);
336     declare.in(src, WARMUP_RNG).out(dst);
337
338     int runs = (sz.width <= 640) ? 10 : 1;
339     TEST_CYCLE_MULTIRUN(runs) cvtColor(src, dst, mode, ch.dcn);
340
341     SANITY_CHECK(dst, 1);
342 }