Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/modules/core/test/test_umat.cpp
16337 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) 2013, OpenCV Foundation, all rights reserved.
14
// Third party copyrights are property of their respective owners.
15
//
16
// Redistribution and use in source and binary forms, with or without modification,
17
// are permitted provided that the following conditions are met:
18
//
19
// * Redistribution's of source code must retain the above copyright notice,
20
// this list of conditions and the following disclaimer.
21
//
22
// * Redistribution's in binary form must reproduce the above copyright notice,
23
// this list of conditions and the following disclaimer in the documentation
24
// and/or other materials provided with the distribution.
25
//
26
// * The name of the copyright holders may not be used to endorse or promote products
27
// derived from this software without specific prior written permission.
28
//
29
// This software is provided by the copyright holders and contributors "as is" and
30
// any express or implied warranties, including, but not limited to, the implied
31
// warranties of merchantability and fitness for a particular purpose are disclaimed.
32
// In no event shall the OpenCV Foundation or contributors be liable for any direct,
33
// indirect, incidental, special, exemplary, or consequential damages
34
// (including, but not limited to, procurement of substitute goods or services;
35
// loss of use, data, or profits; or business interruption) however caused
36
// and on any theory of liability, whether in contract, strict liability,
37
// or tort (including negligence or otherwise) arising in any way out of
38
// the use of this software, even if advised of the possibility of such damage.
39
//
40
//M*/
41
42
#include "test_precomp.hpp"
43
#include "opencv2/ts/ocl_test.hpp"
44
45
using namespace opencv_test;
46
using namespace testing;
47
using namespace cv;
48
49
namespace opencv_test {
50
namespace ocl {
51
52
#define UMAT_TEST_SIZES testing::Values(cv::Size(1, 1), cv::Size(1,128), cv::Size(128, 1), \
53
cv::Size(128, 128), cv::Size(640, 480), cv::Size(751, 373), cv::Size(1200, 1200))
54
55
/////////////////////////////// Basic Tests ////////////////////////////////
56
57
PARAM_TEST_CASE(UMatBasicTests, int, int, Size, bool)
58
{
59
Mat a;
60
UMat ua;
61
int type;
62
int depth;
63
int cn;
64
Size size;
65
bool useRoi;
66
Size roi_size;
67
Rect roi;
68
69
virtual void SetUp()
70
{
71
depth = GET_PARAM(0);
72
cn = GET_PARAM(1);
73
size = GET_PARAM(2);
74
useRoi = GET_PARAM(3);
75
type = CV_MAKE_TYPE(depth, cn);
76
a = randomMat(size, type, -100, 100);
77
a.copyTo(ua);
78
int roi_shift_x = randomInt(0, size.width-1);
79
int roi_shift_y = randomInt(0, size.height-1);
80
roi_size = Size(size.width - roi_shift_x, size.height - roi_shift_y);
81
roi = Rect(roi_shift_x, roi_shift_y, roi_size.width, roi_size.height);
82
}
83
};
84
85
TEST_P(UMatBasicTests, createUMat)
86
{
87
if(useRoi)
88
{
89
ua = UMat(ua, roi);
90
}
91
int dims = randomInt(2,6);
92
int _sz[CV_MAX_DIM];
93
for( int i = 0; i<dims; i++)
94
{
95
_sz[i] = randomInt(1,50);
96
}
97
int *sz = _sz;
98
int new_depth = randomInt(CV_8S, CV_64F);
99
int new_cn = randomInt(1,4);
100
ua.create(dims, sz, CV_MAKE_TYPE(new_depth, new_cn));
101
102
for(int i = 0; i<dims; i++)
103
{
104
ASSERT_EQ(ua.size[i], sz[i]);
105
}
106
ASSERT_EQ(ua.dims, dims);
107
ASSERT_EQ(ua.type(), CV_MAKE_TYPE(new_depth, new_cn) );
108
Size new_size = randomSize(1, 1000);
109
ua.create(new_size, CV_MAKE_TYPE(new_depth, new_cn) );
110
ASSERT_EQ( ua.size(), new_size);
111
ASSERT_EQ(ua.type(), CV_MAKE_TYPE(new_depth, new_cn) );
112
ASSERT_EQ( ua.dims, 2);
113
}
114
115
TEST_P(UMatBasicTests, swap)
116
{
117
Mat b = randomMat(size, type, -100, 100);
118
UMat ub;
119
b.copyTo(ub);
120
if(useRoi)
121
{
122
ua = UMat(ua,roi);
123
ub = UMat(ub,roi);
124
}
125
UMat uc = ua, ud = ub;
126
swap(ua,ub);
127
EXPECT_MAT_NEAR(ub,uc, 0);
128
EXPECT_MAT_NEAR(ud, ua, 0);
129
}
130
131
TEST_P(UMatBasicTests, base)
132
{
133
const int align_mask = 3;
134
roi.x &= ~align_mask;
135
roi.y &= ~align_mask;
136
roi.width = (roi.width + align_mask) & ~align_mask;
137
roi &= Rect(0, 0, ua.cols, ua.rows);
138
139
if(useRoi)
140
{
141
ua = UMat(ua,roi);
142
}
143
UMat ub = ua.clone();
144
EXPECT_MAT_NEAR(ub,ua,0);
145
146
ASSERT_EQ(ua.channels(), cn);
147
ASSERT_EQ(ua.depth(), depth);
148
ASSERT_EQ(ua.type(), type);
149
ASSERT_EQ(ua.elemSize(), a.elemSize());
150
ASSERT_EQ(ua.elemSize1(), a.elemSize1());
151
ASSERT_EQ(ub.empty(), ub.cols*ub.rows == 0);
152
ub.release();
153
ASSERT_TRUE( ub.empty() );
154
if(useRoi && a.size() != ua.size())
155
{
156
ASSERT_EQ(ua.isSubmatrix(), true);
157
}
158
else
159
{
160
ASSERT_EQ(ua.isSubmatrix(), false);
161
}
162
163
int dims = randomInt(2,6);
164
int sz[CV_MAX_DIM];
165
size_t total = 1;
166
for(int i = 0; i<dims; i++)
167
{
168
sz[i] = randomInt(1,45);
169
total *= (size_t)sz[i];
170
}
171
int new_type = CV_MAKE_TYPE(randomInt(CV_8S,CV_64F),randomInt(1,4));
172
ub = UMat(dims, sz, new_type);
173
ASSERT_EQ(ub.total(), total);
174
}
175
176
TEST_P(UMatBasicTests, copyTo)
177
{
178
int i;
179
if(useRoi)
180
{
181
UMat roi_ua;
182
Mat roi_a;
183
roi_ua = UMat(ua, roi);
184
roi_a = Mat(a, roi);
185
roi_a.copyTo(roi_ua);
186
EXPECT_MAT_NEAR(roi_a, roi_ua, 0);
187
roi_ua.copyTo(roi_a);
188
EXPECT_MAT_NEAR(roi_ua, roi_a, 0);
189
roi_ua.copyTo(ua);
190
EXPECT_MAT_NEAR(roi_ua, ua, 0);
191
ua.copyTo(a);
192
EXPECT_MAT_NEAR(ua, a, 0);
193
}
194
{
195
UMat ub;
196
ua.copyTo(ub);
197
EXPECT_MAT_NEAR(ua, ub, 0);
198
}
199
{
200
UMat ub;
201
i = randomInt(0, ua.cols-1);
202
a.col(i).copyTo(ub);
203
EXPECT_MAT_NEAR(a.col(i), ub, 0);
204
}
205
{
206
UMat ub;
207
ua.col(i).copyTo(ub);
208
EXPECT_MAT_NEAR(ua.col(i), ub, 0);
209
}
210
{
211
Mat b;
212
ua.col(i).copyTo(b);
213
EXPECT_MAT_NEAR(ua.col(i), b, 0);
214
}
215
{
216
UMat ub;
217
i = randomInt(0, a.rows-1);
218
ua.row(i).copyTo(ub);
219
EXPECT_MAT_NEAR(ua.row(i), ub, 0);
220
}
221
{
222
UMat ub;
223
a.row(i).copyTo(ub);
224
EXPECT_MAT_NEAR(a.row(i), ub, 0);
225
}
226
{
227
Mat b;
228
ua.row(i).copyTo(b);
229
EXPECT_MAT_NEAR(ua.row(i), b, 0);
230
}
231
}
232
233
TEST_P(UMatBasicTests, GetUMat)
234
{
235
if(useRoi)
236
{
237
a = Mat(a, roi);
238
ua = UMat(ua,roi);
239
}
240
{
241
UMat ub;
242
ub = a.getUMat(ACCESS_RW);
243
EXPECT_MAT_NEAR(ub, ua, 0);
244
}
245
{
246
UMat u = a.getUMat(ACCESS_RW);
247
{
248
Mat b = u.getMat(ACCESS_RW);
249
EXPECT_MAT_NEAR(b, a, 0);
250
}
251
}
252
{
253
Mat b;
254
b = ua.getMat(ACCESS_RW);
255
EXPECT_MAT_NEAR(b, a, 0);
256
}
257
{
258
Mat m = ua.getMat(ACCESS_RW);
259
{
260
UMat ub = m.getUMat(ACCESS_RW);
261
EXPECT_MAT_NEAR(ub, ua, 0);
262
}
263
}
264
}
265
266
INSTANTIATE_TEST_CASE_P(UMat, UMatBasicTests, Combine(testing::Values(CV_8U, CV_64F), testing::Values(1, 2),
267
testing::Values(cv::Size(1, 1), cv::Size(1, 128), cv::Size(128, 1), cv::Size(128, 128), cv::Size(640, 480)), Bool()));
268
269
//////////////////////////////////////////////////////////////// Reshape ////////////////////////////////////////////////////////////////////////
270
271
PARAM_TEST_CASE(UMatTestReshape, int, int, Size, bool)
272
{
273
Mat a;
274
UMat ua, ub;
275
int type;
276
int depth;
277
int cn;
278
Size size;
279
bool useRoi;
280
Size roi_size;
281
virtual void SetUp()
282
{
283
depth = GET_PARAM(0);
284
cn = GET_PARAM(1);
285
size = GET_PARAM(2);
286
useRoi = GET_PARAM(3);
287
type = CV_MAKE_TYPE(depth, cn);
288
}
289
};
290
291
TEST_P(UMatTestReshape, reshape)
292
{
293
a = randomMat(size,type, -100, 100);
294
a.copyTo(ua);
295
if(useRoi)
296
{
297
int roi_shift_x = randomInt(0, size.width-1);
298
int roi_shift_y = randomInt(0, size.height-1);
299
roi_size = Size(size.width - roi_shift_x, size.height - roi_shift_y);
300
Rect roi(roi_shift_x, roi_shift_y, roi_size.width, roi_size.height);
301
ua = UMat(ua, roi).clone();
302
a = Mat(a, roi).clone();
303
}
304
305
int nChannels = randomInt(1,4);
306
307
if ((ua.cols*ua.channels()*ua.rows)%nChannels != 0)
308
{
309
EXPECT_ANY_THROW(ua.reshape(nChannels));
310
}
311
else
312
{
313
ub = ua.reshape(nChannels);
314
ASSERT_EQ(ub.channels(),nChannels);
315
ASSERT_EQ(ub.channels()*ub.cols*ub.rows, ua.channels()*ua.cols*ua.rows);
316
317
EXPECT_MAT_NEAR(ua.reshape(nChannels), a.reshape(nChannels), 0);
318
319
int new_rows = randomInt(1, INT_MAX);
320
if ( ((int)ua.total()*ua.channels())%(new_rows*nChannels) != 0)
321
{
322
EXPECT_ANY_THROW (ua.reshape(nChannels, new_rows) );
323
}
324
else
325
{
326
EXPECT_NO_THROW ( ub = ua.reshape(nChannels, new_rows) );
327
ASSERT_EQ(ub.channels(),nChannels);
328
ASSERT_EQ(ub.rows, new_rows);
329
ASSERT_EQ(ub.channels()*ub.cols*ub.rows, ua.channels()*ua.cols*ua.rows);
330
331
EXPECT_MAT_NEAR(ua.reshape(nChannels,new_rows), a.reshape(nChannels,new_rows), 0);
332
}
333
334
new_rows = (int)ua.total()*ua.channels()/(nChannels*randomInt(1, size.width*size.height));
335
if (new_rows == 0) new_rows = 1;
336
int new_cols = (int)ua.total()*ua.channels()/(new_rows*nChannels);
337
int sz[] = {new_rows, new_cols};
338
if( ((int)ua.total()*ua.channels()) % (new_rows*new_cols) != 0 )
339
{
340
EXPECT_ANY_THROW( ua.reshape(nChannels, ua.dims, sz) );
341
}
342
else
343
{
344
EXPECT_NO_THROW ( ub = ua.reshape(nChannels, ua.dims, sz) );
345
ASSERT_EQ(ub.channels(),nChannels);
346
ASSERT_EQ(ub.rows, new_rows);
347
ASSERT_EQ(ub.cols, new_cols);
348
ASSERT_EQ(ub.channels()*ub.cols*ub.rows, ua.channels()*ua.cols*ua.rows);
349
350
EXPECT_MAT_NEAR(ua.reshape(nChannels, ua.dims, sz), a.reshape(nChannels, a.dims, sz), 0);
351
}
352
}
353
}
354
355
INSTANTIATE_TEST_CASE_P(UMat, UMatTestReshape, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, UMAT_TEST_SIZES, Bool() ));
356
357
static void check_ndim_shape(const cv::UMat &mat, int cn, int ndims, const int *sizes)
358
{
359
EXPECT_EQ(mat.channels(), cn);
360
EXPECT_EQ(mat.dims, ndims);
361
362
if (mat.dims != ndims)
363
return;
364
365
for (int i = 0; i < ndims; i++)
366
EXPECT_EQ(mat.size[i], sizes[i]);
367
}
368
369
TEST(UMatTestReshape, reshape_ndims_2)
370
{
371
const cv::UMat A(8, 16, CV_8UC3);
372
cv::UMat B;
373
374
{
375
int new_sizes_mask[] = { 0, 3, 4, 4 };
376
int new_sizes_real[] = { 8, 3, 4, 4 };
377
ASSERT_NO_THROW(B = A.reshape(1, 4, new_sizes_mask));
378
check_ndim_shape(B, 1, 4, new_sizes_real);
379
}
380
{
381
int new_sizes[] = { 16, 8 };
382
ASSERT_NO_THROW(B = A.reshape(0, 2, new_sizes));
383
check_ndim_shape(B, 3, 2, new_sizes);
384
EXPECT_EQ(B.rows, new_sizes[0]);
385
EXPECT_EQ(B.cols, new_sizes[1]);
386
}
387
{
388
int new_sizes[] = { 2, 5, 1, 3 };
389
cv::UMat A_sliced = A(cv::Range::all(), cv::Range(0, 15));
390
ASSERT_ANY_THROW(A_sliced.reshape(4, 4, new_sizes));
391
}
392
}
393
394
TEST(UMatTestReshape, reshape_ndims_4)
395
{
396
const int sizes[] = { 2, 6, 4, 12 };
397
const cv::UMat A(4, sizes, CV_8UC3);
398
cv::UMat B;
399
400
{
401
int new_sizes_mask[] = { 0, 864 };
402
int new_sizes_real[] = { 2, 864 };
403
ASSERT_NO_THROW(B = A.reshape(1, 2, new_sizes_mask));
404
check_ndim_shape(B, 1, 2, new_sizes_real);
405
EXPECT_EQ(B.rows, new_sizes_real[0]);
406
EXPECT_EQ(B.cols, new_sizes_real[1]);
407
}
408
{
409
int new_sizes_mask[] = { 4, 0, 0, 2, 3 };
410
int new_sizes_real[] = { 4, 6, 4, 2, 3 };
411
ASSERT_NO_THROW(B = A.reshape(0, 5, new_sizes_mask));
412
check_ndim_shape(B, 3, 5, new_sizes_real);
413
}
414
{
415
int new_sizes_mask[] = { 1, 1 };
416
ASSERT_ANY_THROW(A.reshape(0, 2, new_sizes_mask));
417
}
418
{
419
int new_sizes_mask[] = { 4, 6, 3, 3, 0 };
420
ASSERT_ANY_THROW(A.reshape(0, 5, new_sizes_mask));
421
}
422
}
423
424
////////////////////////////////////////////////////////////////// ROI testing ///////////////////////////////////////////////////////////////
425
426
PARAM_TEST_CASE(UMatTestRoi, int, int, Size)
427
{
428
Mat a, roi_a;
429
UMat ua, roi_ua;
430
int type;
431
int depth;
432
int cn;
433
Size size;
434
Size roi_size;
435
virtual void SetUp()
436
{
437
depth = GET_PARAM(0);
438
cn = GET_PARAM(1);
439
size = GET_PARAM(2);
440
type = CV_MAKE_TYPE(depth, cn);
441
}
442
};
443
444
TEST_P(UMatTestRoi, createRoi)
445
{
446
int roi_shift_x = randomInt(0, size.width-1);
447
int roi_shift_y = randomInt(0, size.height-1);
448
roi_size = Size(size.width - roi_shift_x, size.height - roi_shift_y);
449
a = randomMat(size, type, -100, 100);
450
Rect roi(roi_shift_x, roi_shift_y, roi_size.width, roi_size.height);
451
roi_a = Mat(a, roi);
452
a.copyTo(ua);
453
roi_ua = UMat(ua, roi);
454
455
EXPECT_MAT_NEAR(roi_a, roi_ua, 0);
456
}
457
458
TEST_P(UMatTestRoi, locateRoi)
459
{
460
int roi_shift_x = randomInt(0, size.width-1);
461
int roi_shift_y = randomInt(0, size.height-1);
462
roi_size = Size(size.width - roi_shift_x, size.height - roi_shift_y);
463
a = randomMat(size, type, -100, 100);
464
Rect roi(roi_shift_x, roi_shift_y, roi_size.width, roi_size.height);
465
roi_a = Mat(a, roi);
466
a.copyTo(ua);
467
roi_ua = UMat(ua,roi);
468
Size sz, usz;
469
Point p, up;
470
roi_a.locateROI(sz, p);
471
roi_ua.locateROI(usz, up);
472
ASSERT_EQ(sz, usz);
473
ASSERT_EQ(p, up);
474
}
475
476
TEST_P(UMatTestRoi, adjustRoi)
477
{
478
int roi_shift_x = randomInt(0, size.width-1);
479
int roi_shift_y = randomInt(0, size.height-1);
480
roi_size = Size(size.width - roi_shift_x, size.height - roi_shift_y);
481
a = randomMat(size, type, -100, 100);
482
Rect roi(roi_shift_x, roi_shift_y, roi_size.width, roi_size.height);
483
a.copyTo(ua);
484
roi_ua = UMat( ua, roi);
485
int adjLeft = randomInt(-(roi_ua.cols/2), (size.width-1)/2);
486
int adjRight = randomInt(-(roi_ua.cols/2), (size.width-1)/2);
487
int adjTop = randomInt(-(roi_ua.rows/2), (size.height-1)/2);
488
int adjBot = randomInt(-(roi_ua.rows/2), (size.height-1)/2);
489
roi_ua.adjustROI(adjTop, adjBot, adjLeft, adjRight);
490
roi_shift_x = std::max(0, roi.x-adjLeft);
491
roi_shift_y = std::max(0, roi.y-adjTop);
492
Rect new_roi( roi_shift_x, roi_shift_y, std::min(roi.width+adjRight+adjLeft, size.width-roi_shift_x), std::min(roi.height+adjBot+adjTop, size.height-roi_shift_y) );
493
UMat test_roi = UMat(ua, new_roi);
494
EXPECT_MAT_NEAR(roi_ua, test_roi, 0);
495
}
496
497
INSTANTIATE_TEST_CASE_P(UMat, UMatTestRoi, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, UMAT_TEST_SIZES ));
498
499
TEST(UMatTestRoi, adjustRoiOverflow)
500
{
501
UMat m(15, 10, CV_32S);
502
UMat roi(m, cv::Range(2, 10), cv::Range(3,6));
503
int rowsInROI = roi.rows;
504
roi.adjustROI(1, 0, 0, 0);
505
506
ASSERT_EQ(roi.rows, rowsInROI + 1);
507
508
roi.adjustROI(-m.rows, -m.rows, 0, 0);
509
510
ASSERT_EQ(roi.rows, m.rows);
511
}
512
513
/////////////////////////////////////////////////////////////// Size ////////////////////////////////////////////////////////////////////
514
515
PARAM_TEST_CASE(UMatTestSizeOperations, int, int, Size, bool)
516
{
517
Mat a, b, roi_a, roi_b;
518
UMat ua, ub, roi_ua, roi_ub;
519
int type;
520
int depth;
521
int cn;
522
Size size;
523
Size roi_size;
524
bool useRoi;
525
virtual void SetUp()
526
{
527
depth = GET_PARAM(0);
528
cn = GET_PARAM(1);
529
size = GET_PARAM(2);
530
useRoi = GET_PARAM(3);
531
type = CV_MAKE_TYPE(depth, cn);
532
}
533
};
534
535
TEST_P(UMatTestSizeOperations, copySize)
536
{
537
Size s = randomSize(1,300);
538
a = randomMat(size, type, -100, 100);
539
b = randomMat(s, type, -100, 100);
540
a.copyTo(ua);
541
b.copyTo(ub);
542
if(useRoi)
543
{
544
int roi_shift_x = randomInt(0, size.width-1);
545
int roi_shift_y = randomInt(0, size.height-1);
546
roi_size = Size(size.width - roi_shift_x, size.height - roi_shift_y);
547
Rect roi(roi_shift_x, roi_shift_y, roi_size.width, roi_size.height);
548
ua = UMat(ua,roi);
549
550
roi_shift_x = randomInt(0, s.width-1);
551
roi_shift_y = randomInt(0, s.height-1);
552
roi_size = Size(s.width - roi_shift_x, s.height - roi_shift_y);
553
roi = Rect(roi_shift_x, roi_shift_y, roi_size.width, roi_size.height);
554
ub = UMat(ub, roi);
555
}
556
ua.copySize(ub);
557
ASSERT_EQ(ua.size, ub.size);
558
}
559
560
INSTANTIATE_TEST_CASE_P(UMat, UMatTestSizeOperations, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, UMAT_TEST_SIZES, Bool() ));
561
562
///////////////////////////////////////////////////////////////// UMat operations ////////////////////////////////////////////////////////////////////////////
563
564
PARAM_TEST_CASE(UMatTestUMatOperations, int, int, Size, bool)
565
{
566
Mat a, b;
567
UMat ua, ub;
568
int type;
569
int depth;
570
int cn;
571
Size size;
572
Size roi_size;
573
bool useRoi;
574
virtual void SetUp()
575
{
576
depth = GET_PARAM(0);
577
cn = GET_PARAM(1);
578
size = GET_PARAM(2);
579
useRoi = GET_PARAM(3);
580
type = CV_MAKE_TYPE(depth, cn);
581
}
582
};
583
584
TEST_P(UMatTestUMatOperations, diag)
585
{
586
a = randomMat(size, type, -100, 100);
587
a.copyTo(ua);
588
Mat new_diag;
589
if(useRoi)
590
{
591
int roi_shift_x = randomInt(0, size.width-1);
592
int roi_shift_y = randomInt(0, size.height-1);
593
roi_size = Size(size.width - roi_shift_x, size.height - roi_shift_y);
594
Rect roi(roi_shift_x, roi_shift_y, roi_size.width, roi_size.height);
595
ua = UMat(ua,roi);
596
a = Mat(a, roi);
597
}
598
int n = randomInt(0, ua.cols-1);
599
ub = ua.diag(n);
600
b = a.diag(n);
601
EXPECT_MAT_NEAR(b, ub, 0);
602
new_diag = randomMat(Size(ua.rows, 1), type, -100, 100);
603
new_diag.copyTo(ub);
604
ua = cv::UMat::diag(ub);
605
EXPECT_MAT_NEAR(ua.diag(), new_diag.t(), 0);
606
}
607
608
INSTANTIATE_TEST_CASE_P(UMat, UMatTestUMatOperations, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, UMAT_TEST_SIZES, Bool()));
609
610
611
/////////////////////////////////////////////////////////////// getUMat -> GetMat ///////////////////////////////////////////////////////////////////
612
613
PARAM_TEST_CASE(getUMat, int, int, Size, bool)
614
{
615
int type;
616
Size size;
617
618
virtual void SetUp()
619
{
620
int depth = GET_PARAM(0);
621
int cn = GET_PARAM(1);
622
size = GET_PARAM(2);
623
useOpenCL = GET_PARAM(3);
624
625
type = CV_MAKE_TYPE(depth, cn);
626
627
isOpenCL_enabled = cv::ocl::useOpenCL();
628
cv::ocl::setUseOpenCL(useOpenCL);
629
}
630
631
virtual void TearDown()
632
{
633
cv::ocl::setUseOpenCL(isOpenCL_enabled);
634
}
635
636
// UMat created from user allocated host memory (USE_HOST_PTR)
637
void custom_ptr_test(size_t align_base, size_t align_offset)
638
{
639
void* pData_allocated = new unsigned char [size.area() * CV_ELEM_SIZE(type) + (align_base + align_offset)];
640
void* pData = (char*)alignPtr(pData_allocated, (int)align_base) + align_offset;
641
size_t step = size.width * CV_ELEM_SIZE(type);
642
643
{
644
Mat m = Mat(size, type, pData, step);
645
m.setTo(cv::Scalar::all(2));
646
647
UMat u = m.getUMat(ACCESS_RW);
648
cv::add(u, cv::Scalar::all(2), u);
649
650
Mat d = u.getMat(ACCESS_READ);
651
652
Mat expected(m.size(), m.type(), cv::Scalar::all(4));
653
double norm = cvtest::norm(d, expected, NORM_INF);
654
655
EXPECT_EQ(0, norm);
656
}
657
658
delete[] (unsigned char*)pData_allocated;
659
}
660
661
private:
662
bool useOpenCL;
663
bool isOpenCL_enabled;
664
};
665
666
TEST_P(getUMat, custom_ptr_align_4Kb)
667
{
668
custom_ptr_test(4096, 0);
669
}
670
671
TEST_P(getUMat, custom_ptr_align_64b)
672
{
673
custom_ptr_test(4096, 64);
674
}
675
676
TEST_P(getUMat, custom_ptr_align_none)
677
{
678
custom_ptr_test(4096, cv::alignSize(CV_ELEM_SIZE(type), 4));
679
}
680
681
TEST_P(getUMat, self_allocated)
682
{
683
Mat m = Mat(size, type);
684
m.setTo(cv::Scalar::all(2));
685
686
UMat u = m.getUMat(ACCESS_RW);
687
cv::add(u, cv::Scalar::all(2), u);
688
689
Mat d = u.getMat(ACCESS_READ);
690
691
Mat expected(m.size(), m.type(), cv::Scalar::all(4));
692
double norm = cvtest::norm(d, expected, NORM_INF);
693
694
EXPECT_EQ(0, norm);
695
}
696
697
INSTANTIATE_TEST_CASE_P(UMat, getUMat, Combine(
698
Values(CV_8U, CV_64F), // depth
699
Values(1, 3), // channels
700
Values(cv::Size(1, 1), cv::Size(255, 255), cv::Size(256, 256)), // Size
701
Bool() // useOpenCL
702
));
703
704
705
706
///////////////////////////////////////////////////////////////// OpenCL ////////////////////////////////////////////////////////////////////////////
707
708
#ifdef HAVE_OPENCL
709
TEST(UMat, BufferPoolGrowing)
710
{
711
#ifdef _DEBUG
712
const int ITERATIONS = 100;
713
#else
714
const int ITERATIONS = 200;
715
#endif
716
const Size sz(1920, 1080);
717
BufferPoolController* c = cv::ocl::getOpenCLAllocator()->getBufferPoolController();
718
if (c)
719
{
720
size_t oldMaxReservedSize = c->getMaxReservedSize();
721
c->freeAllReservedBuffers();
722
c->setMaxReservedSize(sz.area() * 10);
723
for (int i = 0; i < ITERATIONS; i++)
724
{
725
UMat um(Size(sz.width + i, sz.height + i), CV_8UC1);
726
UMat um2(Size(sz.width + 2 * i, sz.height + 2 * i), CV_8UC1);
727
}
728
c->setMaxReservedSize(oldMaxReservedSize);
729
c->freeAllReservedBuffers();
730
}
731
else
732
std::cout << "Skipped, no OpenCL" << std::endl;
733
}
734
#endif
735
736
class CV_UMatTest :
737
public cvtest::BaseTest
738
{
739
public:
740
CV_UMatTest() {}
741
~CV_UMatTest() {}
742
protected:
743
void run(int);
744
745
struct test_excep
746
{
747
test_excep(const string& _s=string("")) : s(_s) { }
748
string s;
749
};
750
751
bool TestUMat();
752
753
void checkDiff(const Mat& m1, const Mat& m2, const string& s)
754
{
755
if (cvtest::norm(m1, m2, NORM_INF) != 0)
756
throw test_excep(s);
757
}
758
void checkDiffF(const Mat& m1, const Mat& m2, const string& s)
759
{
760
if (cvtest::norm(m1, m2, NORM_INF) > 1e-5)
761
throw test_excep(s);
762
}
763
};
764
765
#define STR(a) STR2(a)
766
#define STR2(a) #a
767
768
#define CHECK_DIFF(a, b) checkDiff(a, b, "(" #a ") != (" #b ") at l." STR(__LINE__))
769
#define CHECK_DIFF_FLT(a, b) checkDiffF(a, b, "(" #a ") !=(eps) (" #b ") at l." STR(__LINE__))
770
771
772
bool CV_UMatTest::TestUMat()
773
{
774
try
775
{
776
Mat a(100, 100, CV_16SC2), b, c;
777
randu(a, Scalar::all(-100), Scalar::all(100));
778
Rect roi(1, 3, 5, 4);
779
Mat ra(a, roi), rb, rc, rc0;
780
UMat ua, ura, ub, urb, uc, urc;
781
a.copyTo(ua);
782
ua.copyTo(b);
783
CHECK_DIFF(a, b);
784
785
ura = ua(roi);
786
ura.copyTo(rb);
787
788
CHECK_DIFF(ra, rb);
789
790
ra += Scalar::all(1.f);
791
{
792
Mat temp = ura.getMat(ACCESS_RW);
793
temp += Scalar::all(1.f);
794
}
795
ra.copyTo(rb);
796
CHECK_DIFF(ra, rb);
797
798
b = a.clone();
799
ra = a(roi);
800
rb = b(roi);
801
randu(b, Scalar::all(-100), Scalar::all(100));
802
b.copyTo(ub);
803
urb = ub(roi);
804
805
/*std::cout << "==============================================\nbefore op (CPU):\n";
806
std::cout << "ra: " << ra << std::endl;
807
std::cout << "rb: " << rb << std::endl;*/
808
809
ra.copyTo(ura);
810
rb.copyTo(urb);
811
ra.release();
812
rb.release();
813
ura.copyTo(ra);
814
urb.copyTo(rb);
815
816
/*std::cout << "==============================================\nbefore op (GPU):\n";
817
std::cout << "ra: " << ra << std::endl;
818
std::cout << "rb: " << rb << std::endl;*/
819
820
cv::max(ra, rb, rc);
821
cv::max(ura, urb, urc);
822
urc.copyTo(rc0);
823
824
/*std::cout << "==============================================\nafter op:\n";
825
std::cout << "rc: " << rc << std::endl;
826
std::cout << "rc0: " << rc0 << std::endl;*/
827
828
CHECK_DIFF(rc0, rc);
829
830
{
831
UMat tmp = rc0.getUMat(ACCESS_WRITE);
832
cv::max(ura, urb, tmp);
833
}
834
CHECK_DIFF(rc0, rc);
835
836
ura.copyTo(urc);
837
cv::max(urc, urb, urc);
838
urc.copyTo(rc0);
839
CHECK_DIFF(rc0, rc);
840
841
rc = ra ^ rb;
842
cv::bitwise_xor(ura, urb, urc);
843
urc.copyTo(rc0);
844
845
/*std::cout << "==============================================\nafter op:\n";
846
std::cout << "ra: " << rc0 << std::endl;
847
std::cout << "rc: " << rc << std::endl;*/
848
849
CHECK_DIFF(rc0, rc);
850
851
rc = ra + rb;
852
cv::add(ura, urb, urc);
853
urc.copyTo(rc0);
854
855
CHECK_DIFF(rc0, rc);
856
857
cv::subtract(ra, Scalar::all(5), rc);
858
cv::subtract(ura, Scalar::all(5), urc);
859
urc.copyTo(rc0);
860
861
CHECK_DIFF(rc0, rc);
862
}
863
catch (const test_excep& e)
864
{
865
ts->printf(cvtest::TS::LOG, "%s\n", e.s.c_str());
866
ts->set_failed_test_info(cvtest::TS::FAIL_MISMATCH);
867
return false;
868
}
869
return true;
870
}
871
872
void CV_UMatTest::run( int /* start_from */)
873
{
874
printf("Use OpenCL: %s\nHave OpenCL: %s\n",
875
cv::ocl::useOpenCL() ? "TRUE" : "FALSE",
876
cv::ocl::haveOpenCL() ? "TRUE" : "FALSE" );
877
878
if (!TestUMat())
879
return;
880
881
ts->set_failed_test_info(cvtest::TS::OK);
882
}
883
884
TEST(Core_UMat, base) { CV_UMatTest test; test.safe_run(); }
885
886
TEST(Core_UMat, getUMat)
887
{
888
{
889
int a[3] = { 1, 2, 3 };
890
Mat m = Mat(1, 1, CV_32SC3, a);
891
UMat u = m.getUMat(ACCESS_READ);
892
EXPECT_NE((void*)NULL, u.u);
893
}
894
895
{
896
Mat m(10, 10, CV_8UC1), ref;
897
for (int y = 0; y < m.rows; ++y)
898
{
899
uchar * const ptr = m.ptr<uchar>(y);
900
for (int x = 0; x < m.cols; ++x)
901
ptr[x] = (uchar)(x + y * 2);
902
}
903
904
ref = m.clone();
905
Rect r(1, 1, 8, 8);
906
ref(r).setTo(17);
907
908
{
909
UMat um = m(r).getUMat(ACCESS_WRITE);
910
um.setTo(17);
911
}
912
913
double err = cvtest::norm(m, ref, NORM_INF);
914
if (err > 0)
915
{
916
std::cout << "m: " << std::endl << m << std::endl;
917
std::cout << "ref: " << std::endl << ref << std::endl;
918
}
919
EXPECT_EQ(0., err);
920
}
921
}
922
923
TEST(UMat, Sync)
924
{
925
UMat um(10, 10, CV_8UC1);
926
927
{
928
Mat m = um.getMat(ACCESS_WRITE);
929
m.setTo(cv::Scalar::all(17));
930
}
931
932
um.setTo(cv::Scalar::all(19));
933
934
EXPECT_EQ(0, cvtest::norm(um.getMat(ACCESS_READ), cv::Mat(um.size(), um.type(), 19), NORM_INF));
935
}
936
937
TEST(UMat, SyncTemp)
938
{
939
Mat m(10, 10, CV_8UC1);
940
941
{
942
UMat um = m.getUMat(ACCESS_WRITE);
943
944
{
945
Mat m2 = um.getMat(ACCESS_WRITE);
946
m2.setTo(cv::Scalar::all(17));
947
}
948
949
um.setTo(cv::Scalar::all(19));
950
951
EXPECT_EQ(0, cvtest::norm(um.getMat(ACCESS_READ), cv::Mat(um.size(), um.type(), 19), NORM_INF));
952
}
953
}
954
955
TEST(UMat, CopyToIfDeviceCopyIsObsolete)
956
{
957
UMat um(7, 2, CV_8UC1);
958
Mat m(um.size(), um.type());
959
m.setTo(Scalar::all(0));
960
961
{
962
// make obsolete device copy of UMat
963
Mat temp = um.getMat(ACCESS_WRITE);
964
temp.setTo(Scalar::all(10));
965
}
966
967
m.copyTo(um);
968
um.setTo(Scalar::all(17));
969
970
EXPECT_EQ(0, cvtest::norm(um.getMat(ACCESS_READ), Mat(um.size(), um.type(), 17), NORM_INF));
971
}
972
973
TEST(UMat, setOpenCL)
974
{
975
#ifndef HAVE_OPENCL
976
return; // test skipped
977
#else
978
// save the current state
979
bool useOCL = cv::ocl::useOpenCL();
980
981
Mat m = (Mat_<uchar>(3,3)<<0,1,2,3,4,5,6,7,8);
982
983
cv::ocl::setUseOpenCL(true);
984
UMat um1;
985
m.copyTo(um1);
986
987
cv::ocl::setUseOpenCL(false);
988
UMat um2;
989
m.copyTo(um2);
990
991
cv::ocl::setUseOpenCL(true);
992
countNonZero(um1);
993
countNonZero(um2);
994
995
um1.copyTo(um2);
996
EXPECT_MAT_NEAR(um1, um2, 0);
997
EXPECT_MAT_NEAR(um1, m, 0);
998
um2.copyTo(um1);
999
EXPECT_MAT_NEAR(um1, m, 0);
1000
EXPECT_MAT_NEAR(um1, um2, 0);
1001
1002
cv::ocl::setUseOpenCL(false);
1003
countNonZero(um1);
1004
countNonZero(um2);
1005
1006
um1.copyTo(um2);
1007
EXPECT_MAT_NEAR(um1, um2, 0);
1008
EXPECT_MAT_NEAR(um1, m, 0);
1009
um2.copyTo(um1);
1010
EXPECT_MAT_NEAR(um1, um2, 0);
1011
EXPECT_MAT_NEAR(um1, m, 0);
1012
1013
// reset state to the previous one
1014
cv::ocl::setUseOpenCL(useOCL);
1015
#endif
1016
}
1017
1018
TEST(UMat, ReadBufferRect)
1019
{
1020
UMat m(1, 10000, CV_32FC2, Scalar::all(-1));
1021
Mat t(1, 9000, CV_32FC2, Scalar::all(-200)), t2(1, 9000, CV_32FC2, Scalar::all(-1));
1022
m.colRange(0, 9000).copyTo(t);
1023
1024
EXPECT_MAT_NEAR(t, t2, 0);
1025
}
1026
1027
1028
// Use iGPU or OPENCV_OPENCL_DEVICE=:CPU: to catch problem
1029
TEST(UMat, synchronization_map_unmap)
1030
{
1031
class TestParallelLoopBody : public cv::ParallelLoopBody
1032
{
1033
UMat u_;
1034
public:
1035
TestParallelLoopBody(const UMat& u) : u_(u) { }
1036
void operator() (const cv::Range& range) const
1037
{
1038
printf("range: %d, %d -- begin\n", range.start, range.end);
1039
for (int i = 0; i < 10; i++)
1040
{
1041
printf("%d: %d map...\n", range.start, i);
1042
Mat m = u_.getMat(cv::ACCESS_READ);
1043
1044
printf("%d: %d unmap...\n", range.start, i);
1045
m.release();
1046
}
1047
printf("range: %d, %d -- end\n", range.start, range.end);
1048
}
1049
};
1050
try
1051
{
1052
UMat u(1000, 1000, CV_32FC1, Scalar::all(0));
1053
parallel_for_(cv::Range(0, 2), TestParallelLoopBody(u));
1054
}
1055
catch (const cv::Exception& e)
1056
{
1057
FAIL() << "Exception: " << e.what();
1058
ADD_FAILURE();
1059
}
1060
catch (...)
1061
{
1062
FAIL() << "Exception!";
1063
}
1064
}
1065
1066
1067
TEST(UMat, async_unmap)
1068
{
1069
for (int i = 0; i < 20; i++)
1070
{
1071
try
1072
{
1073
Mat m = Mat(1000, 1000, CV_8UC1, Scalar::all(0));
1074
UMat u = m.getUMat(ACCESS_READ);
1075
UMat dst;
1076
cv::add(u, Scalar::all(0), dst); // start async operation
1077
u.release();
1078
m.release();
1079
}
1080
catch (const cv::Exception& e)
1081
{
1082
printf("i = %d... %s\n", i, e.what());
1083
ADD_FAILURE();
1084
}
1085
catch (...)
1086
{
1087
printf("i = %d...\n", i);
1088
ADD_FAILURE();
1089
}
1090
}
1091
}
1092
1093
1094
TEST(UMat, unmap_in_class)
1095
{
1096
class Logic
1097
{
1098
public:
1099
Logic() {}
1100
void processData(InputArray input)
1101
{
1102
Mat m = input.getMat();
1103
{
1104
Mat dst;
1105
m.convertTo(dst, CV_32FC1);
1106
// some additional CPU-based per-pixel processing into dst
1107
intermediateResult = dst.getUMat(ACCESS_READ); // this violates lifetime of base(dst) / derived (intermediateResult) objects. Use copyTo?
1108
std::cout << "data processed..." << std::endl;
1109
} // problem is here: dst::~Mat()
1110
std::cout << "leave ProcessData()" << std::endl;
1111
}
1112
UMat getResult() const { return intermediateResult; }
1113
protected:
1114
UMat intermediateResult;
1115
};
1116
try
1117
{
1118
Mat m = Mat(1000, 1000, CV_8UC1, Scalar::all(0));
1119
Logic l;
1120
l.processData(m);
1121
UMat result = l.getResult();
1122
}
1123
catch (const cv::Exception& e)
1124
{
1125
printf("exception... %s\n", e.what());
1126
ADD_FAILURE();
1127
}
1128
catch (...)
1129
{
1130
printf("exception... \n");
1131
ADD_FAILURE();
1132
}
1133
}
1134
1135
1136
TEST(UMat, map_unmap_counting)
1137
{
1138
if (!cv::ocl::useOpenCL())
1139
{
1140
std::cout << "OpenCL is not enabled. Skip test" << std::endl;
1141
return;
1142
}
1143
std::cout << "Host memory: " << cv::ocl::Device::getDefault().hostUnifiedMemory() << std::endl;
1144
Mat m(Size(10, 10), CV_8UC1, Scalar::all(0));
1145
UMat um = m.getUMat(ACCESS_RW);
1146
{
1147
Mat d1 = um.getMat(ACCESS_RW);
1148
Mat d2 = um.getMat(ACCESS_RW);
1149
d1.release();
1150
}
1151
void* h = NULL;
1152
EXPECT_NO_THROW(h = um.handle(ACCESS_RW));
1153
std::cout << "Handle: " << h << std::endl;
1154
}
1155
1156
1157
///////////// oclCleanupCallback threadsafe check (#5062) /////////////////////
1158
1159
// Case 1: reuse of old src Mat in OCL pipe. Hard to catch!
1160
OCL_TEST(UMat, DISABLED_OCL_ThreadSafe_CleanupCallback_1_VeryLongTest)
1161
{
1162
if (!cv::ocl::useOpenCL())
1163
{
1164
std::cout << "OpenCL is not enabled. Skip test" << std::endl;
1165
return;
1166
}
1167
for (int j = 0; j < 100; j++)
1168
{
1169
const Size srcSize(320, 240);
1170
const int type = CV_8UC1;
1171
const int dtype = CV_16UC1;
1172
1173
Mat src(srcSize, type, Scalar::all(0));
1174
Mat dst_ref(srcSize, dtype);
1175
1176
// Generate reference data as additional check
1177
OCL_OFF(src.convertTo(dst_ref, dtype));
1178
cv::ocl::setUseOpenCL(true); // restore OpenCL state
1179
1180
UMat dst(srcSize, dtype);
1181
1182
// Use multiple iterations to increase chance of data race catching
1183
for(int k = 0; k < 10000; k++)
1184
{
1185
UMat tmpUMat = src.getUMat(ACCESS_RW);
1186
tmpUMat.convertTo(dst, dtype);
1187
::cv::ocl::finish(); // force kernel to complete to start cleanup sooner
1188
}
1189
1190
EXPECT_MAT_NEAR(dst_ref, dst, 1);
1191
printf(".\n"); fflush(stdout);
1192
}
1193
}
1194
1195
// Case 2: concurrent deallocation of UMatData between UMat and Mat deallocators. Hard to catch!
1196
OCL_TEST(UMat, DISABLED_OCL_ThreadSafe_CleanupCallback_2_VeryLongTest)
1197
{
1198
if (!cv::ocl::useOpenCL())
1199
{
1200
std::cout << "OpenCL is not enabled. Skip test" << std::endl;
1201
return;
1202
}
1203
for (int j = 0; j < 100; j++)
1204
{
1205
const Size srcSize(320, 240);
1206
const int type = CV_8UC1;
1207
const int dtype = CV_16UC1;
1208
1209
// This test is only relevant for OCL
1210
UMat dst(srcSize, dtype);
1211
1212
// Use multiple iterations to increase chance of data race catching
1213
for(int k = 0; k < 10000; k++)
1214
{
1215
Mat src(srcSize, type, Scalar::all(0)); // Declare src inside loop now to catch its destruction on stack
1216
{
1217
UMat tmpUMat = src.getUMat(ACCESS_RW);
1218
tmpUMat.convertTo(dst, dtype);
1219
}
1220
::cv::ocl::finish(); // force kernel to complete to start cleanup sooner
1221
}
1222
printf(".\n"); fflush(stdout);
1223
}
1224
}
1225
1226
1227
1228
TEST(UMat, DISABLED_Test_same_behaviour_read_and_read)
1229
{
1230
bool exceptionDetected = false;
1231
try
1232
{
1233
UMat u(Size(10, 10), CV_8UC1, Scalar::all(0));
1234
Mat m = u.getMat(ACCESS_READ);
1235
UMat dst;
1236
cv::add(u, Scalar::all(1), dst);
1237
}
1238
catch (...)
1239
{
1240
exceptionDetected = true;
1241
}
1242
ASSERT_FALSE(exceptionDetected); // no data race, 2+ reads are valid
1243
}
1244
1245
// VP: this test (and probably others from same_behaviour series) is not valid in my opinion.
1246
TEST(UMat, DISABLED_Test_same_behaviour_read_and_write)
1247
{
1248
bool exceptionDetected = false;
1249
try
1250
{
1251
UMat u(Size(10, 10), CV_8UC1, Scalar::all(0));
1252
Mat m = u.getMat(ACCESS_READ);
1253
cv::add(u, Scalar::all(1), u);
1254
}
1255
catch (...)
1256
{
1257
exceptionDetected = true;
1258
}
1259
ASSERT_TRUE(exceptionDetected); // data race
1260
}
1261
1262
TEST(UMat, DISABLED_Test_same_behaviour_write_and_read)
1263
{
1264
bool exceptionDetected = false;
1265
try
1266
{
1267
UMat u(Size(10, 10), CV_8UC1, Scalar::all(0));
1268
Mat m = u.getMat(ACCESS_WRITE);
1269
UMat dst;
1270
cv::add(u, Scalar::all(1), dst);
1271
}
1272
catch (...)
1273
{
1274
exceptionDetected = true;
1275
}
1276
ASSERT_TRUE(exceptionDetected); // data race
1277
}
1278
1279
TEST(UMat, DISABLED_Test_same_behaviour_write_and_write)
1280
{
1281
bool exceptionDetected = false;
1282
try
1283
{
1284
UMat u(Size(10, 10), CV_8UC1, Scalar::all(0));
1285
Mat m = u.getMat(ACCESS_WRITE);
1286
cv::add(u, Scalar::all(1), u);
1287
}
1288
catch (...)
1289
{
1290
exceptionDetected = true;
1291
}
1292
ASSERT_TRUE(exceptionDetected); // data race
1293
}
1294
1295
TEST(UMat, mat_umat_sync)
1296
{
1297
UMat u(10, 10, CV_8UC1, Scalar(1));
1298
{
1299
Mat m = u.getMat(ACCESS_RW).reshape(1);
1300
m.setTo(Scalar(255));
1301
}
1302
1303
UMat uDiff;
1304
cv::compare(u, 255, uDiff, CMP_NE);
1305
ASSERT_EQ(0, countNonZero(uDiff));
1306
}
1307
1308
TEST(UMat, testTempObjects_UMat)
1309
{
1310
UMat u(10, 10, CV_8UC1, Scalar(1));
1311
{
1312
UMat u2 = u.getMat(ACCESS_RW).getUMat(ACCESS_RW);
1313
u2.setTo(Scalar(255));
1314
}
1315
1316
UMat uDiff;
1317
cv::compare(u, 255, uDiff, CMP_NE);
1318
ASSERT_EQ(0, countNonZero(uDiff));
1319
}
1320
1321
TEST(UMat, testTempObjects_Mat)
1322
{
1323
Mat m(10, 10, CV_8UC1, Scalar(1));
1324
{
1325
Mat m2;
1326
ASSERT_ANY_THROW({
1327
// Below is unwrapped version of this invalid expression:
1328
// m2 = m.getUMat(ACCESS_RW).getMat(ACCESS_RW)
1329
UMat u = m.getUMat(ACCESS_RW);
1330
m2 = u.getMat(ACCESS_RW);
1331
u.release();
1332
});
1333
}
1334
}
1335
1336
TEST(UMat, testWrongLifetime_UMat)
1337
{
1338
UMat u(10, 10, CV_8UC1, Scalar(1));
1339
{
1340
UMat u2 = u.getMat(ACCESS_RW).getUMat(ACCESS_RW);
1341
u.release(); // base object
1342
u2.release(); // derived object, should show warning message
1343
}
1344
}
1345
1346
TEST(UMat, testWrongLifetime_Mat)
1347
{
1348
Mat m(10, 10, CV_8UC1, Scalar(1));
1349
{
1350
UMat u = m.getUMat(ACCESS_RW);
1351
Mat m2 = u.getMat(ACCESS_RW);
1352
m.release(); // base object
1353
m2.release(); // map of derived object
1354
u.release(); // derived object, should show warning message
1355
}
1356
}
1357
1358
TEST(UMat, DISABLED_regression_5991)
1359
{
1360
int sz[] = {2,3,2};
1361
UMat mat(3, sz, CV_32F, Scalar(1));
1362
ASSERT_NO_THROW(mat.convertTo(mat, CV_8U));
1363
EXPECT_EQ(sz[0], mat.size[0]);
1364
EXPECT_EQ(sz[1], mat.size[1]);
1365
EXPECT_EQ(sz[2], mat.size[2]);
1366
EXPECT_EQ(0, cvtest::norm(mat.getMat(ACCESS_READ), Mat(3, sz, CV_8U, Scalar(1)), NORM_INF));
1367
}
1368
1369
TEST(UMat, testTempObjects_Mat_issue_8693)
1370
{
1371
UMat srcUMat(3, 4, CV_32FC1);
1372
Mat srcMat;
1373
1374
randu(srcUMat, -1.f, 1.f);
1375
srcUMat.copyTo(srcMat);
1376
1377
reduce(srcUMat, srcUMat, 0, CV_REDUCE_SUM);
1378
reduce(srcMat, srcMat, 0, CV_REDUCE_SUM);
1379
1380
srcUMat.convertTo(srcUMat, CV_64FC1);
1381
srcMat.convertTo(srcMat, CV_64FC1);
1382
1383
EXPECT_EQ(0, cvtest::norm(srcUMat.getMat(ACCESS_READ), srcMat, NORM_INF));
1384
}
1385
1386
} } // namespace opencv_test::ocl
1387
1388