Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/modules/js/test/test_imgproc.js
16339 views
1
// //////////////////////////////////////////////////////////////////////////////////////
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 Intel Corporation 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
//
41
42
// //////////////////////////////////////////////////////////////////////////////////////
43
// Author: Sajjad Taheri, University of California, Irvine. sajjadt[at]uci[dot]edu
44
//
45
// LICENSE AGREEMENT
46
// Copyright (c) 2015 The Regents of the University of California (Regents)
47
//
48
// Redistribution and use in source and binary forms, with or without
49
// modification, are permitted provided that the following conditions are met:
50
// 1. Redistributions of source code must retain the above copyright
51
// notice, this list of conditions and the following disclaimer.
52
// 2. Redistributions in binary form must reproduce the above copyright
53
// notice, this list of conditions and the following disclaimer in the
54
// documentation and/or other materials provided with the distribution.
55
// 3. Neither the name of the University nor the
56
// names of its contributors may be used to endorse or promote products
57
// derived from this software without specific prior written permission.
58
//
59
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS IS'' AND ANY
60
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
61
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
62
// DISCLAIMED. IN NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY
63
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
64
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
65
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
66
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
67
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
68
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
69
//
70
71
if (typeof module !== 'undefined' && module.exports) {
72
// The envrionment is Node.js
73
var cv = require('./opencv.js'); // eslint-disable-line no-var
74
}
75
76
QUnit.module('Image Processing', {});
77
78
QUnit.test('test_imgProc', function(assert) {
79
// calcHist
80
{
81
let vec1 = new cv.Mat.ones(new cv.Size(20, 20), cv.CV_8UC1); // eslint-disable-line new-cap
82
let source = new cv.MatVector();
83
source.push_back(vec1);
84
let channels = [0];
85
let histSize = [256];
86
let ranges =[0, 256];
87
88
let hist = new cv.Mat();
89
let mask = new cv.Mat();
90
let binSize = cv._malloc(4);
91
let binView = new Int32Array(cv.HEAP8.buffer, binSize);
92
binView[0] = 10;
93
cv.calcHist(source, channels, mask, hist, histSize, ranges, false);
94
95
// hist should contains a N X 1 arrary.
96
let size = hist.size();
97
assert.equal(size.height, 256);
98
assert.equal(size.width, 1);
99
100
// default parameters
101
cv.calcHist(source, channels, mask, hist, histSize, ranges);
102
size = hist.size();
103
assert.equal(size.height, 256);
104
assert.equal(size.width, 1);
105
106
// Do we need to verify data in histogram?
107
// let dataView = hist.data;
108
109
// Free resource
110
cv._free(binSize);
111
mask.delete();
112
hist.delete();
113
}
114
115
// cvtColor
116
{
117
let source = new cv.Mat(10, 10, cv.CV_8UC3);
118
let dest = new cv.Mat();
119
120
cv.cvtColor(source, dest, cv.COLOR_BGR2GRAY, 0);
121
assert.equal(dest.channels(), 1);
122
123
cv.cvtColor(source, dest, cv.COLOR_BGR2GRAY);
124
assert.equal(dest.channels(), 1);
125
126
cv.cvtColor(source, dest, cv.COLOR_BGR2BGRA, 0);
127
assert.equal(dest.channels(), 4);
128
129
cv.cvtColor(source, dest, cv.COLOR_BGR2BGRA);
130
assert.equal(dest.channels(), 4);
131
132
dest.delete();
133
source.delete();
134
}
135
// equalizeHist
136
{
137
let source = new cv.Mat(10, 10, cv.CV_8UC1);
138
let dest = new cv.Mat();
139
140
cv.equalizeHist(source, dest);
141
142
// eualizeHist changes the content of a image, but does not alter meta data
143
// of it.
144
assert.equal(source.channels(), dest.channels());
145
assert.equal(source.type(), dest.type());
146
147
dest.delete();
148
source.delete();
149
}
150
});
151
152
QUnit.test('test_segmentation', function(assert) {
153
const THRESHOLD = 127.0;
154
const THRESHOLD_MAX = 210.0;
155
156
// threshold
157
{
158
let source = new cv.Mat(1, 5, cv.CV_8UC1);
159
let sourceView = source.data;
160
sourceView[0] = 0; // < threshold
161
sourceView[1] = 100; // < threshold
162
sourceView[2] = 200; // > threshold
163
164
let dest = new cv.Mat();
165
166
cv.threshold(source, dest, THRESHOLD, THRESHOLD_MAX, cv.THRESH_BINARY);
167
168
let destView = dest.data;
169
assert.equal(destView[0], 0);
170
assert.equal(destView[1], 0);
171
assert.equal(destView[2], THRESHOLD_MAX);
172
}
173
174
// adaptiveThreshold
175
{
176
let source = cv.Mat.zeros(1, 5, cv.CV_8UC1);
177
let sourceView = source.data;
178
sourceView[0] = 50;
179
sourceView[1] = 150;
180
sourceView[2] = 200;
181
182
let dest = new cv.Mat();
183
const C = 0;
184
const blockSize = 3;
185
cv.adaptiveThreshold(source, dest, THRESHOLD_MAX,
186
cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, blockSize, C);
187
188
let destView = dest.data;
189
assert.equal(destView[0], 0);
190
assert.equal(destView[1], THRESHOLD_MAX);
191
assert.equal(destView[2], THRESHOLD_MAX);
192
}
193
});
194
195
QUnit.test('test_shape', function(assert) {
196
// moments
197
{
198
let points = new cv.Mat(1, 4, cv.CV_32SC2);
199
let data32S = points.data32S;
200
data32S[0]=50;
201
data32S[1]=56;
202
data32S[2]=53;
203
data32S[3]=53;
204
data32S[4]=46;
205
data32S[5]=54;
206
data32S[6]=49;
207
data32S[7]=51;
208
209
let m = cv.moments(points, false);
210
let area = cv.contourArea(points, false);
211
212
assert.equal(m.m00, 0);
213
assert.equal(m.m01, 0);
214
assert.equal(m.m10, 0);
215
assert.equal(area, 0);
216
217
// default parameters
218
m = cv.moments(points);
219
area = cv.contourArea(points);
220
assert.equal(m.m00, 0);
221
assert.equal(m.m01, 0);
222
assert.equal(m.m10, 0);
223
assert.equal(area, 0);
224
225
points.delete();
226
}
227
});
228
229
QUnit.test('test_min_enclosing', function(assert) {
230
{
231
let points = new cv.Mat(4, 1, cv.CV_32FC2);
232
233
points.data32F[0] = 0;
234
points.data32F[1] = 0;
235
points.data32F[2] = 1;
236
points.data32F[3] = 0;
237
points.data32F[4] = 1;
238
points.data32F[5] = 1;
239
points.data32F[6] = 0;
240
points.data32F[7] = 1;
241
242
let circle = cv.minEnclosingCircle(points);
243
244
assert.deepEqual(circle.center, {x: 0.5, y: 0.5});
245
assert.ok(Math.abs(circle.radius - Math.sqrt(2) / 2) < 0.001);
246
247
points.delete();
248
}
249
});
250
251
QUnit.test('test_filter', function(assert) {
252
// blur
253
{
254
let mat1 = cv.Mat.ones(5, 5, cv.CV_8UC3);
255
let mat2 = new cv.Mat();
256
257
cv.blur(mat1, mat2, {height: 3, width: 3}, {x: -1, y: -1}, cv.BORDER_DEFAULT);
258
259
// Verify result.
260
let size = mat2.size();
261
assert.equal(mat2.channels(), 3);
262
assert.equal(size.height, 5);
263
assert.equal(size.width, 5);
264
265
cv.blur(mat1, mat2, {height: 3, width: 3}, {x: -1, y: -1});
266
267
// Verify result.
268
size = mat2.size();
269
assert.equal(mat2.channels(), 3);
270
assert.equal(size.height, 5);
271
assert.equal(size.width, 5);
272
273
cv.blur(mat1, mat2, {height: 3, width: 3});
274
275
// Verify result.
276
size = mat2.size();
277
assert.equal(mat2.channels(), 3);
278
assert.equal(size.height, 5);
279
assert.equal(size.width, 5);
280
281
mat1.delete();
282
mat2.delete();
283
}
284
285
// GaussianBlur
286
{
287
let mat1 = cv.Mat.ones(7, 7, cv.CV_8UC1);
288
let mat2 = new cv.Mat();
289
290
cv.GaussianBlur(mat1, mat2, new cv.Size(3, 3), 0, 0, // eslint-disable-line new-cap
291
cv.BORDER_DEFAULT);
292
293
// Verify result.
294
let size = mat2.size();
295
assert.equal(mat2.channels(), 1);
296
assert.equal(size.height, 7);
297
assert.equal(size.width, 7);
298
}
299
300
// medianBlur
301
{
302
let mat1 = cv.Mat.ones(9, 9, cv.CV_8UC3);
303
let mat2 = new cv.Mat();
304
305
cv.medianBlur(mat1, mat2, 3);
306
307
// Verify result.
308
let size = mat2.size();
309
assert.equal(mat2.channels(), 3);
310
assert.equal(size.height, 9);
311
assert.equal(size.width, 9);
312
}
313
314
// Transpose
315
{
316
let mat1 = cv.Mat.eye(9, 9, cv.CV_8UC3);
317
let mat2 = new cv.Mat();
318
319
cv.transpose(mat1, mat2);
320
321
// Verify result.
322
let size = mat2.size();
323
assert.equal(mat2.channels(), 3);
324
assert.equal(size.height, 9);
325
assert.equal(size.width, 9);
326
}
327
328
// bilateralFilter
329
{
330
let mat1 = cv.Mat.ones(11, 11, cv.CV_8UC3);
331
let mat2 = new cv.Mat();
332
333
cv.bilateralFilter(mat1, mat2, 3, 6, 1.5, cv.BORDER_DEFAULT);
334
335
// Verify result.
336
let size = mat2.size();
337
assert.equal(mat2.channels(), 3);
338
assert.equal(size.height, 11);
339
assert.equal(size.width, 11);
340
341
// default parameters
342
cv.bilateralFilter(mat1, mat2, 3, 6, 1.5);
343
// Verify result.
344
size = mat2.size();
345
assert.equal(mat2.channels(), 3);
346
assert.equal(size.height, 11);
347
assert.equal(size.width, 11);
348
349
mat1.delete();
350
mat2.delete();
351
}
352
353
// Watershed
354
{
355
let mat = cv.Mat.ones(11, 11, cv.CV_8UC3);
356
let out = new cv.Mat(11, 11, cv.CV_32SC1);
357
358
cv.watershed(mat, out);
359
360
// Verify result.
361
let size = out.size();
362
assert.equal(out.channels(), 1);
363
assert.equal(size.height, 11);
364
assert.equal(size.width, 11);
365
assert.equal(out.elemSize1(), 4);
366
367
mat.delete();
368
out.delete();
369
}
370
371
// Concat
372
{
373
let mat = cv.Mat.ones({height: 10, width: 5}, cv.CV_8UC3);
374
let mat2 = cv.Mat.eye({height: 10, width: 5}, cv.CV_8UC3);
375
let mat3 = cv.Mat.eye({height: 10, width: 5}, cv.CV_8UC3);
376
377
378
let out = new cv.Mat();
379
let input = new cv.MatVector();
380
input.push_back(mat);
381
input.push_back(mat2);
382
input.push_back(mat3);
383
384
cv.vconcat(input, out);
385
386
// Verify result.
387
let size = out.size();
388
assert.equal(out.channels(), 3);
389
assert.equal(size.height, 30);
390
assert.equal(size.width, 5);
391
assert.equal(out.elemSize1(), 1);
392
393
cv.hconcat(input, out);
394
395
// Verify result.
396
size = out.size();
397
assert.equal(out.channels(), 3);
398
assert.equal(size.height, 10);
399
assert.equal(size.width, 15);
400
assert.equal(out.elemSize1(), 1);
401
402
input.delete();
403
out.delete();
404
}
405
406
407
// distanceTransform letiants
408
{
409
let mat = cv.Mat.ones(11, 11, cv.CV_8UC1);
410
let out = new cv.Mat(11, 11, cv.CV_32FC1);
411
let labels = new cv.Mat(11, 11, cv.CV_32FC1);
412
const maskSize = 3;
413
cv.distanceTransform(mat, out, cv.DIST_L2, maskSize, cv.CV_32F);
414
415
// Verify result.
416
let size = out.size();
417
assert.equal(out.channels(), 1);
418
assert.equal(size.height, 11);
419
assert.equal(size.width, 11);
420
assert.equal(out.elemSize1(), 4);
421
422
423
cv.distanceTransformWithLabels(mat, out, labels, cv.DIST_L2, maskSize,
424
cv.DIST_LABEL_CCOMP);
425
426
// Verify result.
427
size = out.size();
428
assert.equal(out.channels(), 1);
429
assert.equal(size.height, 11);
430
assert.equal(size.width, 11);
431
assert.equal(out.elemSize1(), 4);
432
433
size = labels.size();
434
assert.equal(labels.channels(), 1);
435
assert.equal(size.height, 11);
436
assert.equal(size.width, 11);
437
assert.equal(labels.elemSize1(), 4);
438
439
mat.delete();
440
out.delete();
441
labels.delete();
442
}
443
444
// Min, Max
445
{
446
let data1 = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9]);
447
let data2 = new Uint8Array([0, 4, 0, 8, 0, 12, 0, 16, 0]);
448
449
let expectedMin = new Uint8Array([0, 2, 0, 4, 0, 6, 0, 8, 0]);
450
let expectedMax = new Uint8Array([1, 4, 3, 8, 5, 12, 7, 16, 9]);
451
452
let dataPtr = cv._malloc(3*3*1);
453
let dataPtr2 = cv._malloc(3*3*1);
454
455
let dataHeap = new Uint8Array(cv.HEAPU8.buffer, dataPtr, 3*3*1);
456
dataHeap.set(new Uint8Array(data1.buffer));
457
458
let dataHeap2 = new Uint8Array(cv.HEAPU8.buffer, dataPtr2, 3*3*1);
459
dataHeap2.set(new Uint8Array(data2.buffer));
460
461
462
let mat1 = new cv.Mat(3, 3, cv.CV_8UC1, dataPtr, 0);
463
let mat2 = new cv.Mat(3, 3, cv.CV_8UC1, dataPtr2, 0);
464
465
let mat3 = new cv.Mat();
466
467
cv.min(mat1, mat2, mat3);
468
// Verify result.
469
let size = mat2.size();
470
assert.equal(mat2.channels(), 1);
471
assert.equal(size.height, 3);
472
assert.equal(size.width, 3);
473
474
assert.deepEqual(mat3.data, expectedMin);
475
476
477
cv.max(mat1, mat2, mat3);
478
// Verify result.
479
size = mat2.size();
480
assert.equal(mat2.channels(), 1);
481
assert.equal(size.height, 3);
482
assert.equal(size.width, 3);
483
484
assert.deepEqual(mat3.data, expectedMax);
485
486
cv._free(dataPtr);
487
cv._free(dataPtr2);
488
}
489
490
// Bitwise operations
491
{
492
let data1 = new Uint8Array([0, 1, 2, 4, 8, 16, 32, 64, 128]);
493
let data2 = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255, 255]);
494
495
let expectedAnd = new Uint8Array([0, 1, 2, 4, 8, 16, 32, 64, 128]);
496
let expectedOr = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255, 255]);
497
let expectedXor = new Uint8Array([255, 254, 253, 251, 247, 239, 223, 191, 127]);
498
499
let expectedNot = new Uint8Array([255, 254, 253, 251, 247, 239, 223, 191, 127]);
500
501
let dataPtr = cv._malloc(3*3*1);
502
let dataPtr2 = cv._malloc(3*3*1);
503
504
let dataHeap = new Uint8Array(cv.HEAPU8.buffer, dataPtr, 3*3*1);
505
dataHeap.set(new Uint8Array(data1.buffer));
506
507
let dataHeap2 = new Uint8Array(cv.HEAPU8.buffer, dataPtr2, 3*3*1);
508
dataHeap2.set(new Uint8Array(data2.buffer));
509
510
511
let mat1 = new cv.Mat(3, 3, cv.CV_8UC1, dataPtr, 0);
512
let mat2 = new cv.Mat(3, 3, cv.CV_8UC1, dataPtr2, 0);
513
514
let mat3 = new cv.Mat();
515
let none = new cv.Mat();
516
517
cv.bitwise_not(mat1, mat3, none);
518
// Verify result.
519
let size = mat3.size();
520
assert.equal(mat3.channels(), 1);
521
assert.equal(size.height, 3);
522
assert.equal(size.width, 3);
523
524
assert.deepEqual(mat3.data, expectedNot);
525
526
cv.bitwise_and(mat1, mat2, mat3, none);
527
// Verify result.
528
size = mat3.size();
529
assert.equal(mat3.channels(), 1);
530
assert.equal(size.height, 3);
531
assert.equal(size.width, 3);
532
533
assert.deepEqual(mat3.data, expectedAnd);
534
535
536
cv.bitwise_or(mat1, mat2, mat3, none);
537
// Verify result.
538
size = mat3.size();
539
assert.equal(mat3.channels(), 1);
540
assert.equal(size.height, 3);
541
assert.equal(size.width, 3);
542
543
assert.deepEqual(mat3.data, expectedOr);
544
545
cv.bitwise_xor(mat1, mat2, mat3, none);
546
// Verify result.
547
size = mat3.size();
548
assert.equal(mat3.channels(), 1);
549
assert.equal(size.height, 3);
550
assert.equal(size.width, 3);
551
552
assert.deepEqual(mat3.data, expectedXor);
553
554
cv._free(dataPtr);
555
cv._free(dataPtr2);
556
}
557
558
// Arithmetic operations
559
{
560
let data1 = new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8]);
561
let data2 = new Uint8Array([0, 2, 4, 6, 8, 10, 12, 14, 16]);
562
let data3 = new Uint8Array([0, 1, 0, 1, 0, 1, 0, 1, 0]);
563
564
// |data1 - data2|
565
let expectedAbsDiff = new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8]);
566
let expectedAdd = new Uint8Array([0, 3, 6, 9, 12, 15, 18, 21, 24]);
567
568
const alpha = 4;
569
const beta = -1;
570
const gamma = 3;
571
// 4*data1 - data2 + 3
572
let expectedWeightedAdd = new Uint8Array([3, 5, 7, 9, 11, 13, 15, 17, 19]);
573
574
let dataPtr = cv._malloc(3*3*1);
575
let dataPtr2 = cv._malloc(3*3*1);
576
let dataPtr3 = cv._malloc(3*3*1);
577
578
let dataHeap = new Uint8Array(cv.HEAPU8.buffer, dataPtr, 3*3*1);
579
dataHeap.set(new Uint8Array(data1.buffer));
580
let dataHeap2 = new Uint8Array(cv.HEAPU8.buffer, dataPtr2, 3*3*1);
581
dataHeap2.set(new Uint8Array(data2.buffer));
582
let dataHeap3 = new Uint8Array(cv.HEAPU8.buffer, dataPtr3, 3*3*1);
583
dataHeap3.set(new Uint8Array(data3.buffer));
584
585
let mat1 = new cv.Mat(3, 3, cv.CV_8UC1, dataPtr, 0);
586
let mat2 = new cv.Mat(3, 3, cv.CV_8UC1, dataPtr2, 0);
587
let mat3 = new cv.Mat(3, 3, cv.CV_8UC1, dataPtr3, 0);
588
589
let dst = new cv.Mat();
590
let none = new cv.Mat();
591
592
cv.absdiff(mat1, mat2, dst);
593
// Verify result.
594
let size = dst.size();
595
assert.equal(dst.channels(), 1);
596
assert.equal(size.height, 3);
597
assert.equal(size.width, 3);
598
599
assert.deepEqual(dst.data, expectedAbsDiff);
600
601
cv.add(mat1, mat2, dst, none, -1);
602
// Verify result.
603
size = dst.size();
604
assert.equal(dst.channels(), 1);
605
assert.equal(size.height, 3);
606
assert.equal(size.width, 3);
607
608
assert.deepEqual(dst.data, expectedAdd);
609
610
cv.addWeighted(mat1, alpha, mat2, beta, gamma, dst, -1);
611
// Verify result.
612
size = dst.size();
613
assert.equal(dst.channels(), 1);
614
assert.equal(size.height, 3);
615
assert.equal(size.width, 3);
616
617
assert.deepEqual(dst.data, expectedWeightedAdd);
618
619
// default parameter
620
cv.addWeighted(mat1, alpha, mat2, beta, gamma, dst);
621
// Verify result.
622
size = dst.size();
623
assert.equal(dst.channels(), 1);
624
assert.equal(size.height, 3);
625
assert.equal(size.width, 3);
626
627
assert.deepEqual(dst.data, expectedWeightedAdd);
628
629
mat1.delete();
630
mat2.delete();
631
mat3.delete();
632
dst.delete();
633
none.delete();
634
}
635
636
// Integral letiants
637
{
638
let mat = cv.Mat.eye({height: 100, width: 100}, cv.CV_8UC3);
639
let sum = new cv.Mat();
640
let sqSum = new cv.Mat();
641
let title = new cv.Mat();
642
643
cv.integral(mat, sum, -1);
644
645
// Verify result.
646
let size = sum.size();
647
assert.equal(sum.channels(), 3);
648
assert.equal(size.height, 100+1);
649
assert.equal(size.width, 100+1);
650
651
cv.integral2(mat, sum, sqSum, -1, -1);
652
// Verify result.
653
size = sum.size();
654
assert.equal(sum.channels(), 3);
655
assert.equal(size.height, 100+1);
656
assert.equal(size.width, 100+1);
657
658
size = sqSum.size();
659
assert.equal(sqSum.channels(), 3);
660
assert.equal(size.height, 100+1);
661
assert.equal(size.width, 100+1);
662
663
mat.delete();
664
sum.delete();
665
sqSum.delete();
666
title.delete();
667
}
668
669
// Mean, meanSTDev
670
{
671
let mat = cv.Mat.eye({height: 100, width: 100}, cv.CV_8UC3);
672
let sum = new cv.Mat();
673
let sqSum = new cv.Mat();
674
let title = new cv.Mat();
675
676
cv.integral(mat, sum, -1);
677
678
// Verify result.
679
let size = sum.size();
680
assert.equal(sum.channels(), 3);
681
assert.equal(size.height, 100+1);
682
assert.equal(size.width, 100+1);
683
684
cv.integral2(mat, sum, sqSum, -1, -1);
685
// Verify result.
686
size = sum.size();
687
assert.equal(sum.channels(), 3);
688
assert.equal(size.height, 100+1);
689
assert.equal(size.width, 100+1);
690
691
size = sqSum.size();
692
assert.equal(sqSum.channels(), 3);
693
assert.equal(size.height, 100+1);
694
assert.equal(size.width, 100+1);
695
696
mat.delete();
697
sum.delete();
698
sqSum.delete();
699
title.delete();
700
}
701
702
// Invert
703
{
704
let inv1 = new cv.Mat();
705
let inv2 = new cv.Mat();
706
let inv3 = new cv.Mat();
707
let inv4 = new cv.Mat();
708
709
710
let data1 = new Float32Array([1, 0, 0,
711
0, 1, 0,
712
0, 0, 1]);
713
let data2 = new Float32Array([0, 0, 0,
714
0, 5, 0,
715
0, 0, 0]);
716
let data3 = new Float32Array([1, 1, 1, 0,
717
0, 3, 1, 2,
718
2, 3, 1, 0,
719
1, 0, 2, 1]);
720
let data4 = new Float32Array([1, 4, 5,
721
4, 2, 2,
722
5, 2, 2]);
723
724
let expected1 = new Float32Array([1, 0, 0,
725
0, 1, 0,
726
0, 0, 1]);
727
// Inverse does not exist!
728
let expected3 = new Float32Array([-3, -1/2, 3/2, 1,
729
1, 1/4, -1/4, -1/2,
730
3, 1/4, -5/4, -1/2,
731
-3, 0, 1, 1]);
732
let expected4 = new Float32Array([0, -1, 1,
733
-1, 23/2, -9,
734
1, -9, 7]);
735
736
let dataPtr1 = cv._malloc(3*3*4);
737
let dataPtr2 = cv._malloc(3*3*4);
738
let dataPtr3 = cv._malloc(4*4*4);
739
let dataPtr4 = cv._malloc(3*3*4);
740
741
let dataHeap = new Float32Array(cv.HEAP32.buffer, dataPtr1, 3*3);
742
dataHeap.set(new Float32Array(data1.buffer));
743
let dataHeap2 = new Float32Array(cv.HEAP32.buffer, dataPtr2, 3*3);
744
dataHeap2.set(new Float32Array(data2.buffer));
745
let dataHeap3 = new Float32Array(cv.HEAP32.buffer, dataPtr3, 4*4);
746
dataHeap3.set(new Float32Array(data3.buffer));
747
let dataHeap4 = new Float32Array(cv.HEAP32.buffer, dataPtr4, 3*3);
748
dataHeap4.set(new Float32Array(data4.buffer));
749
750
let mat1 = new cv.Mat(3, 3, cv.CV_32FC1, dataPtr1, 0);
751
let mat2 = new cv.Mat(3, 3, cv.CV_32FC1, dataPtr2, 0);
752
let mat3 = new cv.Mat(4, 4, cv.CV_32FC1, dataPtr3, 0);
753
let mat4 = new cv.Mat(3, 3, cv.CV_32FC1, dataPtr4, 0);
754
755
QUnit.assert.deepEqualWithTolerance = function( value, expected, tolerance ) {
756
for (let i = 0; i < value.length; i= i+1) {
757
this.pushResult( {
758
result: Math.abs(value[i]-expected[i]) < tolerance,
759
actual: value[i],
760
expected: expected[i],
761
} );
762
}
763
};
764
765
cv.invert(mat1, inv1, 0);
766
// Verify result.
767
let size = inv1.size();
768
assert.equal(inv1.channels(), 1);
769
assert.equal(size.height, 3);
770
assert.equal(size.width, 3);
771
assert.deepEqualWithTolerance(inv1.data32F, expected1, 0.0001);
772
773
774
cv.invert(mat2, inv2, 0);
775
// Verify result.
776
assert.deepEqualWithTolerance(inv3.data32F, expected3, 0.0001);
777
778
cv.invert(mat3, inv3, 0);
779
// Verify result.
780
size = inv3.size();
781
assert.equal(inv3.channels(), 1);
782
assert.equal(size.height, 4);
783
assert.equal(size.width, 4);
784
assert.deepEqualWithTolerance(inv3.data32F, expected3, 0.0001);
785
786
cv.invert(mat3, inv3, 1);
787
// Verify result.
788
assert.deepEqualWithTolerance(inv3.data32F, expected3, 0.0001);
789
790
cv.invert(mat4, inv4, 2);
791
// Verify result.
792
assert.deepEqualWithTolerance(inv4.data32F, expected4, 0.0001);
793
794
cv.invert(mat4, inv4, 3);
795
// Verify result.
796
assert.deepEqualWithTolerance(inv4.data32F, expected4, 0.0001);
797
798
mat1.delete();
799
mat2.delete();
800
mat3.delete();
801
mat4.delete();
802
inv1.delete();
803
inv2.delete();
804
inv3.delete();
805
inv4.delete();
806
}
807
});
808
809