Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/modules/core/test/ocl/test_channels.cpp
16339 views
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) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved.
14
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
15
// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved.
16
// Third party copyrights are property of their respective owners.
17
//
18
// @Authors
19
// Jia Haipeng, [email protected]
20
//
21
// Redistribution and use in source and binary forms, with or without modification,
22
// are permitted provided that the following conditions are met:
23
//
24
// * Redistribution's of source code must retain the above copyright notice,
25
// this list of conditions and the following disclaimer.
26
//
27
// * Redistribution's in binary form must reproduce the above copyright notice,
28
// this list of conditions and the following disclaimer in the documentation
29
// and/or other materials provided with the distribution.
30
//
31
// * The name of the copyright holders may not be used to endorse or promote products
32
// derived from this software without specific prior written permission.
33
//
34
// This software is provided by the copyright holders and contributors "as is" and
35
// any express or implied warranties, including, but not limited to, the implied
36
// warranties of merchantability and fitness for a particular purpose are disclaimed.
37
// In no event shall the Intel Corporation or contributors be liable for any direct,
38
// indirect, incidental, special, exemplary, or consequential damages
39
// (including, but not limited to, procurement of substitute goods or services;
40
// loss of use, data, or profits; or business interruption) however caused
41
// and on any theory of liability, whether in contract, strict liability,
42
// or tort (including negligence or otherwise) arising in any way out of
43
// the use of this software, even if advised of the possibility of such damage.
44
//
45
//M*/
46
47
#include "../test_precomp.hpp"
48
#include "opencv2/ts/ocl_test.hpp"
49
50
#ifdef HAVE_OPENCL
51
52
namespace opencv_test {
53
namespace ocl {
54
55
//////////////////////////////////////// Merge ///////////////////////////////////////////////
56
57
PARAM_TEST_CASE(Merge, MatDepth, int, bool)
58
{
59
int depth, nsrc;
60
bool use_roi;
61
62
TEST_DECLARE_INPUT_PARAMETER(src1);
63
TEST_DECLARE_INPUT_PARAMETER(src2);
64
TEST_DECLARE_INPUT_PARAMETER(src3);
65
TEST_DECLARE_INPUT_PARAMETER(src4);
66
TEST_DECLARE_OUTPUT_PARAMETER(dst);
67
68
std::vector<Mat> src_roi;
69
std::vector<UMat> usrc_roi;
70
71
virtual void SetUp()
72
{
73
depth = GET_PARAM(0);
74
nsrc = GET_PARAM(1);
75
use_roi = GET_PARAM(2);
76
77
CV_Assert(nsrc >= 1 && nsrc <= 4);
78
}
79
80
int type()
81
{
82
return CV_MAKE_TYPE(depth, randomInt(1, 3));
83
}
84
85
void generateTestData()
86
{
87
Size roiSize = randomSize(1, MAX_VALUE);
88
89
{
90
Border src1Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
91
randomSubMat(src1, src1_roi, roiSize, src1Border, type(), 2, 11);
92
93
Border src2Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
94
randomSubMat(src2, src2_roi, roiSize, src2Border, type(), -1540, 1740);
95
96
Border src3Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
97
randomSubMat(src3, src3_roi, roiSize, src3Border, type(), -1540, 1740);
98
99
Border src4Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
100
randomSubMat(src4, src4_roi, roiSize, src4Border, type(), -1540, 1740);
101
}
102
103
UMAT_UPLOAD_INPUT_PARAMETER(src1);
104
UMAT_UPLOAD_INPUT_PARAMETER(src2);
105
UMAT_UPLOAD_INPUT_PARAMETER(src3);
106
UMAT_UPLOAD_INPUT_PARAMETER(src4);
107
108
src_roi.clear(); usrc_roi.clear(); // for test_loop_times > 1
109
src_roi.push_back(src1_roi), usrc_roi.push_back(usrc1_roi);
110
if (nsrc >= 2)
111
src_roi.push_back(src2_roi), usrc_roi.push_back(usrc2_roi);
112
if (nsrc >= 3)
113
src_roi.push_back(src3_roi), usrc_roi.push_back(usrc3_roi);
114
if (nsrc >= 4)
115
src_roi.push_back(src4_roi), usrc_roi.push_back(usrc4_roi);
116
117
int dcn = 0;
118
for (int i = 0; i < nsrc; ++i)
119
dcn += src_roi[i].channels();
120
121
Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
122
randomSubMat(dst, dst_roi, roiSize, dstBorder, CV_MAKE_TYPE(depth, dcn), 5, 16);
123
124
UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
125
}
126
127
void Near(double threshold = 0.)
128
{
129
OCL_EXPECT_MATS_NEAR(dst, threshold);
130
}
131
};
132
133
OCL_TEST_P(Merge, Accuracy)
134
{
135
for(int j = 0; j < test_loop_times; j++)
136
{
137
generateTestData();
138
139
OCL_OFF(cv::merge(src_roi, dst_roi));
140
OCL_ON(cv::merge(usrc_roi, udst_roi));
141
142
Near();
143
}
144
}
145
146
//////////////////////////////////////// Split ///////////////////////////////////////////////
147
148
PARAM_TEST_CASE(Split, MatType, Channels, bool)
149
{
150
int depth, cn;
151
bool use_roi;
152
153
TEST_DECLARE_INPUT_PARAMETER(src);
154
TEST_DECLARE_OUTPUT_PARAMETER(dst1);
155
TEST_DECLARE_OUTPUT_PARAMETER(dst2);
156
TEST_DECLARE_OUTPUT_PARAMETER(dst3);
157
TEST_DECLARE_OUTPUT_PARAMETER(dst4);
158
159
std::vector<Mat> dst_roi, dst;
160
std::vector<UMat> udst_roi, udst;
161
162
virtual void SetUp()
163
{
164
depth = GET_PARAM(0);
165
cn = GET_PARAM(1);
166
use_roi = GET_PARAM(2);
167
168
CV_Assert(cn >= 1 && cn <= 4);
169
}
170
171
void generateTestData()
172
{
173
Size roiSize = randomSize(1, MAX_VALUE);
174
Border srcBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
175
randomSubMat(src, src_roi, roiSize, srcBorder, CV_MAKE_TYPE(depth, cn), 5, 16);
176
177
{
178
Border dst1Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
179
randomSubMat(dst1, dst1_roi, roiSize, dst1Border, depth, 2, 11);
180
181
Border dst2Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
182
randomSubMat(dst2, dst2_roi, roiSize, dst2Border, depth, -1540, 1740);
183
184
Border dst3Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
185
randomSubMat(dst3, dst3_roi, roiSize, dst3Border, depth, -1540, 1740);
186
187
Border dst4Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
188
randomSubMat(dst4, dst4_roi, roiSize, dst4Border, depth, -1540, 1740);
189
}
190
191
UMAT_UPLOAD_INPUT_PARAMETER(src);
192
UMAT_UPLOAD_OUTPUT_PARAMETER(dst1);
193
UMAT_UPLOAD_OUTPUT_PARAMETER(dst2);
194
UMAT_UPLOAD_OUTPUT_PARAMETER(dst3);
195
UMAT_UPLOAD_OUTPUT_PARAMETER(dst4);
196
197
dst_roi.push_back(dst1_roi), udst_roi.push_back(udst1_roi),
198
dst.push_back(dst1), udst.push_back(udst1);
199
if (cn >= 2)
200
dst_roi.push_back(dst2_roi), udst_roi.push_back(udst2_roi),
201
dst.push_back(dst2), udst.push_back(udst2);
202
if (cn >= 3)
203
dst_roi.push_back(dst3_roi), udst_roi.push_back(udst3_roi),
204
dst.push_back(dst3), udst.push_back(udst3);
205
if (cn >= 4)
206
dst_roi.push_back(dst4_roi), udst_roi.push_back(udst4_roi),
207
dst.push_back(dst4), udst.push_back(udst4);
208
}
209
};
210
211
OCL_TEST_P(Split, Accuracy)
212
{
213
for (int j = 0; j < test_loop_times; j++)
214
{
215
generateTestData();
216
217
OCL_OFF(cv::split(src_roi, dst_roi));
218
OCL_ON(cv::split(usrc_roi, udst_roi));
219
220
for (int i = 0; i < cn; ++i)
221
{
222
EXPECT_MAT_NEAR(dst[i], udst[i], 0.0);
223
EXPECT_MAT_NEAR(dst_roi[i], udst_roi[i], 0.0);
224
}
225
}
226
}
227
228
//////////////////////////////////////// MixChannels ///////////////////////////////////////////////
229
230
PARAM_TEST_CASE(MixChannels, MatType, bool)
231
{
232
int depth;
233
bool use_roi;
234
235
TEST_DECLARE_INPUT_PARAMETER(src1);
236
TEST_DECLARE_INPUT_PARAMETER(src2);
237
TEST_DECLARE_INPUT_PARAMETER(src3);
238
TEST_DECLARE_INPUT_PARAMETER(src4);
239
TEST_DECLARE_OUTPUT_PARAMETER(dst1);
240
TEST_DECLARE_OUTPUT_PARAMETER(dst2);
241
TEST_DECLARE_OUTPUT_PARAMETER(dst3);
242
TEST_DECLARE_OUTPUT_PARAMETER(dst4);
243
244
std::vector<Mat> src_roi, dst_roi, dst;
245
std::vector<UMat> usrc_roi, udst_roi, udst;
246
std::vector<int> fromTo;
247
248
virtual void SetUp()
249
{
250
depth = GET_PARAM(0);
251
use_roi = GET_PARAM(1);
252
}
253
254
// generate number of channels and create type
255
int type()
256
{
257
int cn = randomInt(1, 5);
258
return CV_MAKE_TYPE(depth, cn);
259
}
260
261
void generateTestData()
262
{
263
src_roi.clear();
264
dst_roi.clear();
265
dst.clear();
266
usrc_roi.clear();
267
udst_roi.clear();
268
udst.clear();
269
fromTo.clear();
270
271
Size roiSize = randomSize(1, MAX_VALUE);
272
273
{
274
Border src1Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
275
randomSubMat(src1, src1_roi, roiSize, src1Border, type(), 2, 11);
276
277
Border src2Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
278
randomSubMat(src2, src2_roi, roiSize, src2Border, type(), -1540, 1740);
279
280
Border src3Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
281
randomSubMat(src3, src3_roi, roiSize, src3Border, type(), -1540, 1740);
282
283
Border src4Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
284
randomSubMat(src4, src4_roi, roiSize, src4Border, type(), -1540, 1740);
285
}
286
287
{
288
Border dst1Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
289
randomSubMat(dst1, dst1_roi, roiSize, dst1Border, type(), 2, 11);
290
291
Border dst2Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
292
randomSubMat(dst2, dst2_roi, roiSize, dst2Border, type(), -1540, 1740);
293
294
Border dst3Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
295
randomSubMat(dst3, dst3_roi, roiSize, dst3Border, type(), -1540, 1740);
296
297
Border dst4Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
298
randomSubMat(dst4, dst4_roi, roiSize, dst4Border, type(), -1540, 1740);
299
}
300
301
UMAT_UPLOAD_INPUT_PARAMETER(src1);
302
UMAT_UPLOAD_INPUT_PARAMETER(src2);
303
UMAT_UPLOAD_INPUT_PARAMETER(src3);
304
UMAT_UPLOAD_INPUT_PARAMETER(src4);
305
306
UMAT_UPLOAD_OUTPUT_PARAMETER(dst1);
307
UMAT_UPLOAD_OUTPUT_PARAMETER(dst2);
308
UMAT_UPLOAD_OUTPUT_PARAMETER(dst3);
309
UMAT_UPLOAD_OUTPUT_PARAMETER(dst4);
310
311
int nsrc = randomInt(1, 5), ndst = randomInt(1, 5);
312
313
src_roi.push_back(src1_roi), usrc_roi.push_back(usrc1_roi);
314
if (nsrc >= 2)
315
src_roi.push_back(src2_roi), usrc_roi.push_back(usrc2_roi);
316
if (nsrc >= 3)
317
src_roi.push_back(src3_roi), usrc_roi.push_back(usrc3_roi);
318
if (nsrc >= 4)
319
src_roi.push_back(src4_roi), usrc_roi.push_back(usrc4_roi);
320
321
dst_roi.push_back(dst1_roi), udst_roi.push_back(udst1_roi),
322
dst.push_back(dst1), udst.push_back(udst1);
323
if (ndst >= 2)
324
dst_roi.push_back(dst2_roi), udst_roi.push_back(udst2_roi),
325
dst.push_back(dst2), udst.push_back(udst2);
326
if (ndst >= 3)
327
dst_roi.push_back(dst3_roi), udst_roi.push_back(udst3_roi),
328
dst.push_back(dst3), udst.push_back(udst3);
329
if (ndst >= 4)
330
dst_roi.push_back(dst4_roi), udst_roi.push_back(udst4_roi),
331
dst.push_back(dst4), udst.push_back(udst4);
332
333
int scntotal = 0, dcntotal = 0;
334
for (int i = 0; i < nsrc; ++i)
335
scntotal += src_roi[i].channels();
336
for (int i = 0; i < ndst; ++i)
337
dcntotal += dst_roi[i].channels();
338
339
int npairs = randomInt(1, std::min(scntotal, dcntotal) + 1);
340
fromTo.resize(npairs << 1);
341
342
for (int i = 0; i < npairs; ++i)
343
{
344
fromTo[i<<1] = randomInt(0, scntotal);
345
fromTo[(i<<1)+1] = randomInt(0, dcntotal);
346
}
347
}
348
};
349
350
OCL_TEST_P(MixChannels, Accuracy)
351
{
352
for (int j = 0; j < test_loop_times + 10; j++)
353
{
354
generateTestData();
355
356
OCL_OFF(cv::mixChannels(src_roi, dst_roi, fromTo));
357
OCL_ON(cv::mixChannels(usrc_roi, udst_roi, fromTo));
358
359
for (size_t i = 0, size = dst_roi.size(); i < size; ++i)
360
{
361
EXPECT_MAT_NEAR(dst[i], udst[i], 0.0);
362
EXPECT_MAT_NEAR(dst_roi[i], udst_roi[i], 0.0);
363
}
364
}
365
}
366
367
//////////////////////////////////////// InsertChannel ///////////////////////////////////////////////
368
369
PARAM_TEST_CASE(InsertChannel, MatDepth, Channels, bool)
370
{
371
int depth, cn, coi;
372
bool use_roi;
373
374
TEST_DECLARE_INPUT_PARAMETER(src);
375
TEST_DECLARE_OUTPUT_PARAMETER(dst);
376
377
virtual void SetUp()
378
{
379
depth = GET_PARAM(0);
380
cn = GET_PARAM(1);
381
use_roi = GET_PARAM(2);
382
}
383
384
void generateTestData()
385
{
386
Size roiSize = randomSize(1, MAX_VALUE);
387
coi = randomInt(0, cn);
388
389
Border srcBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
390
randomSubMat(src, src_roi, roiSize, srcBorder, depth, 2, 11);
391
392
Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
393
randomSubMat(dst, dst_roi, roiSize, dstBorder, CV_MAKE_TYPE(depth, cn), 5, 16);
394
395
UMAT_UPLOAD_INPUT_PARAMETER(src);
396
UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
397
}
398
};
399
400
OCL_TEST_P(InsertChannel, Accuracy)
401
{
402
for(int j = 0; j < test_loop_times; j++)
403
{
404
generateTestData();
405
406
OCL_OFF(cv::insertChannel(src_roi, dst_roi, coi));
407
OCL_ON(cv::insertChannel(usrc_roi, udst_roi, coi));
408
409
OCL_EXPECT_MATS_NEAR(dst, 0);
410
}
411
}
412
413
//////////////////////////////////////// ExtractChannel ///////////////////////////////////////////////
414
415
PARAM_TEST_CASE(ExtractChannel, MatDepth, Channels, bool)
416
{
417
int depth, cn, coi;
418
bool use_roi;
419
420
TEST_DECLARE_INPUT_PARAMETER(src);
421
TEST_DECLARE_OUTPUT_PARAMETER(dst);
422
423
virtual void SetUp()
424
{
425
depth = GET_PARAM(0);
426
cn = GET_PARAM(1);
427
use_roi = GET_PARAM(2);
428
}
429
430
void generateTestData()
431
{
432
Size roiSize = randomSize(1, MAX_VALUE);
433
coi = randomInt(0, cn);
434
435
Border srcBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
436
randomSubMat(src, src_roi, roiSize, srcBorder, CV_MAKE_TYPE(depth, cn), 2, 11);
437
438
Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
439
randomSubMat(dst, dst_roi, roiSize, dstBorder, depth, 5, 16);
440
441
UMAT_UPLOAD_INPUT_PARAMETER(src);
442
UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
443
}
444
};
445
446
OCL_TEST_P(ExtractChannel, Accuracy)
447
{
448
for(int j = 0; j < test_loop_times; j++)
449
{
450
generateTestData();
451
452
OCL_OFF(cv::extractChannel(src_roi, dst_roi, coi));
453
OCL_ON(cv::extractChannel(usrc_roi, udst_roi, coi));
454
455
OCL_EXPECT_MATS_NEAR(dst, 0);
456
}
457
}
458
459
//////////////////////////////////////// Instantiation ///////////////////////////////////////////////
460
461
OCL_INSTANTIATE_TEST_CASE_P(Channels, Merge, Combine(OCL_ALL_DEPTHS, Values(1, 2, 3, 4), Bool()));
462
OCL_INSTANTIATE_TEST_CASE_P(Channels, Split, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
463
OCL_INSTANTIATE_TEST_CASE_P(Channels, MixChannels, Combine(OCL_ALL_DEPTHS, Bool()));
464
OCL_INSTANTIATE_TEST_CASE_P(Channels, InsertChannel, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
465
OCL_INSTANTIATE_TEST_CASE_P(Channels, ExtractChannel, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
466
467
} } // namespace opencv_test::ocl
468
469
#endif // HAVE_OPENCL
470
471