Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/modules/core/test/test_io.cpp
16337 views
1
// This file is part of OpenCV project.
2
// It is subject to the license terms in the LICENSE file found in the top-level directory
3
// of this distribution and at http://opencv.org/license.html.
4
#include "test_precomp.hpp"
5
6
namespace opencv_test { namespace {
7
8
static SparseMat cvTsGetRandomSparseMat(int dims, const int* sz, int type,
9
int nzcount, double a, double b, RNG& rng)
10
{
11
SparseMat m(dims, sz, type);
12
int i, j;
13
CV_Assert(CV_MAT_CN(type) == 1);
14
for( i = 0; i < nzcount; i++ )
15
{
16
int idx[CV_MAX_DIM];
17
for( j = 0; j < dims; j++ )
18
idx[j] = cvtest::randInt(rng) % sz[j];
19
double val = cvtest::randReal(rng)*(b - a) + a;
20
uchar* ptr = m.ptr(idx, true, 0);
21
if( type == CV_8U )
22
*(uchar*)ptr = saturate_cast<uchar>(val);
23
else if( type == CV_8S )
24
*(schar*)ptr = saturate_cast<schar>(val);
25
else if( type == CV_16U )
26
*(ushort*)ptr = saturate_cast<ushort>(val);
27
else if( type == CV_16S )
28
*(short*)ptr = saturate_cast<short>(val);
29
else if( type == CV_32S )
30
*(int*)ptr = saturate_cast<int>(val);
31
else if( type == CV_32F )
32
*(float*)ptr = saturate_cast<float>(val);
33
else
34
*(double*)ptr = saturate_cast<double>(val);
35
}
36
37
return m;
38
}
39
40
static bool cvTsCheckSparse(const CvSparseMat* m1, const CvSparseMat* m2, double eps)
41
{
42
CvSparseMatIterator it1;
43
CvSparseNode* node1;
44
int depth = CV_MAT_DEPTH(m1->type);
45
46
if( m1->heap->active_count != m2->heap->active_count ||
47
m1->dims != m2->dims || CV_MAT_TYPE(m1->type) != CV_MAT_TYPE(m2->type) )
48
return false;
49
50
for( node1 = cvInitSparseMatIterator( m1, &it1 );
51
node1 != 0; node1 = cvGetNextSparseNode( &it1 ))
52
{
53
uchar* v1 = (uchar*)CV_NODE_VAL(m1,node1);
54
uchar* v2 = cvPtrND( m2, CV_NODE_IDX(m1,node1), 0, 0, &node1->hashval );
55
if( !v2 )
56
return false;
57
if( depth == CV_8U || depth == CV_8S )
58
{
59
if( *v1 != *v2 )
60
return false;
61
}
62
else if( depth == CV_16U || depth == CV_16S )
63
{
64
if( *(ushort*)v1 != *(ushort*)v2 )
65
return false;
66
}
67
else if( depth == CV_32S )
68
{
69
if( *(int*)v1 != *(int*)v2 )
70
return false;
71
}
72
else if( depth == CV_32F )
73
{
74
if( fabs(*(float*)v1 - *(float*)v2) > eps*(fabs(*(float*)v2) + 1) )
75
return false;
76
}
77
else if( fabs(*(double*)v1 - *(double*)v2) > eps*(fabs(*(double*)v2) + 1) )
78
return false;
79
}
80
81
return true;
82
}
83
84
85
class Core_IOTest : public cvtest::BaseTest
86
{
87
public:
88
Core_IOTest() { }
89
protected:
90
void run(int)
91
{
92
double ranges[][2] = {{0, 256}, {-128, 128}, {0, 65536}, {-32768, 32768},
93
{-1000000, 1000000}, {-10, 10}, {-10, 10}};
94
RNG& rng = ts->get_rng();
95
RNG rng0;
96
int progress = 0;
97
MemStorage storage(cvCreateMemStorage(0));
98
const char * suffixs[3] = {".yml", ".xml", ".json" };
99
test_case_count = 6;
100
101
for( int idx = 0; idx < test_case_count; idx++ )
102
{
103
ts->update_context( this, idx, false );
104
progress = update_progress( progress, idx, test_case_count, 0 );
105
106
cvClearMemStorage(storage);
107
108
bool mem = (idx % test_case_count) >= (test_case_count >> 1);
109
string filename = tempfile(suffixs[idx % (test_case_count >> 1)]);
110
111
FileStorage fs(filename, FileStorage::WRITE + (mem ? FileStorage::MEMORY : 0));
112
113
int test_int = (int)cvtest::randInt(rng);
114
double test_real = (cvtest::randInt(rng)%2?1:-1)*exp(cvtest::randReal(rng)*18-9);
115
string test_string = "vw wv23424rt\"&amp;&lt;&gt;&amp;&apos;@#$@$%$%&%IJUKYILFD@#$@%$&*&() ";
116
117
int depth = cvtest::randInt(rng) % (CV_64F+1);
118
int cn = cvtest::randInt(rng) % 4 + 1;
119
Mat test_mat(cvtest::randInt(rng)%30+1, cvtest::randInt(rng)%30+1, CV_MAKETYPE(depth, cn));
120
121
rng0.fill(test_mat, CV_RAND_UNI, Scalar::all(ranges[depth][0]), Scalar::all(ranges[depth][1]));
122
if( depth >= CV_32F )
123
{
124
exp(test_mat, test_mat);
125
Mat test_mat_scale(test_mat.size(), test_mat.type());
126
rng0.fill(test_mat_scale, CV_RAND_UNI, Scalar::all(-1), Scalar::all(1));
127
cv::multiply(test_mat, test_mat_scale, test_mat);
128
}
129
130
CvSeq* seq = cvCreateSeq(test_mat.type(), (int)sizeof(CvSeq),
131
(int)test_mat.elemSize(), storage);
132
cvSeqPushMulti(seq, test_mat.ptr(), test_mat.cols*test_mat.rows);
133
134
CvGraph* graph = cvCreateGraph( CV_ORIENTED_GRAPH,
135
sizeof(CvGraph), sizeof(CvGraphVtx),
136
sizeof(CvGraphEdge), storage );
137
int edges[][2] = {{0,1},{1,2},{2,0},{0,3},{3,4},{4,1}};
138
int i, vcount = 5, ecount = 6;
139
for( i = 0; i < vcount; i++ )
140
cvGraphAddVtx(graph);
141
for( i = 0; i < ecount; i++ )
142
{
143
CvGraphEdge* edge;
144
cvGraphAddEdge(graph, edges[i][0], edges[i][1], 0, &edge);
145
edge->weight = (float)(i+1);
146
}
147
148
depth = cvtest::randInt(rng) % (CV_64F+1);
149
cn = cvtest::randInt(rng) % 4 + 1;
150
int sz[] = {
151
static_cast<int>(cvtest::randInt(rng)%10+1),
152
static_cast<int>(cvtest::randInt(rng)%10+1),
153
static_cast<int>(cvtest::randInt(rng)%10+1),
154
};
155
MatND test_mat_nd(3, sz, CV_MAKETYPE(depth, cn));
156
157
rng0.fill(test_mat_nd, CV_RAND_UNI, Scalar::all(ranges[depth][0]), Scalar::all(ranges[depth][1]));
158
if( depth >= CV_32F )
159
{
160
exp(test_mat_nd, test_mat_nd);
161
MatND test_mat_scale(test_mat_nd.dims, test_mat_nd.size, test_mat_nd.type());
162
rng0.fill(test_mat_scale, CV_RAND_UNI, Scalar::all(-1), Scalar::all(1));
163
cv::multiply(test_mat_nd, test_mat_scale, test_mat_nd);
164
}
165
166
int ssz[] = {
167
static_cast<int>(cvtest::randInt(rng)%10+1),
168
static_cast<int>(cvtest::randInt(rng)%10+1),
169
static_cast<int>(cvtest::randInt(rng)%10+1),
170
static_cast<int>(cvtest::randInt(rng)%10+1),
171
};
172
SparseMat test_sparse_mat = cvTsGetRandomSparseMat(4, ssz, cvtest::randInt(rng)%(CV_64F+1),
173
cvtest::randInt(rng) % 10000, 0, 100, rng);
174
175
fs << "test_int" << test_int << "test_real" << test_real << "test_string" << test_string;
176
fs << "test_mat" << test_mat;
177
fs << "test_mat_nd" << test_mat_nd;
178
fs << "test_sparse_mat" << test_sparse_mat;
179
180
fs << "test_list" << "[" << 0.0000000000001 << 2 << CV_PI << -3435345 << "2-502 2-029 3egegeg" <<
181
"{:" << "month" << 12 << "day" << 31 << "year" << 1969 << "}" << "]";
182
fs << "test_map" << "{" << "x" << 1 << "y" << 2 << "width" << 100 << "height" << 200 << "lbp" << "[:";
183
184
const uchar arr[] = {0, 1, 1, 0, 1, 1, 0, 1};
185
fs.writeRaw("u", arr, (int)(sizeof(arr)/sizeof(arr[0])));
186
187
fs << "]" << "}";
188
cvWriteComment(*fs, "test comment", 0);
189
190
fs.writeObj("test_seq", seq);
191
fs.writeObj("test_graph",graph);
192
CvGraph* graph2 = (CvGraph*)cvClone(graph);
193
194
string content = fs.releaseAndGetString();
195
196
if(!fs.open(mem ? content : filename, FileStorage::READ + (mem ? FileStorage::MEMORY : 0)))
197
{
198
ts->printf( cvtest::TS::LOG, "filename %s can not be read\n", !mem ? filename.c_str() : content.c_str());
199
ts->set_failed_test_info( cvtest::TS::FAIL_MISSING_TEST_DATA );
200
return;
201
}
202
203
int real_int = (int)fs["test_int"];
204
double real_real = (double)fs["test_real"];
205
String real_string = (String)fs["test_string"];
206
207
if( real_int != test_int ||
208
fabs(real_real - test_real) > DBL_EPSILON*(fabs(test_real)+1) ||
209
real_string != test_string )
210
{
211
ts->printf( cvtest::TS::LOG, "the read scalars are not correct\n" );
212
ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_OUTPUT );
213
return;
214
}
215
216
CvMat* m = (CvMat*)fs["test_mat"].readObj();
217
CvMat _test_mat = cvMat(test_mat);
218
double max_diff = 0;
219
CvMat stub1, _test_stub1;
220
cvReshape(m, &stub1, 1, 0);
221
cvReshape(&_test_mat, &_test_stub1, 1, 0);
222
vector<int> pt;
223
224
if( !m || !CV_IS_MAT(m) || m->rows != test_mat.rows || m->cols != test_mat.cols ||
225
cvtest::cmpEps( cv::cvarrToMat(&stub1), cv::cvarrToMat(&_test_stub1), &max_diff, 0, &pt, true) < 0 )
226
{
227
ts->printf( cvtest::TS::LOG, "the read matrix is not correct: (%.20g vs %.20g) at (%d,%d)\n",
228
cvGetReal2D(&stub1, pt[0], pt[1]), cvGetReal2D(&_test_stub1, pt[0], pt[1]),
229
pt[0], pt[1] );
230
ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_OUTPUT );
231
return;
232
}
233
if( m && CV_IS_MAT(m))
234
cvReleaseMat(&m);
235
236
CvMatND* m_nd = (CvMatND*)fs["test_mat_nd"].readObj();
237
CvMatND _test_mat_nd = cvMatND(test_mat_nd);
238
239
if( !m_nd || !CV_IS_MATND(m_nd) )
240
{
241
ts->printf( cvtest::TS::LOG, "the read nd-matrix is not correct\n" );
242
ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_OUTPUT );
243
return;
244
}
245
246
CvMat stub, _test_stub;
247
cvGetMat(m_nd, &stub, 0, 1);
248
cvGetMat(&_test_mat_nd, &_test_stub, 0, 1);
249
cvReshape(&stub, &stub1, 1, 0);
250
cvReshape(&_test_stub, &_test_stub1, 1, 0);
251
252
if( !CV_ARE_TYPES_EQ(&stub, &_test_stub) ||
253
!CV_ARE_SIZES_EQ(&stub, &_test_stub) ||
254
//cvNorm(&stub, &_test_stub, CV_L2) != 0 )
255
cvtest::cmpEps( cv::cvarrToMat(&stub1), cv::cvarrToMat(&_test_stub1), &max_diff, 0, &pt, true) < 0 )
256
{
257
ts->printf( cvtest::TS::LOG, "readObj method: the read nd matrix is not correct: (%.20g vs %.20g) vs at (%d,%d)\n",
258
cvGetReal2D(&stub1, pt[0], pt[1]), cvGetReal2D(&_test_stub1, pt[0], pt[1]),
259
pt[0], pt[1] );
260
ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_OUTPUT );
261
return;
262
}
263
264
MatND mat_nd2;
265
fs["test_mat_nd"] >> mat_nd2;
266
CvMatND m_nd2 = cvMatND(mat_nd2);
267
cvGetMat(&m_nd2, &stub, 0, 1);
268
cvReshape(&stub, &stub1, 1, 0);
269
270
if( !CV_ARE_TYPES_EQ(&stub, &_test_stub) ||
271
!CV_ARE_SIZES_EQ(&stub, &_test_stub) ||
272
//cvNorm(&stub, &_test_stub, CV_L2) != 0 )
273
cvtest::cmpEps( cv::cvarrToMat(&stub1), cv::cvarrToMat(&_test_stub1), &max_diff, 0, &pt, true) < 0 )
274
{
275
ts->printf( cvtest::TS::LOG, "C++ method: the read nd matrix is not correct: (%.20g vs %.20g) vs at (%d,%d)\n",
276
cvGetReal2D(&stub1, pt[0], pt[1]), cvGetReal2D(&_test_stub1, pt[1], pt[0]),
277
pt[0], pt[1] );
278
ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_OUTPUT );
279
return;
280
}
281
282
cvRelease((void**)&m_nd);
283
284
Ptr<CvSparseMat> m_s((CvSparseMat*)fs["test_sparse_mat"].readObj());
285
Ptr<CvSparseMat> _test_sparse_(cvCreateSparseMat(test_sparse_mat));
286
Ptr<CvSparseMat> _test_sparse((CvSparseMat*)cvClone(_test_sparse_));
287
SparseMat m_s2;
288
fs["test_sparse_mat"] >> m_s2;
289
Ptr<CvSparseMat> _m_s2(cvCreateSparseMat(m_s2));
290
291
if( !m_s || !CV_IS_SPARSE_MAT(m_s.get()) ||
292
!cvTsCheckSparse(m_s.get(), _test_sparse.get(), 0) ||
293
!cvTsCheckSparse(_m_s2.get(), _test_sparse.get(), 0))
294
{
295
ts->printf( cvtest::TS::LOG, "the read sparse matrix is not correct\n" );
296
ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_OUTPUT );
297
return;
298
}
299
300
FileNode tl = fs["test_list"];
301
if( tl.type() != FileNode::SEQ || tl.size() != 6 ||
302
fabs((double)tl[0] - 0.0000000000001) >= DBL_EPSILON ||
303
(int)tl[1] != 2 ||
304
fabs((double)tl[2] - CV_PI) >= DBL_EPSILON ||
305
(int)tl[3] != -3435345 ||
306
(String)tl[4] != "2-502 2-029 3egegeg" ||
307
tl[5].type() != FileNode::MAP || tl[5].size() != 3 ||
308
(int)tl[5]["month"] != 12 ||
309
(int)tl[5]["day"] != 31 ||
310
(int)tl[5]["year"] != 1969 )
311
{
312
ts->printf( cvtest::TS::LOG, "the test list is incorrect\n" );
313
ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_OUTPUT );
314
return;
315
}
316
317
FileNode tm = fs["test_map"];
318
FileNode tm_lbp = tm["lbp"];
319
320
int real_x = (int)tm["x"];
321
int real_y = (int)tm["y"];
322
int real_width = (int)tm["width"];
323
int real_height = (int)tm["height"];
324
325
int real_lbp_val = 0;
326
FileNodeIterator it;
327
it = tm_lbp.begin();
328
real_lbp_val |= (int)*it << 0;
329
++it;
330
real_lbp_val |= (int)*it << 1;
331
it++;
332
real_lbp_val |= (int)*it << 2;
333
it += 1;
334
real_lbp_val |= (int)*it << 3;
335
FileNodeIterator it2(it);
336
it2 += 4;
337
real_lbp_val |= (int)*it2 << 7;
338
--it2;
339
real_lbp_val |= (int)*it2 << 6;
340
it2--;
341
real_lbp_val |= (int)*it2 << 5;
342
it2 -= 1;
343
real_lbp_val |= (int)*it2 << 4;
344
it2 += -1;
345
CV_Assert( it == it2 );
346
347
if( tm.type() != FileNode::MAP || tm.size() != 5 ||
348
real_x != 1 ||
349
real_y != 2 ||
350
real_width != 100 ||
351
real_height != 200 ||
352
tm_lbp.type() != FileNode::SEQ ||
353
tm_lbp.size() != 8 ||
354
real_lbp_val != 0xb6 )
355
{
356
ts->printf( cvtest::TS::LOG, "the test map is incorrect\n" );
357
ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_OUTPUT );
358
return;
359
}
360
361
CvGraph* graph3 = (CvGraph*)fs["test_graph"].readObj();
362
if(graph2->active_count != vcount || graph3->active_count != vcount ||
363
graph2->edges->active_count != ecount || graph3->edges->active_count != ecount)
364
{
365
ts->printf( cvtest::TS::LOG, "the cloned or read graph have wrong number of vertices or edges\n" );
366
ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_OUTPUT );
367
return;
368
}
369
370
for( i = 0; i < ecount; i++ )
371
{
372
CvGraphEdge* edge2 = cvFindGraphEdge(graph2, edges[i][0], edges[i][1]);
373
CvGraphEdge* edge3 = cvFindGraphEdge(graph3, edges[i][0], edges[i][1]);
374
if( !edge2 || edge2->weight != (float)(i+1) ||
375
!edge3 || edge3->weight != (float)(i+1) )
376
{
377
ts->printf( cvtest::TS::LOG, "the cloned or read graph do not have the edge (%d, %d)\n", edges[i][0], edges[i][1] );
378
ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_OUTPUT );
379
return;
380
}
381
}
382
383
fs.release();
384
if( !mem )
385
remove(filename.c_str());
386
}
387
}
388
};
389
390
TEST(Core_InputOutput, write_read_consistency) { Core_IOTest test; test.safe_run(); }
391
392
393
struct UserDefinedType
394
{
395
int a;
396
float b;
397
};
398
399
static inline bool operator==(const UserDefinedType &x,
400
const UserDefinedType &y) {
401
return (x.a == y.a) && (x.b == y.b);
402
}
403
404
static inline void write(FileStorage &fs,
405
const String&,
406
const UserDefinedType &value)
407
{
408
fs << "{:" << "a" << value.a << "b" << value.b << "}";
409
}
410
411
static inline void read(const FileNode& node,
412
UserDefinedType& value,
413
const UserDefinedType& default_value
414
= UserDefinedType()) {
415
if(node.empty())
416
{
417
value = default_value;
418
}
419
else
420
{
421
node["a"] >> value.a;
422
node["b"] >> value.b;
423
}
424
}
425
426
class CV_MiscIOTest : public cvtest::BaseTest
427
{
428
public:
429
CV_MiscIOTest() {}
430
~CV_MiscIOTest() {}
431
protected:
432
void run(int)
433
{
434
const char * suffix[3] = {
435
".yml",
436
".xml",
437
".json"
438
};
439
440
for ( size_t i = 0u; i < 3u; i++ )
441
{
442
try
443
{
444
string fname = cv::tempfile(suffix[i]);
445
vector<int> mi, mi2, mi3, mi4;
446
vector<Mat> mv, mv2, mv3, mv4;
447
vector<UserDefinedType> vudt, vudt2, vudt3, vudt4;
448
Mat m(10, 9, CV_32F);
449
Mat empty;
450
UserDefinedType udt = { 8, 3.3f };
451
randu(m, 0, 1);
452
mi3.push_back(5);
453
mv3.push_back(m);
454
vudt3.push_back(udt);
455
Point_<float> p1(1.1f, 2.2f), op1;
456
Point3i p2(3, 4, 5), op2;
457
Size s1(6, 7), os1;
458
Complex<int> c1(9, 10), oc1;
459
Rect r1(11, 12, 13, 14), or1;
460
Vec<int, 5> v1(15, 16, 17, 18, 19), ov1;
461
Scalar sc1(20.0, 21.1, 22.2, 23.3), osc1;
462
Range g1(7, 8), og1;
463
464
FileStorage fs(fname, FileStorage::WRITE);
465
fs << "mi" << mi;
466
fs << "mv" << mv;
467
fs << "mi3" << mi3;
468
fs << "mv3" << mv3;
469
fs << "vudt" << vudt;
470
fs << "vudt3" << vudt3;
471
fs << "empty" << empty;
472
fs << "p1" << p1;
473
fs << "p2" << p2;
474
fs << "s1" << s1;
475
fs << "c1" << c1;
476
fs << "r1" << r1;
477
fs << "v1" << v1;
478
fs << "sc1" << sc1;
479
fs << "g1" << g1;
480
fs.release();
481
482
fs.open(fname, FileStorage::READ);
483
fs["mi"] >> mi2;
484
fs["mv"] >> mv2;
485
fs["mi3"] >> mi4;
486
fs["mv3"] >> mv4;
487
fs["vudt"] >> vudt2;
488
fs["vudt3"] >> vudt4;
489
fs["empty"] >> empty;
490
fs["p1"] >> op1;
491
fs["p2"] >> op2;
492
fs["s1"] >> os1;
493
fs["c1"] >> oc1;
494
fs["r1"] >> or1;
495
fs["v1"] >> ov1;
496
fs["sc1"] >> osc1;
497
fs["g1"] >> og1;
498
CV_Assert( mi2.empty() );
499
CV_Assert( mv2.empty() );
500
CV_Assert( cvtest::norm(Mat(mi3), Mat(mi4), CV_C) == 0 );
501
CV_Assert( mv4.size() == 1 );
502
double n = cvtest::norm(mv3[0], mv4[0], CV_C);
503
CV_Assert( vudt2.empty() );
504
CV_Assert( vudt3 == vudt4 );
505
CV_Assert( n == 0 );
506
CV_Assert( op1 == p1 );
507
CV_Assert( op2 == p2 );
508
CV_Assert( os1 == s1 );
509
CV_Assert( oc1 == c1 );
510
CV_Assert( or1 == r1 );
511
CV_Assert( ov1 == v1 );
512
CV_Assert( osc1 == sc1 );
513
CV_Assert( og1 == g1 );
514
}
515
catch(...)
516
{
517
ts->set_failed_test_info(cvtest::TS::FAIL_MISMATCH);
518
}
519
}
520
}
521
};
522
523
TEST(Core_InputOutput, misc) { CV_MiscIOTest test; test.safe_run(); }
524
525
#if 0 // 4+ GB of data, 40+ GB of estimated result size, it is very slow
526
BIGDATA_TEST(Core_InputOutput, huge)
527
{
528
RNG& rng = theRNG();
529
int N = 1000, M = 1200000;
530
std::cout << "Allocating..." << std::endl;
531
Mat mat(M, N, CV_32F);
532
std::cout << "Initializing..." << std::endl;
533
rng.fill(mat, RNG::UNIFORM, 0, 1);
534
std::cout << "Writing..." << std::endl;
535
{
536
FileStorage fs(cv::tempfile(".xml"), FileStorage::WRITE);
537
fs << "mat" << mat;
538
fs.release();
539
}
540
}
541
#endif
542
543
TEST(Core_globbing, accuracy)
544
{
545
std::string patternLena = cvtest::TS::ptr()->get_data_path() + "lena*.*";
546
std::string patternLenaPng = cvtest::TS::ptr()->get_data_path() + "lena.png";
547
548
std::vector<String> lenas, pngLenas;
549
cv::glob(patternLena, lenas, true);
550
cv::glob(patternLenaPng, pngLenas, true);
551
552
ASSERT_GT(lenas.size(), pngLenas.size());
553
554
for (size_t i = 0; i < pngLenas.size(); ++i)
555
{
556
ASSERT_NE(std::find(lenas.begin(), lenas.end(), pngLenas[i]), lenas.end());
557
}
558
}
559
560
TEST(Core_InputOutput, FileStorage)
561
{
562
std::string file = cv::tempfile(".xml");
563
cv::FileStorage f(file, cv::FileStorage::WRITE);
564
565
char arr[66];
566
sprintf(arr, "sprintf is hell %d", 666);
567
EXPECT_NO_THROW(f << arr);
568
}
569
570
TEST(Core_InputOutput, FileStorageKey)
571
{
572
cv::FileStorage f("dummy.yml", cv::FileStorage::WRITE | cv::FileStorage::MEMORY);
573
574
EXPECT_NO_THROW(f << "key1" << "value1");
575
EXPECT_NO_THROW(f << "_key2" << "value2");
576
EXPECT_NO_THROW(f << "key_3" << "value3");
577
const std::string expected = "%YAML:1.0\n---\nkey1: value1\n_key2: value2\nkey_3: value3\n";
578
ASSERT_STREQ(f.releaseAndGetString().c_str(), expected.c_str());
579
}
580
581
TEST(Core_InputOutput, FileStorageSpaces)
582
{
583
cv::FileStorage f("dummy.yml", cv::FileStorage::WRITE | cv::FileStorage::MEMORY);
584
const int valueCount = 5;
585
std::string values[5] = { "", " ", " ", " a", " some string" };
586
for (size_t i = 0; i < valueCount; i++) {
587
EXPECT_NO_THROW(f << cv::format("key%zu", i) << values[i]);
588
}
589
cv::FileStorage f2(f.releaseAndGetString(), cv::FileStorage::READ | cv::FileStorage::MEMORY);
590
std::string valuesRead[valueCount];
591
for (size_t i = 0; i < valueCount; i++) {
592
EXPECT_NO_THROW(f2[cv::format("key%zu", i)] >> valuesRead[i]);
593
ASSERT_STREQ(values[i].c_str(), valuesRead[i].c_str());
594
}
595
std::string fileName = cv::tempfile(".xml");
596
cv::FileStorage g1(fileName, cv::FileStorage::WRITE);
597
for (size_t i = 0; i < 2; i++) {
598
EXPECT_NO_THROW(g1 << cv::format("key%zu", i) << values[i]);
599
}
600
g1.release();
601
cv::FileStorage g2(fileName, cv::FileStorage::APPEND);
602
for (size_t i = 2; i < valueCount; i++) {
603
EXPECT_NO_THROW(g2 << cv::format("key%zu", i) << values[i]);
604
}
605
g2.release();
606
cv::FileStorage g3(fileName, cv::FileStorage::READ);
607
std::string valuesReadAppend[valueCount];
608
for (size_t i = 0; i < valueCount; i++) {
609
EXPECT_NO_THROW(g3[cv::format("key%zu", i)] >> valuesReadAppend[i]);
610
ASSERT_STREQ(values[i].c_str(), valuesReadAppend[i].c_str());
611
}
612
g3.release();
613
}
614
615
struct data_t
616
{
617
typedef uchar u;
618
typedef char b;
619
typedef ushort w;
620
typedef short s;
621
typedef int i;
622
typedef float f;
623
typedef double d;
624
625
/*0x00*/ u u1 ;u u2 ; i i1 ;
626
/*0x08*/ i i2 ;i i3 ;
627
/*0x10*/ d d1 ;
628
/*0x18*/ d d2 ;
629
/*0x20*/ i i4 ;i required_alignment_field_for_linux32;
630
/*
631
* OpenCV persistence.cpp stuff expects: sizeof(data_t) = alignSize(36, sizeof(largest type = double)) = 40
632
* Some compilers on some archs returns sizeof(data_t) = 36 due struct packaging UB
633
*/
634
635
static inline const char * signature() {
636
if (sizeof(data_t) != 40)
637
{
638
printf("sizeof(data_t)=%d, u1=%p u2=%p i1=%p i2=%p i3=%p d1=%p d2=%p i4=%p\n", (int)sizeof(data_t),
639
&(((data_t*)0)->u1),
640
&(((data_t*)0)->u2),
641
&(((data_t*)0)->i1),
642
&(((data_t*)0)->i2),
643
&(((data_t*)0)->i3),
644
&(((data_t*)0)->d1),
645
&(((data_t*)0)->d2),
646
&(((data_t*)0)->i4)
647
);
648
}
649
CV_Assert(sizeof(data_t) == 40);
650
CV_Assert((size_t)&(((data_t*)0)->u1) == 0x0);
651
CV_Assert((size_t)&(((data_t*)0)->u2) == 0x1);
652
CV_Assert((size_t)&(((data_t*)0)->i1) == 0x4);
653
CV_Assert((size_t)&(((data_t*)0)->i2) == 0x8);
654
CV_Assert((size_t)&(((data_t*)0)->i3) == 0xc);
655
CV_Assert((size_t)&(((data_t*)0)->d1) == 0x10);
656
CV_Assert((size_t)&(((data_t*)0)->d2) == 0x18);
657
CV_Assert((size_t)&(((data_t*)0)->i4) == 0x20);
658
return "2u3i2di";
659
}
660
};
661
662
TEST(Core_InputOutput, filestorage_base64_basic)
663
{
664
const ::testing::TestInfo* const test_info = ::testing::UnitTest::GetInstance()->current_test_info();
665
std::string basename = (test_info == 0)
666
? "filestorage_base64_valid_call"
667
: (std::string(test_info->test_case_name()) + "--" + test_info->name());
668
669
char const * filenames[] = {
670
"core_io_base64_basic_test.yml",
671
"core_io_base64_basic_test.xml",
672
"core_io_base64_basic_test.json",
673
0
674
};
675
676
for (char const ** ptr = filenames; *ptr; ptr++)
677
{
678
char const * suffix_name = *ptr;
679
std::string name = basename + '_' + suffix_name;
680
681
std::vector<data_t> rawdata;
682
683
cv::Mat _em_out, _em_in;
684
cv::Mat _2d_out, _2d_in;
685
cv::Mat _nd_out, _nd_in;
686
cv::Mat _rd_out(64, 64, CV_64FC1), _rd_in;
687
688
bool no_type_id = true;
689
690
{ /* init */
691
692
/* a normal mat */
693
_2d_out = cv::Mat(100, 100, CV_8UC3, cvScalar(1U, 2U, 127U));
694
for (int i = 0; i < _2d_out.rows; ++i)
695
for (int j = 0; j < _2d_out.cols; ++j)
696
_2d_out.at<cv::Vec3b>(i, j)[1] = (i + j) % 256;
697
698
/* a 4d mat */
699
const int Size[] = {4, 4, 4, 4};
700
cv::Mat _4d(4, Size, CV_64FC4, cvScalar(0.888, 0.111, 0.666, 0.444));
701
const cv::Range ranges[] = {
702
cv::Range(0, 2),
703
cv::Range(0, 2),
704
cv::Range(1, 2),
705
cv::Range(0, 2) };
706
_nd_out = _4d(ranges);
707
708
/* a random mat */
709
cv::randu(_rd_out, cv::Scalar(0.0), cv::Scalar(1.0));
710
711
/* raw data */
712
for (int i = 0; i < 1000; i++) {
713
data_t tmp;
714
tmp.u1 = 1;
715
tmp.u2 = 2;
716
tmp.i1 = 1;
717
tmp.i2 = 2;
718
tmp.i3 = 3;
719
tmp.d1 = 0.1;
720
tmp.d2 = 0.2;
721
tmp.i4 = i;
722
rawdata.push_back(tmp);
723
}
724
}
725
726
{ /* write */
727
cv::FileStorage fs(name, cv::FileStorage::WRITE_BASE64);
728
fs << "normal_2d_mat" << _2d_out;
729
fs << "normal_nd_mat" << _nd_out;
730
fs << "empty_2d_mat" << _em_out;
731
fs << "random_mat" << _rd_out;
732
733
cvStartWriteStruct( *fs, "rawdata", CV_NODE_SEQ | CV_NODE_FLOW, "binary" );
734
for (int i = 0; i < 10; i++)
735
cvWriteRawDataBase64(*fs, rawdata.data() + i * 100, 100, data_t::signature());
736
cvEndWriteStruct( *fs );
737
738
fs.release();
739
}
740
741
{ /* read */
742
cv::FileStorage fs(name, cv::FileStorage::READ);
743
744
/* mat */
745
fs["empty_2d_mat"] >> _em_in;
746
fs["normal_2d_mat"] >> _2d_in;
747
fs["normal_nd_mat"] >> _nd_in;
748
fs["random_mat"] >> _rd_in;
749
750
if ( !fs["empty_2d_mat"]["type_id"].empty() ||
751
!fs["normal_2d_mat"]["type_id"].empty() ||
752
!fs["normal_nd_mat"]["type_id"].empty() ||
753
!fs[ "random_mat"]["type_id"].empty() )
754
no_type_id = false;
755
756
/* raw data */
757
std::vector<data_t>(1000).swap(rawdata);
758
cvReadRawData(*fs, fs["rawdata"].node, rawdata.data(), data_t::signature());
759
760
fs.release();
761
}
762
763
int errors = 0;
764
for (int i = 0; i < 1000; i++)
765
{
766
EXPECT_EQ((int)rawdata[i].u1, 1);
767
EXPECT_EQ((int)rawdata[i].u2, 2);
768
EXPECT_EQ((int)rawdata[i].i1, 1);
769
EXPECT_EQ((int)rawdata[i].i2, 2);
770
EXPECT_EQ((int)rawdata[i].i3, 3);
771
EXPECT_EQ(rawdata[i].d1, 0.1);
772
EXPECT_EQ(rawdata[i].d2, 0.2);
773
EXPECT_EQ((int)rawdata[i].i4, i);
774
if (::testing::Test::HasNonfatalFailure())
775
{
776
printf("i = %d\n", i);
777
errors++;
778
}
779
if (errors >= 3)
780
break;
781
}
782
783
EXPECT_TRUE(no_type_id);
784
785
EXPECT_EQ(_em_in.rows , _em_out.rows);
786
EXPECT_EQ(_em_in.cols , _em_out.cols);
787
EXPECT_EQ(_em_in.depth(), _em_out.depth());
788
EXPECT_TRUE(_em_in.empty());
789
790
EXPECT_EQ(_2d_in.rows , _2d_out.rows);
791
EXPECT_EQ(_2d_in.cols , _2d_out.cols);
792
EXPECT_EQ(_2d_in.dims , _2d_out.dims);
793
EXPECT_EQ(_2d_in.depth(), _2d_out.depth());
794
795
errors = 0;
796
for(int i = 0; i < _2d_out.rows; ++i)
797
{
798
for (int j = 0; j < _2d_out.cols; ++j)
799
{
800
EXPECT_EQ(_2d_in.at<cv::Vec3b>(i, j), _2d_out.at<cv::Vec3b>(i, j));
801
if (::testing::Test::HasNonfatalFailure())
802
{
803
printf("i = %d, j = %d\n", i, j);
804
errors++;
805
}
806
if (errors >= 3)
807
{
808
i = _2d_out.rows;
809
break;
810
}
811
}
812
}
813
814
EXPECT_EQ(_nd_in.rows , _nd_out.rows);
815
EXPECT_EQ(_nd_in.cols , _nd_out.cols);
816
EXPECT_EQ(_nd_in.dims , _nd_out.dims);
817
EXPECT_EQ(_nd_in.depth(), _nd_out.depth());
818
EXPECT_EQ(cv::countNonZero(cv::mean(_nd_in != _nd_out)), 0);
819
820
EXPECT_EQ(_rd_in.rows , _rd_out.rows);
821
EXPECT_EQ(_rd_in.cols , _rd_out.cols);
822
EXPECT_EQ(_rd_in.dims , _rd_out.dims);
823
EXPECT_EQ(_rd_in.depth(), _rd_out.depth());
824
EXPECT_EQ(cv::countNonZero(cv::mean(_rd_in != _rd_out)), 0);
825
826
remove(name.c_str());
827
}
828
}
829
830
TEST(Core_InputOutput, filestorage_base64_valid_call)
831
{
832
const ::testing::TestInfo* const test_info = ::testing::UnitTest::GetInstance()->current_test_info();
833
std::string basename = (test_info == 0)
834
? "filestorage_base64_valid_call"
835
: (std::string(test_info->test_case_name()) + "--" + test_info->name());
836
837
char const * filenames[] = {
838
"core_io_base64_other_test.yml",
839
"core_io_base64_other_test.xml",
840
"core_io_base64_other_test.json",
841
"core_io_base64_other_test.yml?base64",
842
"core_io_base64_other_test.xml?base64",
843
"core_io_base64_other_test.json?base64",
844
0
845
};
846
char const * real_name[] = {
847
"core_io_base64_other_test.yml",
848
"core_io_base64_other_test.xml",
849
"core_io_base64_other_test.json",
850
"core_io_base64_other_test.yml",
851
"core_io_base64_other_test.xml",
852
"core_io_base64_other_test.json",
853
0
854
};
855
856
std::vector<int> rawdata(10, static_cast<int>(0x00010203));
857
cv::String str_out = "test_string";
858
859
for (char const ** ptr = filenames; *ptr; ptr++)
860
{
861
char const * suffix_name = *ptr;
862
std::string name = basename + '_' + suffix_name;
863
864
EXPECT_NO_THROW(
865
{
866
cv::FileStorage fs(name, cv::FileStorage::WRITE_BASE64);
867
868
cvStartWriteStruct(*fs, "manydata", CV_NODE_SEQ);
869
cvStartWriteStruct(*fs, 0, CV_NODE_SEQ | CV_NODE_FLOW);
870
for (int i = 0; i < 10; i++)
871
cvWriteRawData(*fs, rawdata.data(), static_cast<int>(rawdata.size()), "i");
872
cvEndWriteStruct(*fs);
873
cvWriteString(*fs, 0, str_out.c_str(), 1);
874
cvEndWriteStruct(*fs);
875
876
fs.release();
877
});
878
879
{
880
cv::FileStorage fs(name, cv::FileStorage::READ);
881
std::vector<int> data_in(rawdata.size());
882
fs["manydata"][0].readRaw("i", (uchar *)data_in.data(), data_in.size());
883
EXPECT_TRUE(fs["manydata"][0].isSeq());
884
EXPECT_TRUE(std::equal(rawdata.begin(), rawdata.end(), data_in.begin()));
885
cv::String str_in;
886
fs["manydata"][1] >> str_in;
887
EXPECT_TRUE(fs["manydata"][1].isString());
888
EXPECT_EQ(str_in, str_out);
889
fs.release();
890
}
891
892
EXPECT_NO_THROW(
893
{
894
cv::FileStorage fs(name, cv::FileStorage::WRITE);
895
896
cvStartWriteStruct(*fs, "manydata", CV_NODE_SEQ);
897
cvWriteString(*fs, 0, str_out.c_str(), 1);
898
cvStartWriteStruct(*fs, 0, CV_NODE_SEQ | CV_NODE_FLOW, "binary");
899
for (int i = 0; i < 10; i++)
900
cvWriteRawData(*fs, rawdata.data(), static_cast<int>(rawdata.size()), "i");
901
cvEndWriteStruct(*fs);
902
cvEndWriteStruct(*fs);
903
904
fs.release();
905
});
906
907
{
908
cv::FileStorage fs(name, cv::FileStorage::READ);
909
cv::String str_in;
910
fs["manydata"][0] >> str_in;
911
EXPECT_TRUE(fs["manydata"][0].isString());
912
EXPECT_EQ(str_in, str_out);
913
std::vector<int> data_in(rawdata.size());
914
fs["manydata"][1].readRaw("i", (uchar *)data_in.data(), data_in.size());
915
EXPECT_TRUE(fs["manydata"][1].isSeq());
916
EXPECT_TRUE(std::equal(rawdata.begin(), rawdata.end(), data_in.begin()));
917
fs.release();
918
}
919
920
remove((basename + '_' + real_name[ptr - filenames]).c_str());
921
}
922
}
923
924
TEST(Core_InputOutput, filestorage_base64_invalid_call)
925
{
926
const ::testing::TestInfo* const test_info = ::testing::UnitTest::GetInstance()->current_test_info();
927
std::string basename = (test_info == 0)
928
? "filestorage_base64_invalid_call"
929
: (std::string(test_info->test_case_name()) + "--" + test_info->name());
930
931
char const * filenames[] = {
932
"core_io_base64_other_test.yml",
933
"core_io_base64_other_test.xml",
934
"core_io_base64_other_test.json",
935
0
936
};
937
938
for (char const ** ptr = filenames; *ptr; ptr++)
939
{
940
char const * suffix_name = *ptr;
941
std::string name = basename + '_' + suffix_name;
942
943
EXPECT_ANY_THROW({
944
cv::FileStorage fs(name, cv::FileStorage::WRITE);
945
cvStartWriteStruct(*fs, "rawdata", CV_NODE_SEQ, "binary");
946
cvStartWriteStruct(*fs, 0, CV_NODE_SEQ | CV_NODE_FLOW);
947
});
948
949
EXPECT_ANY_THROW({
950
cv::FileStorage fs(name, cv::FileStorage::WRITE);
951
cvStartWriteStruct(*fs, "rawdata", CV_NODE_SEQ);
952
cvStartWriteStruct(*fs, 0, CV_NODE_SEQ | CV_NODE_FLOW);
953
cvWriteRawDataBase64(*fs, name.c_str(), 1, "u");
954
});
955
956
remove(name.c_str());
957
}
958
}
959
960
TEST(Core_InputOutput, filestorage_yml_vec2i)
961
{
962
const std::string file_name = "vec2i.yml";
963
cv::Vec2i vec(2, 1), ovec;
964
965
/* write */
966
{
967
cv::FileStorage fs(file_name, cv::FileStorage::WRITE);
968
fs << "prms0" << "{" << "vec0" << vec << "}";
969
fs.release();
970
}
971
972
/* read */
973
{
974
cv::FileStorage fs(file_name, cv::FileStorage::READ);
975
fs["prms0"]["vec0"] >> ovec;
976
fs.release();
977
}
978
979
EXPECT_EQ(vec(0), ovec(0));
980
EXPECT_EQ(vec(1), ovec(1));
981
982
remove(file_name.c_str());
983
}
984
985
TEST(Core_InputOutput, filestorage_json_comment)
986
{
987
String mem_str =
988
"{ /* comment */\n"
989
" \"key\": \"value\"\n"
990
" /************\n"
991
" * multiline comment\n"
992
" ************/\n"
993
" // 233\n"
994
" // \n"
995
"}\n"
996
;
997
998
String str;
999
1000
EXPECT_NO_THROW(
1001
{
1002
cv::FileStorage fs(mem_str, cv::FileStorage::READ | cv::FileStorage::MEMORY);
1003
fs["key"] >> str;
1004
fs.release();
1005
});
1006
1007
EXPECT_EQ(str, String("value"));
1008
}
1009
1010
TEST(Core_InputOutput, filestorage_utf8_bom)
1011
{
1012
EXPECT_NO_THROW(
1013
{
1014
String content ="\xEF\xBB\xBF<?xml version=\"1.0\"?>\n<opencv_storage>\n</opencv_storage>\n";
1015
cv::FileStorage fs(content, cv::FileStorage::READ | cv::FileStorage::MEMORY);
1016
fs.release();
1017
});
1018
EXPECT_NO_THROW(
1019
{
1020
String content ="\xEF\xBB\xBF%YAML:1.0\n";
1021
cv::FileStorage fs(content, cv::FileStorage::READ | cv::FileStorage::MEMORY);
1022
fs.release();
1023
});
1024
EXPECT_NO_THROW(
1025
{
1026
String content ="\xEF\xBB\xBF{\n}\n";
1027
cv::FileStorage fs(content, cv::FileStorage::READ | cv::FileStorage::MEMORY);
1028
fs.release();
1029
});
1030
}
1031
1032
TEST(Core_InputOutput, filestorage_vec_vec_io)
1033
{
1034
std::vector<std::vector<Mat> > outputMats(3);
1035
for(size_t i = 0; i < outputMats.size(); i++)
1036
{
1037
outputMats[i].resize(i+1);
1038
for(size_t j = 0; j < outputMats[i].size(); j++)
1039
{
1040
outputMats[i][j] = Mat::eye((int)i + 1, (int)i + 1, CV_8U);
1041
}
1042
}
1043
1044
String fileName = "vec_vec_io_test.";
1045
1046
std::vector<String> formats;
1047
formats.push_back("xml");
1048
formats.push_back("yml");
1049
formats.push_back("json");
1050
1051
for(size_t i = 0; i < formats.size(); i++)
1052
{
1053
FileStorage writer(fileName + formats[i], FileStorage::WRITE);
1054
writer << "vecVecMat" << outputMats;
1055
writer.release();
1056
1057
FileStorage reader(fileName + formats[i], FileStorage::READ);
1058
std::vector<std::vector<Mat> > testMats;
1059
reader["vecVecMat"] >> testMats;
1060
1061
ASSERT_EQ(testMats.size(), testMats.size());
1062
1063
for(size_t j = 0; j < testMats.size(); j++)
1064
{
1065
ASSERT_EQ(testMats[j].size(), outputMats[j].size());
1066
1067
for(size_t k = 0; k < testMats[j].size(); k++)
1068
{
1069
ASSERT_TRUE(cvtest::norm(outputMats[j][k] - testMats[j][k], NORM_INF) == 0);
1070
}
1071
}
1072
1073
reader.release();
1074
remove((fileName + formats[i]).c_str());
1075
}
1076
}
1077
1078
TEST(Core_InputOutput, filestorage_yaml_advanvced_type_heading)
1079
{
1080
String content = "%YAML:1.0\n cameraMatrix: !<tag:yaml.org,2002:opencv-matrix>\n"
1081
" rows: 1\n"
1082
" cols: 1\n"
1083
" dt: d\n"
1084
" data: [ 1. ]";
1085
1086
cv::FileStorage fs(content, cv::FileStorage::READ | cv::FileStorage::MEMORY);
1087
1088
cv::Mat inputMatrix;
1089
cv::Mat actualMatrix = cv::Mat::eye(1, 1, CV_64F);
1090
fs["cameraMatrix"] >> inputMatrix;
1091
1092
ASSERT_EQ(cv::norm(inputMatrix, actualMatrix, NORM_INF), 0.);
1093
}
1094
1095
TEST(Core_InputOutput, filestorage_keypoints_vec_vec_io)
1096
{
1097
vector<vector<KeyPoint> > kptsVec;
1098
vector<KeyPoint> kpts;
1099
kpts.push_back(KeyPoint(0, 0, 1.1f));
1100
kpts.push_back(KeyPoint(1, 1, 1.1f));
1101
kptsVec.push_back(kpts);
1102
kpts.clear();
1103
kpts.push_back(KeyPoint(0, 0, 1.1f, 10.1f, 34.5f, 10, 11));
1104
kptsVec.push_back(kpts);
1105
1106
FileStorage writer("", FileStorage::WRITE + FileStorage::MEMORY + FileStorage::FORMAT_XML);
1107
writer << "keypoints" << kptsVec;
1108
String content = writer.releaseAndGetString();
1109
1110
FileStorage reader(content, FileStorage::READ + FileStorage::MEMORY);
1111
vector<vector<KeyPoint> > readKptsVec;
1112
reader["keypoints"] >> readKptsVec;
1113
1114
ASSERT_EQ(kptsVec.size(), readKptsVec.size());
1115
1116
for(size_t i = 0; i < kptsVec.size(); i++)
1117
{
1118
ASSERT_EQ(kptsVec[i].size(), readKptsVec[i].size());
1119
for(size_t j = 0; j < kptsVec[i].size(); j++)
1120
{
1121
ASSERT_FLOAT_EQ(kptsVec[i][j].pt.x, readKptsVec[i][j].pt.x);
1122
ASSERT_FLOAT_EQ(kptsVec[i][j].pt.y, readKptsVec[i][j].pt.y);
1123
ASSERT_FLOAT_EQ(kptsVec[i][j].angle, readKptsVec[i][j].angle);
1124
ASSERT_FLOAT_EQ(kptsVec[i][j].size, readKptsVec[i][j].size);
1125
ASSERT_FLOAT_EQ(kptsVec[i][j].response, readKptsVec[i][j].response);
1126
ASSERT_EQ(kptsVec[i][j].octave, readKptsVec[i][j].octave);
1127
ASSERT_EQ(kptsVec[i][j].class_id, readKptsVec[i][j].class_id);
1128
}
1129
}
1130
}
1131
1132
TEST(Core_InputOutput, FileStorage_DMatch)
1133
{
1134
cv::FileStorage fs("dmatch.yml", cv::FileStorage::WRITE | cv::FileStorage::MEMORY);
1135
1136
cv::DMatch d(1, 2, 3, -1.5f);
1137
1138
EXPECT_NO_THROW(fs << "d" << d);
1139
cv::String fs_result = fs.releaseAndGetString();
1140
#if defined _MSC_VER && _MSC_VER <= 1800 /* MSVC 2013 and older */
1141
EXPECT_STREQ(fs_result.c_str(), "%YAML:1.0\n---\nd: [ 1, 2, 3, -1.5000000000000000e+000 ]\n");
1142
#else
1143
EXPECT_STREQ(fs_result.c_str(), "%YAML:1.0\n---\nd: [ 1, 2, 3, -1.5000000000000000e+00 ]\n");
1144
#endif
1145
1146
cv::FileStorage fs_read(fs_result, cv::FileStorage::READ | cv::FileStorage::MEMORY);
1147
1148
cv::DMatch d_read;
1149
ASSERT_NO_THROW(fs_read["d"] >> d_read);
1150
1151
EXPECT_EQ(d.queryIdx, d_read.queryIdx);
1152
EXPECT_EQ(d.trainIdx, d_read.trainIdx);
1153
EXPECT_EQ(d.imgIdx, d_read.imgIdx);
1154
EXPECT_EQ(d.distance, d_read.distance);
1155
}
1156
1157
TEST(Core_InputOutput, FileStorage_DMatch_vector)
1158
{
1159
cv::FileStorage fs("dmatch.yml", cv::FileStorage::WRITE | cv::FileStorage::MEMORY);
1160
1161
cv::DMatch d1(1, 2, 3, -1.5f);
1162
cv::DMatch d2(2, 3, 4, 1.5f);
1163
cv::DMatch d3(3, 2, 1, 0.5f);
1164
std::vector<cv::DMatch> dv;
1165
dv.push_back(d1);
1166
dv.push_back(d2);
1167
dv.push_back(d3);
1168
1169
EXPECT_NO_THROW(fs << "dv" << dv);
1170
cv::String fs_result = fs.releaseAndGetString();
1171
#if defined _MSC_VER && _MSC_VER <= 1800 /* MSVC 2013 and older */
1172
EXPECT_STREQ(fs_result.c_str(),
1173
"%YAML:1.0\n"
1174
"---\n"
1175
"dv:\n"
1176
" - [ 1, 2, 3, -1.5000000000000000e+000 ]\n"
1177
" - [ 2, 3, 4, 1.5000000000000000e+000 ]\n"
1178
" - [ 3, 2, 1, 5.0000000000000000e-001 ]\n"
1179
);
1180
#else
1181
EXPECT_STREQ(fs_result.c_str(),
1182
"%YAML:1.0\n"
1183
"---\n"
1184
"dv:\n"
1185
" - [ 1, 2, 3, -1.5000000000000000e+00 ]\n"
1186
" - [ 2, 3, 4, 1.5000000000000000e+00 ]\n"
1187
" - [ 3, 2, 1, 5.0000000000000000e-01 ]\n"
1188
);
1189
#endif
1190
1191
cv::FileStorage fs_read(fs_result, cv::FileStorage::READ | cv::FileStorage::MEMORY);
1192
1193
std::vector<cv::DMatch> dv_read;
1194
ASSERT_NO_THROW(fs_read["dv"] >> dv_read);
1195
1196
ASSERT_EQ(dv.size(), dv_read.size());
1197
for (size_t i = 0; i < dv.size(); i++)
1198
{
1199
EXPECT_EQ(dv[i].queryIdx, dv_read[i].queryIdx);
1200
EXPECT_EQ(dv[i].trainIdx, dv_read[i].trainIdx);
1201
EXPECT_EQ(dv[i].imgIdx, dv_read[i].imgIdx);
1202
EXPECT_EQ(dv[i].distance, dv_read[i].distance);
1203
}
1204
}
1205
1206
TEST(Core_InputOutput, FileStorage_DMatch_vector_vector)
1207
{
1208
cv::FileStorage fs("dmatch.yml", cv::FileStorage::WRITE | cv::FileStorage::MEMORY);
1209
1210
cv::DMatch d1(1, 2, 3, -1.5f);
1211
cv::DMatch d2(2, 3, 4, 1.5f);
1212
cv::DMatch d3(3, 2, 1, 0.5f);
1213
std::vector<cv::DMatch> dv1;
1214
dv1.push_back(d1);
1215
dv1.push_back(d2);
1216
dv1.push_back(d3);
1217
1218
std::vector<cv::DMatch> dv2;
1219
dv2.push_back(d3);
1220
dv2.push_back(d1);
1221
1222
std::vector< std::vector<cv::DMatch> > dvv;
1223
dvv.push_back(dv1);
1224
dvv.push_back(dv2);
1225
1226
EXPECT_NO_THROW(fs << "dvv" << dvv);
1227
cv::String fs_result = fs.releaseAndGetString();
1228
#ifndef OPENCV_TRAITS_ENABLE_DEPRECATED
1229
#if defined _MSC_VER && _MSC_VER <= 1800 /* MSVC 2013 and older */
1230
EXPECT_STREQ(fs_result.c_str(),
1231
"%YAML:1.0\n"
1232
"---\n"
1233
"dvv:\n"
1234
" -\n"
1235
" - [ 1, 2, 3, -1.5000000000000000e+000 ]\n"
1236
" - [ 2, 3, 4, 1.5000000000000000e+000 ]\n"
1237
" - [ 3, 2, 1, 5.0000000000000000e-001 ]\n"
1238
" -\n"
1239
" - [ 3, 2, 1, 5.0000000000000000e-001 ]\n"
1240
" - [ 1, 2, 3, -1.5000000000000000e+000 ]\n"
1241
);
1242
#else
1243
EXPECT_STREQ(fs_result.c_str(),
1244
"%YAML:1.0\n"
1245
"---\n"
1246
"dvv:\n"
1247
" -\n"
1248
" - [ 1, 2, 3, -1.5000000000000000e+00 ]\n"
1249
" - [ 2, 3, 4, 1.5000000000000000e+00 ]\n"
1250
" - [ 3, 2, 1, 5.0000000000000000e-01 ]\n"
1251
" -\n"
1252
" - [ 3, 2, 1, 5.0000000000000000e-01 ]\n"
1253
" - [ 1, 2, 3, -1.5000000000000000e+00 ]\n"
1254
);
1255
#endif
1256
#endif // OPENCV_TRAITS_ENABLE_DEPRECATED
1257
1258
cv::FileStorage fs_read(fs_result, cv::FileStorage::READ | cv::FileStorage::MEMORY);
1259
1260
std::vector< std::vector<cv::DMatch> > dvv_read;
1261
ASSERT_NO_THROW(fs_read["dvv"] >> dvv_read);
1262
1263
ASSERT_EQ(dvv.size(), dvv_read.size());
1264
for (size_t j = 0; j < dvv.size(); j++)
1265
{
1266
const std::vector<cv::DMatch>& dv = dvv[j];
1267
const std::vector<cv::DMatch>& dv_read = dvv_read[j];
1268
ASSERT_EQ(dvv.size(), dvv_read.size());
1269
for (size_t i = 0; i < dv.size(); i++)
1270
{
1271
EXPECT_EQ(dv[i].queryIdx, dv_read[i].queryIdx);
1272
EXPECT_EQ(dv[i].trainIdx, dv_read[i].trainIdx);
1273
EXPECT_EQ(dv[i].imgIdx, dv_read[i].imgIdx);
1274
EXPECT_EQ(dv[i].distance, dv_read[i].distance);
1275
}
1276
}
1277
}
1278
1279
1280
TEST(Core_InputOutput, FileStorage_KeyPoint)
1281
{
1282
cv::FileStorage fs("keypoint.xml", cv::FileStorage::WRITE | cv::FileStorage::MEMORY);
1283
1284
cv::KeyPoint k(Point2f(1, 2), 16, 0, 100, 1, -1);
1285
1286
EXPECT_NO_THROW(fs << "k" << k);
1287
cv::String fs_result = fs.releaseAndGetString();
1288
EXPECT_STREQ(fs_result.c_str(),
1289
"<?xml version=\"1.0\"?>\n"
1290
"<opencv_storage>\n"
1291
"<k>\n"
1292
" 1. 2. 16. 0. 100. 1 -1</k>\n"
1293
"</opencv_storage>\n"
1294
);
1295
1296
cv::FileStorage fs_read(fs_result, cv::FileStorage::READ | cv::FileStorage::MEMORY);
1297
1298
cv::KeyPoint k_read;
1299
ASSERT_NO_THROW(fs_read["k"] >> k_read);
1300
1301
EXPECT_EQ(k.pt, k_read.pt);
1302
EXPECT_EQ(k.size, k_read.size);
1303
EXPECT_EQ(k.angle, k_read.angle);
1304
EXPECT_EQ(k.response, k_read.response);
1305
EXPECT_EQ(k.octave, k_read.octave);
1306
EXPECT_EQ(k.class_id, k_read.class_id);
1307
}
1308
1309
TEST(Core_InputOutput, FileStorage_KeyPoint_vector)
1310
{
1311
cv::FileStorage fs("keypoint.xml", cv::FileStorage::WRITE | cv::FileStorage::MEMORY);
1312
1313
cv::KeyPoint k1(Point2f(1, 2), 16, 0, 100, 1, -1);
1314
cv::KeyPoint k2(Point2f(2, 3), 16, 45, 100, 1, -1);
1315
cv::KeyPoint k3(Point2f(1, 2), 16, 90, 100, 1, -1);
1316
std::vector<cv::KeyPoint> kv;
1317
kv.push_back(k1);
1318
kv.push_back(k2);
1319
kv.push_back(k3);
1320
1321
EXPECT_NO_THROW(fs << "kv" << kv);
1322
cv::String fs_result = fs.releaseAndGetString();
1323
EXPECT_STREQ(fs_result.c_str(),
1324
"<?xml version=\"1.0\"?>\n"
1325
"<opencv_storage>\n"
1326
"<kv>\n"
1327
" <_>\n"
1328
" 1. 2. 16. 0. 100. 1 -1</_>\n"
1329
" <_>\n"
1330
" 2. 3. 16. 45. 100. 1 -1</_>\n"
1331
" <_>\n"
1332
" 1. 2. 16. 90. 100. 1 -1</_></kv>\n"
1333
"</opencv_storage>\n"
1334
);
1335
1336
cv::FileStorage fs_read(fs_result, cv::FileStorage::READ | cv::FileStorage::MEMORY);
1337
1338
std::vector<cv::KeyPoint> kv_read;
1339
ASSERT_NO_THROW(fs_read["kv"] >> kv_read);
1340
1341
ASSERT_EQ(kv.size(), kv_read.size());
1342
for (size_t i = 0; i < kv.size(); i++)
1343
{
1344
EXPECT_EQ(kv[i].pt, kv_read[i].pt);
1345
EXPECT_EQ(kv[i].size, kv_read[i].size);
1346
EXPECT_EQ(kv[i].angle, kv_read[i].angle);
1347
EXPECT_EQ(kv[i].response, kv_read[i].response);
1348
EXPECT_EQ(kv[i].octave, kv_read[i].octave);
1349
EXPECT_EQ(kv[i].class_id, kv_read[i].class_id);
1350
}
1351
}
1352
1353
TEST(Core_InputOutput, FileStorage_KeyPoint_vector_vector)
1354
{
1355
cv::FileStorage fs("keypoint.xml", cv::FileStorage::WRITE | cv::FileStorage::MEMORY);
1356
1357
cv::KeyPoint k1(Point2f(1, 2), 16, 0, 100, 1, -1);
1358
cv::KeyPoint k2(Point2f(2, 3), 16, 45, 100, 1, -1);
1359
cv::KeyPoint k3(Point2f(1, 2), 16, 90, 100, 1, -1);
1360
std::vector<cv::KeyPoint> kv1;
1361
kv1.push_back(k1);
1362
kv1.push_back(k2);
1363
kv1.push_back(k3);
1364
1365
std::vector<cv::KeyPoint> kv2;
1366
kv2.push_back(k3);
1367
kv2.push_back(k1);
1368
1369
std::vector< std::vector<cv::KeyPoint> > kvv;
1370
kvv.push_back(kv1);
1371
kvv.push_back(kv2);
1372
1373
EXPECT_NO_THROW(fs << "kvv" << kvv);
1374
cv::String fs_result = fs.releaseAndGetString();
1375
#ifndef OPENCV_TRAITS_ENABLE_DEPRECATED
1376
EXPECT_STREQ(fs_result.c_str(),
1377
"<?xml version=\"1.0\"?>\n"
1378
"<opencv_storage>\n"
1379
"<kvv>\n"
1380
" <_>\n"
1381
" <_>\n"
1382
" 1. 2. 16. 0. 100. 1 -1</_>\n"
1383
" <_>\n"
1384
" 2. 3. 16. 45. 100. 1 -1</_>\n"
1385
" <_>\n"
1386
" 1. 2. 16. 90. 100. 1 -1</_></_>\n"
1387
" <_>\n"
1388
" <_>\n"
1389
" 1. 2. 16. 90. 100. 1 -1</_>\n"
1390
" <_>\n"
1391
" 1. 2. 16. 0. 100. 1 -1</_></_></kvv>\n"
1392
"</opencv_storage>\n"
1393
);
1394
#endif //OPENCV_TRAITS_ENABLE_DEPRECATED
1395
1396
cv::FileStorage fs_read(fs_result, cv::FileStorage::READ | cv::FileStorage::MEMORY);
1397
1398
std::vector< std::vector<cv::KeyPoint> > kvv_read;
1399
ASSERT_NO_THROW(fs_read["kvv"] >> kvv_read);
1400
1401
ASSERT_EQ(kvv.size(), kvv_read.size());
1402
for (size_t j = 0; j < kvv.size(); j++)
1403
{
1404
const std::vector<cv::KeyPoint>& kv = kvv[j];
1405
const std::vector<cv::KeyPoint>& kv_read = kvv_read[j];
1406
ASSERT_EQ(kvv.size(), kvv_read.size());
1407
for (size_t i = 0; i < kv.size(); i++)
1408
{
1409
EXPECT_EQ(kv[i].pt, kv_read[i].pt);
1410
EXPECT_EQ(kv[i].size, kv_read[i].size);
1411
EXPECT_EQ(kv[i].angle, kv_read[i].angle);
1412
EXPECT_EQ(kv[i].response, kv_read[i].response);
1413
EXPECT_EQ(kv[i].octave, kv_read[i].octave);
1414
EXPECT_EQ(kv[i].class_id, kv_read[i].class_id);
1415
}
1416
}
1417
}
1418
1419
1420
#ifdef CV__LEGACY_PERSISTENCE
1421
TEST(Core_InputOutput, FileStorage_LEGACY_DMatch_vector)
1422
{
1423
cv::DMatch d1(1, 2, 3, -1.5f);
1424
cv::DMatch d2(2, 3, 4, 1.5f);
1425
cv::DMatch d3(3, 2, 1, 0.5f);
1426
std::vector<cv::DMatch> dv;
1427
dv.push_back(d1);
1428
dv.push_back(d2);
1429
dv.push_back(d3);
1430
1431
String fs_result =
1432
"<?xml version=\"1.0\"?>\n"
1433
"<opencv_storage>\n"
1434
"<dv>\n"
1435
" 1 2 3 -1.5000000000000000e+00 2 3 4 1.5000000000000000e+00 3 2 1\n"
1436
" 5.0000000000000000e-01</dv>\n"
1437
"</opencv_storage>\n"
1438
;
1439
1440
cv::FileStorage fs_read(fs_result, cv::FileStorage::READ | cv::FileStorage::MEMORY);
1441
1442
std::vector<cv::DMatch> dv_read;
1443
ASSERT_NO_THROW(fs_read["dv"] >> dv_read);
1444
1445
ASSERT_EQ(dv.size(), dv_read.size());
1446
for (size_t i = 0; i < dv.size(); i++)
1447
{
1448
EXPECT_EQ(dv[i].queryIdx, dv_read[i].queryIdx);
1449
EXPECT_EQ(dv[i].trainIdx, dv_read[i].trainIdx);
1450
EXPECT_EQ(dv[i].imgIdx, dv_read[i].imgIdx);
1451
EXPECT_EQ(dv[i].distance, dv_read[i].distance);
1452
}
1453
}
1454
1455
1456
TEST(Core_InputOutput, FileStorage_LEGACY_KeyPoint_vector)
1457
{
1458
cv::KeyPoint k1(Point2f(1, 2), 16, 0, 100, 1, -1);
1459
cv::KeyPoint k2(Point2f(2, 3), 16, 45, 100, 1, -1);
1460
cv::KeyPoint k3(Point2f(1, 2), 16, 90, 100, 1, -1);
1461
std::vector<cv::KeyPoint> kv;
1462
kv.push_back(k1);
1463
kv.push_back(k2);
1464
kv.push_back(k3);
1465
1466
cv::String fs_result =
1467
"<?xml version=\"1.0\"?>\n"
1468
"<opencv_storage>\n"
1469
"<kv>\n"
1470
" 1. 2. 16. 0. 100. 1 -1\n"
1471
" 2. 3. 16. 45. 100. 1 -1\n"
1472
" 1. 2. 16. 90. 100. 1 -1</kv>\n"
1473
"</opencv_storage>\n"
1474
;
1475
1476
cv::FileStorage fs_read(fs_result, cv::FileStorage::READ | cv::FileStorage::MEMORY);
1477
1478
std::vector<cv::KeyPoint> kv_read;
1479
ASSERT_NO_THROW(fs_read["kv"] >> kv_read);
1480
1481
ASSERT_EQ(kv.size(), kv_read.size());
1482
for (size_t i = 0; i < kv.size(); i++)
1483
{
1484
EXPECT_EQ(kv[i].pt, kv_read[i].pt);
1485
EXPECT_EQ(kv[i].size, kv_read[i].size);
1486
EXPECT_EQ(kv[i].angle, kv_read[i].angle);
1487
EXPECT_EQ(kv[i].response, kv_read[i].response);
1488
EXPECT_EQ(kv[i].octave, kv_read[i].octave);
1489
EXPECT_EQ(kv[i].class_id, kv_read[i].class_id);
1490
}
1491
}
1492
#endif
1493
1494
TEST(Core_InputOutput, FileStorage_format_xml)
1495
{
1496
FileStorage fs;
1497
fs.open("opencv_storage.xml", FileStorage::WRITE | FileStorage::MEMORY);
1498
EXPECT_EQ(FileStorage::FORMAT_XML, fs.getFormat());
1499
}
1500
1501
TEST(Core_InputOutput, FileStorage_format_xml_gz)
1502
{
1503
FileStorage fs;
1504
fs.open("opencv_storage.xml.gz", FileStorage::WRITE | FileStorage::MEMORY);
1505
EXPECT_EQ(FileStorage::FORMAT_XML, fs.getFormat());
1506
}
1507
1508
TEST(Core_InputOutput, FileStorage_format_json)
1509
{
1510
FileStorage fs;
1511
fs.open("opencv_storage.json", FileStorage::WRITE | FileStorage::MEMORY);
1512
EXPECT_EQ(FileStorage::FORMAT_JSON, fs.getFormat());
1513
}
1514
1515
TEST(Core_InputOutput, FileStorage_format_json_gz)
1516
{
1517
FileStorage fs;
1518
fs.open("opencv_storage.json.gz", FileStorage::WRITE | FileStorage::MEMORY);
1519
EXPECT_EQ(FileStorage::FORMAT_JSON, fs.getFormat());
1520
}
1521
1522
TEST(Core_InputOutput, FileStorage_format_yaml)
1523
{
1524
FileStorage fs;
1525
fs.open("opencv_storage.yaml", FileStorage::WRITE | FileStorage::MEMORY);
1526
EXPECT_EQ(FileStorage::FORMAT_YAML, fs.getFormat());
1527
}
1528
1529
TEST(Core_InputOutput, FileStorage_format_yaml_gz)
1530
{
1531
FileStorage fs;
1532
fs.open("opencv_storage.yaml.gz", FileStorage::WRITE | FileStorage::MEMORY);
1533
EXPECT_EQ(FileStorage::FORMAT_YAML, fs.getFormat());
1534
}
1535
1536
TEST(Core_InputOutput, FileStorage_format_yml)
1537
{
1538
FileStorage fs;
1539
fs.open("opencv_storage.yml", FileStorage::WRITE | FileStorage::MEMORY);
1540
EXPECT_EQ(FileStorage::FORMAT_YAML, fs.getFormat());
1541
}
1542
1543
TEST(Core_InputOutput, FileStorage_format_yml_gz)
1544
{
1545
FileStorage fs;
1546
fs.open("opencv_storage.yml.gz", FileStorage::WRITE | FileStorage::MEMORY);
1547
EXPECT_EQ(FileStorage::FORMAT_YAML, fs.getFormat());
1548
}
1549
1550
TEST(Core_InputOutput, FileStorage_json_named_nodes)
1551
{
1552
std::string test =
1553
"{ "
1554
"\"int_value\": -324,"
1555
"\"map_value\": {"
1556
"\"str_value\": \"mystring\""
1557
"},"
1558
"\"array\": [0.2, 0.1]"
1559
"}";
1560
FileStorage fs(test, FileStorage::READ | FileStorage::MEMORY);
1561
1562
ASSERT_TRUE(fs["int_value"].isNamed());
1563
ASSERT_TRUE(fs["map_value"].isNamed());
1564
ASSERT_TRUE(fs["map_value"]["str_value"].isNamed());
1565
ASSERT_TRUE(fs["array"].isNamed());
1566
ASSERT_FALSE(fs["array"][0].isNamed());
1567
ASSERT_FALSE(fs["array"][1].isNamed());
1568
1569
ASSERT_EQ(fs["int_value"].name(), "int_value");
1570
ASSERT_EQ(fs["map_value"].name(), "map_value");
1571
ASSERT_EQ(fs["map_value"]["str_value"].name(), "str_value");
1572
ASSERT_EQ(fs["array"].name(), "array");
1573
fs.release();
1574
}
1575
1576
TEST(Core_InputOutput, FileStorage_json_bool)
1577
{
1578
std::string test =
1579
"{ "
1580
"\"str_true\": \"true\","
1581
"\"map_value\": {"
1582
"\"int_value\": -33333,\n"
1583
"\"bool_true\": true,"
1584
"\"str_false\": \"false\","
1585
"},"
1586
"\"bool_false\": false, \n"
1587
"\"array\": [0.1, 0.2]"
1588
"}";
1589
FileStorage fs(test, FileStorage::READ | FileStorage::MEMORY);
1590
1591
ASSERT_TRUE(fs["str_true"].isString());
1592
ASSERT_TRUE(fs["map_value"]["bool_true"].isInt());
1593
ASSERT_TRUE(fs["map_value"]["str_false"].isString());
1594
ASSERT_TRUE(fs["bool_false"].isInt());
1595
1596
ASSERT_EQ((std::string)fs["str_true"], "true");
1597
ASSERT_EQ((int)fs["map_value"]["bool_true"], 1);
1598
ASSERT_EQ((std::string)fs["map_value"]["str_false"], "false");
1599
ASSERT_EQ((int)fs["bool_false"], 0);
1600
fs.release();
1601
}
1602
1603
TEST(Core_InputOutput, FileStorage_free_file_after_exception)
1604
{
1605
const std::string fileName = "FileStorage_free_file_after_exception_test.yml";
1606
const std::string content = "%YAML:1.0\n cameraMatrix;:: !<tag:yaml.org,2002:opencv-matrix>\n";
1607
1608
std::fstream testFile;
1609
testFile.open(fileName.c_str(), std::fstream::out);
1610
if(!testFile.is_open()) FAIL();
1611
testFile << content;
1612
testFile.close();
1613
1614
try
1615
{
1616
FileStorage fs(fileName, FileStorage::READ + FileStorage::FORMAT_YAML);
1617
FAIL();
1618
}
1619
catch (const std::exception&)
1620
{
1621
}
1622
ASSERT_EQ(0, std::remove(fileName.c_str()));
1623
}
1624
1625
}} // namespace
1626
1627