1 #include "perf_precomp.hpp"
6 using std::tr1::make_tuple;
9 //extra color conversions supported implicitly
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
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,
64 CV_BGR5552GRAY, CV_BGR5552RGB, CV_BGR5552RGBA, CV_BGR5652BGR,
65 CV_BGR5652BGRA, CV_BGR5652GRAY, CV_BGR5652RGB, CV_BGR5652RGBA,
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,
72 CV_GRAY2BGR, CV_GRAY2BGR555, CV_GRAY2BGR565, CV_GRAY2BGRA,
74 CV_HLS2BGR, CV_HLS2BGR_FULL, CV_HLS2RGB, CV_HLS2RGB_FULL,
75 CX_HLS2BGRA, CX_HLS2BGRA_FULL, CX_HLS2RGBA, CX_HLS2RGBA_FULL,
77 CV_HSV2BGR, CV_HSV2BGR_FULL, CV_HSV2RGB, CV_HSV2RGB_FULL,
78 CX_HSV2BGRA, CX_HSV2BGRA_FULL, CX_HSV2RGBA, CX_HSV2RGBA_FULL,
80 CV_Lab2BGR, CV_Lab2LBGR, CV_Lab2LRGB, CV_Lab2RGB,
81 CX_Lab2BGRA, CX_Lab2LBGRA, CX_Lab2LRGBA, CX_Lab2RGBA,
83 CV_LBGR2Lab, CV_LBGR2Luv, CV_LRGB2Lab, CV_LRGB2Luv,
84 CX_LBGRA2Lab, CX_LBGRA2Luv, CX_LRGBA2Lab, CX_LRGBA2Luv,
86 CV_Luv2BGR, CV_Luv2LBGR, CV_Luv2LRGB, CV_Luv2RGB,
87 CX_Luv2BGRA, CX_Luv2LBGRA, CX_Luv2LRGBA, CX_Luv2RGBA,
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,
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,
98 CV_XYZ2BGR, CV_XYZ2RGB, CX_XYZ2BGRA, CX_XYZ2RGBA,
100 CV_YCrCb2BGR, CV_YCrCb2RGB, CX_YCrCb2BGRA, CX_YCrCb2RGBA,
101 CV_YUV2BGR, CV_YUV2RGB, CX_YUV2BGRA, CX_YUV2RGBA
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
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)
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)
123 ChPair(int _scn, int _dcn): scn(_scn), dcn(_dcn) {}
127 ChPair getConversionInfo(int cvtMode)
131 case CV_BayerBG2GRAY: case CV_BayerGB2GRAY:
132 case CV_BayerGR2GRAY: case CV_BayerRG2GRAY:
133 case CV_YUV2GRAY_420:
135 case CV_GRAY2BGR555: case CV_GRAY2BGR565:
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:
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:
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:
153 case CV_BGR5552GRAY: case CV_BGR5652GRAY:
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:
164 case CV_BGR5552BGRA: case CV_BGR5552RGBA:
165 case CV_BGR5652BGRA: case CV_BGR5652RGBA:
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:
171 case CV_BGR2BGR555: case CV_BGR2BGR565:
172 case CV_RGB2BGR555: case CV_RGB2BGR565:
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:
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:
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:
215 case CV_BGRA2BGR555: case CV_BGRA2BGR565:
216 case CV_RGBA2BGR555: case CV_RGBA2BGR565:
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:
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());
252 ChPair ch = getConversionInfo(mode);
253 mode %= CV_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 ? 70 : 1;
262 TEST_CYCLE_MULTIRUN(runs) cvtColor(src, dst, mode, ch.dcn);
264 SANITY_CHECK(dst, 1);
267 typedef std::tr1::tuple<Size, CvtModeBayer> Size_CvtMode_Bayer_t;
268 typedef perf::TestBaseWithParam<Size_CvtMode_Bayer_t> Size_CvtMode_Bayer;
270 PERF_TEST_P(Size_CvtMode_Bayer, cvtColorBayer8u,
272 testing::Values(::perf::szODD, ::perf::szVGA),
277 Size sz = get<0>(GetParam());
278 int mode = get<1>(GetParam());
279 ChPair ch = getConversionInfo(mode);
280 mode %= CV_COLORCVT_MAX;
282 Mat src(sz, CV_8UC(ch.scn));
283 Mat dst(sz, CV_8UC(ch.dcn));
286 declare.in(src, WARMUP_RNG).out(dst);
288 TEST_CYCLE() cvtColor(src, dst, mode, ch.dcn);
290 SANITY_CHECK(dst, 1);
293 typedef std::tr1::tuple<Size, CvtMode2> Size_CvtMode2_t;
294 typedef perf::TestBaseWithParam<Size_CvtMode2_t> Size_CvtMode2;
296 PERF_TEST_P(Size_CvtMode2, cvtColorYUV420,
298 testing::Values(szVGA, sz1080p, Size(130, 60)),
303 Size sz = get<0>(GetParam());
304 int mode = get<1>(GetParam());
305 ChPair ch = getConversionInfo(mode);
307 Mat src(sz.height + sz.height / 2, sz.width, CV_8UC(ch.scn));
308 Mat dst(sz, CV_8UC(ch.dcn));
310 declare.in(src, WARMUP_RNG).out(dst);
312 int runs = (sz.width <= 640) ? 8 : 1;
313 TEST_CYCLE_MULTIRUN(runs) cvtColor(src, dst, mode, ch.dcn);
315 SANITY_CHECK(dst, 1);
318 typedef std::tr1::tuple<Size, CvtMode3> Size_CvtMode3_t;
319 typedef perf::TestBaseWithParam<Size_CvtMode3_t> Size_CvtMode3;
321 PERF_TEST_P(Size_CvtMode3, cvtColorRGB2YUV420p,
323 testing::Values(szVGA, sz720p, sz1080p, Size(130, 60)),
328 Size sz = get<0>(GetParam());
329 int mode = get<1>(GetParam());
330 ChPair ch = getConversionInfo(mode);
332 Mat src(sz, CV_8UC(ch.scn));
333 Mat dst(sz.height + sz.height / 2, sz.width, CV_8UC(ch.dcn));
336 declare.in(src, WARMUP_RNG).out(dst);
338 int runs = (sz.width <= 640) ? 10 : 1;
339 TEST_CYCLE_MULTIRUN(runs) cvtColor(src, dst, mode, ch.dcn);
341 SANITY_CHECK(dst, 1);