1 package org.opencv.test.core;
2 
3 import java.util.Arrays;
4 
5 import org.opencv.core.Core;
6 import org.opencv.core.CvException;
7 import org.opencv.core.CvType;
8 import org.opencv.core.Mat;
9 import org.opencv.core.Point;
10 import org.opencv.core.Range;
11 import org.opencv.core.Rect;
12 import org.opencv.core.Scalar;
13 import org.opencv.core.Size;
14 import org.opencv.test.OpenCVTestCase;
15 
16 public class MatTest extends OpenCVTestCase {
17 
testAdjustROI()18     public void testAdjustROI() {
19         Mat roi = gray0.submat(3, 5, 7, 10);
20         Mat originalroi = roi.clone();
21 
22         Mat adjusted = roi.adjustROI(2, 2, 2, 2);
23 
24         assertMatEqual(adjusted, roi);
25         assertSizeEquals(new Size(5, 6), adjusted.size(), EPS);
26         assertEquals(originalroi.type(), adjusted.type());
27         assertTrue(adjusted.isSubmatrix());
28         assertFalse(adjusted.isContinuous());
29 
30         Point offset = new Point();
31         Size size = new Size();
32         adjusted.locateROI(size, offset);
33         assertPointEquals(new Point(5, 1), offset, EPS);
34         assertSizeEquals(gray0.size(), size, EPS);
35     }
36 
testAssignToMat()37     public void testAssignToMat() {
38         gray0.assignTo(dst);
39 
40         assertMatEqual(gray0, dst);
41 
42         gray255.assignTo(dst);
43 
44         assertMatEqual(gray255, dst);
45     }
46 
testAssignToMatInt()47     public void testAssignToMatInt() {
48         gray255.assignTo(dst, CvType.CV_32F);
49 
50         assertMatEqual(gray255_32f, dst, EPS);
51     }
52 
testChannels()53     public void testChannels() {
54         assertEquals(1, gray0.channels());
55         assertEquals(3, rgbLena.channels());
56         assertEquals(4, rgba0.channels());
57     }
58 
testCheckVectorInt()59     public void testCheckVectorInt() {
60         // ! returns N if the matrix is 1-channel (N x ptdim) or ptdim-channel
61         // (1 x N) or (N x 1); negative number otherwise
62         assertEquals(2, new Mat(2, 10, CvType.CV_8U).checkVector(10));
63         assertEquals(2, new Mat(1, 2, CvType.CV_8UC(10)).checkVector(10));
64         assertEquals(2, new Mat(2, 1, CvType.CV_8UC(10)).checkVector(10));
65         assertEquals(10, new Mat(1, 10, CvType.CV_8UC2).checkVector(2));
66 
67         assertTrue(0 > new Mat().checkVector(0));
68         assertTrue(0 > new Mat(10, 1, CvType.CV_8U).checkVector(10));
69         assertTrue(0 > new Mat(10, 20, CvType.CV_8U).checkVector(10));
70     }
71 
testCheckVectorIntInt()72     public void testCheckVectorIntInt() {
73         assertEquals(2, new Mat(2, 10, CvType.CV_8U).checkVector(10, CvType.CV_8U));
74         assertEquals(2, new Mat(1, 2, CvType.CV_8UC(10)).checkVector(10, CvType.CV_8U));
75         assertEquals(2, new Mat(2, 1, CvType.CV_8UC(10)).checkVector(10, CvType.CV_8U));
76         assertEquals(10, new Mat(1, 10, CvType.CV_8UC2).checkVector(2, CvType.CV_8U));
77 
78         assertTrue(0 > new Mat(2, 10, CvType.CV_8U).checkVector(10, CvType.CV_8S));
79         assertTrue(0 > new Mat(1, 2, CvType.CV_8UC(10)).checkVector(10, CvType.CV_8S));
80         assertTrue(0 > new Mat(2, 1, CvType.CV_8UC(10)).checkVector(10, CvType.CV_8S));
81         assertTrue(0 > new Mat(1, 10, CvType.CV_8UC2).checkVector(10, CvType.CV_8S));
82     }
83 
testCheckVectorIntIntBoolean()84     public void testCheckVectorIntIntBoolean() {
85         Mat mm = new Mat(5, 1, CvType.CV_8UC(10));
86         Mat roi = new Mat(5, 3, CvType.CV_8UC(10)).submat(1, 3, 2, 3);
87 
88         assertEquals(5, mm.checkVector(10, CvType.CV_8U, true));
89         assertEquals(5, mm.checkVector(10, CvType.CV_8U, false));
90         assertEquals(2, roi.checkVector(10, CvType.CV_8U, false));
91         assertTrue(0 > roi.checkVector(10, CvType.CV_8U, true));
92     }
93 
testClone()94     public void testClone() {
95         dst = gray0.clone();
96         assertMatEqual(gray0, dst);
97         assertFalse(gray0.getNativeObjAddr() == dst.getNativeObjAddr());
98         assertFalse(gray0.dataAddr() == dst.dataAddr());
99     }
100 
testCol()101     public void testCol() {
102         Mat col = gray0.col(0);
103         assertEquals(1, col.cols());
104         assertEquals(gray0.rows(), col.rows());
105     }
106 
testColRangeIntInt()107     public void testColRangeIntInt() {
108         Mat cols = gray0.colRange(0, gray0.cols() / 2);
109 
110         assertEquals(gray0.cols() / 2, cols.cols());
111         assertEquals(gray0.rows(), cols.rows());
112     }
113 
testColRangeRange()114     public void testColRangeRange() {
115         Range range = new Range(0, 5);
116         dst = gray0.colRange(range);
117 
118         truth = new Mat(10, 5, CvType.CV_8UC1, new Scalar(0.0));
119         assertMatEqual(truth, dst);
120     }
121 
testCols()122     public void testCols() {
123         assertEquals(matSize, gray0.cols());
124     }
125 
testConvertToMatInt()126     public void testConvertToMatInt() {
127         gray255.convertTo(dst, CvType.CV_32F);
128 
129         truth = new Mat(matSize, matSize, CvType.CV_32F, new Scalar(255));
130         assertMatEqual(truth, dst, EPS);
131     }
132 
testConvertToMatIntDouble()133     public void testConvertToMatIntDouble() {
134         gray2.convertTo(dst, CvType.CV_16U, 2.0);
135 
136         truth = new Mat(matSize, matSize, CvType.CV_16U, new Scalar(4));
137         assertMatEqual(truth, dst);
138     }
139 
testConvertToMatIntDoubleDouble()140     public void testConvertToMatIntDoubleDouble() {
141         gray0_32f.convertTo(dst, CvType.CV_8U, 2.0, 4.0);
142 
143         truth = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(4));
144         assertMatEqual(truth, dst);
145     }
146 
testCopyToMat()147     public void testCopyToMat() {
148         rgbLena.copyTo(dst);
149         assertMatEqual(rgbLena, dst);
150     }
151 
testCopyToMatMat()152     public void testCopyToMatMat() {
153         Mat src = new Mat(4, 4, CvType.CV_8U, new Scalar(5));
154         Mat mask = makeMask(src.clone());
155 
156         src.copyTo(dst, mask);
157 
158         truth = new Mat(4, 4, CvType.CV_8U) {
159             {
160                 put(0, 0, 0, 0, 5, 5);
161                 put(1, 0, 0, 0, 5, 5);
162                 put(2, 0, 0, 0, 5, 5);
163                 put(3, 0, 0, 0, 5, 5);
164             }
165         };
166         assertMatEqual(truth, dst);
167 
168     }
169 
testCreateIntIntInt()170     public void testCreateIntIntInt() {
171         gray255.create(4, 5, CvType.CV_32F);
172 
173         assertEquals(4, gray255.rows());
174         assertEquals(5, gray255.cols());
175         assertEquals(CvType.CV_32F, gray255.type());
176     }
177 
testCreateSizeInt()178     public void testCreateSizeInt() {
179         Size size = new Size(5, 5);
180         dst.create(size, CvType.CV_16U);
181 
182         assertEquals(5, dst.rows());
183         assertEquals(5, dst.cols());
184         assertEquals(CvType.CV_16U, dst.type());
185     }
186 
testCross()187     public void testCross() {
188         Mat answer = new Mat(1, 3, CvType.CV_32F);
189         answer.put(0, 0, 7.0, 1.0, -5.0);
190 
191         Mat cross = v1.cross(v2);
192         assertMatEqual(answer, cross, EPS);
193     }
194 
testDataAddr()195     public void testDataAddr() {
196         assertTrue(0 != gray0.dataAddr());
197         assertEquals(0, new Mat().dataAddr());
198     }
199 
testDepth()200     public void testDepth() {
201         assertEquals(CvType.CV_8U, gray0.depth());
202         assertEquals(CvType.CV_32F, gray0_32f.depth());
203     }
204 
testDiag()205     public void testDiag() {
206         dst = gray0.diag();
207 
208         truth = new Mat(10, 1, CvType.CV_8UC1, new Scalar(0));
209         assertMatEqual(truth, dst);
210     }
211 
testDiagInt()212     public void testDiagInt() {
213         dst = gray255.diag(2);
214 
215         truth = new Mat(8, 1, CvType.CV_8UC1, new Scalar(255));
216         assertMatEqual(truth, dst);
217     }
218 
testDiagMat()219     public void testDiagMat() {
220         Mat diagVector = new Mat(matSize, 1, CvType.CV_32F, new Scalar(1));
221 
222         dst = Mat.diag(diagVector);
223 
224         assertMatEqual(grayE_32f, dst, EPS);
225     }
226 
testDiagMat_sqrMatrix()227     public void testDiagMat_sqrMatrix() {
228         try {
229             dst = Mat.diag(gray255);
230         } catch (CvException e) {
231             // expected
232         }
233     }
234 
testDot()235     public void testDot() {
236         double s = v1.dot(v2);
237         assertEquals(11.0, s);
238     }
239 
testDump()240     public void testDump() {
241         assertEquals("[1, 3, 2]", v1.dump());
242     }
243 
testElemSize()244     public void testElemSize() {
245         assertEquals(Byte.SIZE / 8 * gray0.channels(), gray0.elemSize());
246         assertEquals(Float.SIZE / 8 * gray0_32f.channels(), gray0_32f.elemSize());
247         assertEquals(Byte.SIZE / 8 * rgbLena.channels(), rgbLena.elemSize());
248     }
249 
testElemSize1()250     public void testElemSize1() {
251         assertEquals(Byte.SIZE / 8, gray255.elemSize1());
252         assertEquals(Double.SIZE / 8, gray0_64f.elemSize1());
253         assertEquals(Byte.SIZE / 8, rgbLena.elemSize1());
254     }
255 
testEmpty()256     public void testEmpty() {
257         assertTrue(dst.empty());
258         assertTrue(!gray0.empty());
259     }
260 
testEyeIntIntInt()261     public void testEyeIntIntInt() {
262         Mat eye = Mat.eye(3, 3, CvType.CV_32FC1);
263 
264         assertMatEqual(eye, eye.inv(), EPS);
265     }
266 
testEyeSizeInt()267     public void testEyeSizeInt() {
268         Size size = new Size(5, 5);
269 
270         Mat eye = Mat.eye(size, CvType.CV_32S);
271 
272         assertEquals(5, Core.countNonZero(eye));
273 
274     }
275 
getTestMat(int size, int type)276     public Mat getTestMat(int size, int type) {
277         Mat m = new Mat(size, size, type);
278         final int ch = CvType.channels(type);
279         double buff[] = new double[size*size * ch];
280         for(int i=0; i<size; i++)
281             for(int j=0; j<size; j++)
282                 for(int k=0; k<ch; k++) {
283                     buff[i*size*ch + j*ch + k] = 100*i + 10*j + k;
284                 }
285         m.put(0, 0, buff);
286         return m;
287     }
288 
testGetIntInt_8U()289     public void testGetIntInt_8U() {
290         Mat m = getTestMat(5, CvType.CV_8UC2);
291 
292         // whole Mat
293         assertTrue(Arrays.equals(new double[] {0, 1}, m.get(0, 0)));
294         assertTrue(Arrays.equals(new double[] {240, 241}, m.get(2, 4)));
295         assertTrue(Arrays.equals(new double[] {255, 255}, m.get(4, 4)));
296 
297         // sub-Mat
298         Mat sm = m.submat(2, 4, 3, 5);
299         assertTrue(Arrays.equals(new double[] {230, 231}, sm.get(0, 0)));
300         assertTrue(Arrays.equals(new double[] {255, 255}, sm.get(1, 1)));
301     }
302 
testGetIntInt_32S()303     public void testGetIntInt_32S() {
304         Mat m = getTestMat(5, CvType.CV_32SC3);
305 
306         // whole Mat
307         assertTrue(Arrays.equals(new double[] {0, 1, 2}, m.get(0, 0)));
308         assertTrue(Arrays.equals(new double[] {240, 241, 242}, m.get(2, 4)));
309         assertTrue(Arrays.equals(new double[] {440, 441, 442}, m.get(4, 4)));
310 
311         // sub-Mat
312         Mat sm = m.submat(2, 4, 3, 5);
313         assertTrue(Arrays.equals(new double[] {230, 231, 232}, sm.get(0, 0)));
314         assertTrue(Arrays.equals(new double[] {340, 341, 342}, sm.get(1, 1)));
315     }
316 
testGetIntInt_64F()317     public void testGetIntInt_64F() {
318         Mat m = getTestMat(5, CvType.CV_64FC1);
319 
320         // whole Mat
321         assertTrue(Arrays.equals(new double[] {0}, m.get(0, 0)));
322         assertTrue(Arrays.equals(new double[] {240}, m.get(2, 4)));
323         assertTrue(Arrays.equals(new double[] {440}, m.get(4, 4)));
324 
325         // sub-Mat
326         Mat sm = m.submat(2, 4, 3, 5);
327         assertTrue(Arrays.equals(new double[] {230}, sm.get(0, 0)));
328         assertTrue(Arrays.equals(new double[] {340}, sm.get(1, 1)));
329     }
330 
testGetIntIntByteArray()331     public void testGetIntIntByteArray() {
332         Mat m = getTestMat(5, CvType.CV_8UC3);
333         byte[] goodData = new byte[9];
334         byte[] badData = new byte[7];
335 
336         // whole Mat
337         int bytesNum = m.get(1, 1, goodData);
338 
339         assertEquals(9, bytesNum);
340         assertTrue(Arrays.equals(new byte[] { 110, 111, 112, 120, 121, 122, (byte) 130, (byte) 131, (byte) 132 }, goodData));
341 
342         try {
343             m.get(2, 2, badData);
344             fail("Expected UnsupportedOperationException (data.length % CvType.channels(t) != 0)");
345         } catch (UnsupportedOperationException e) {
346             // expected
347         }
348 
349         // sub-Mat
350         Mat sm = m.submat(2, 4, 3, 5);
351         byte buff00[] = new byte[3];
352         bytesNum = sm.get(0, 0, buff00);
353         assertEquals(3, bytesNum);
354         assertTrue(Arrays.equals(new byte[] {(byte) 230, (byte) 231, (byte) 232}, buff00));
355         byte buff11[] = new byte[3];
356         bytesNum = sm.get(1, 1, buff11);
357         assertEquals(3, bytesNum);
358         assertTrue(Arrays.equals(new byte[] {(byte) 255, (byte) 255, (byte) 255}, buff11));
359     }
360 
testGetIntIntDoubleArray()361     public void testGetIntIntDoubleArray() {
362         Mat m = getTestMat(5, CvType.CV_64F);
363         double buff[] = new double[4];
364 
365         // whole Mat
366         int bytesNum = m.get(1, 1, buff);
367 
368         assertEquals(32, bytesNum);
369         assertTrue(Arrays.equals(new double[] { 110, 120, 130, 140 }, buff));
370 
371         // sub-Mat
372         Mat sm = m.submat(2, 4, 3, 5);
373         double buff00[] = new double[2];
374         bytesNum = sm.get(0, 0, buff00);
375         assertEquals(16, bytesNum);
376         assertTrue(Arrays.equals(new double[] {230, 240}, buff00));
377         double buff11[] = new double[] {0, 0};
378         bytesNum = sm.get(1, 1, buff11);
379         assertEquals(8, bytesNum);
380         assertTrue(Arrays.equals(new double[] {340, 0}, buff11));
381 }
382 
testGetIntIntFloatArray()383     public void testGetIntIntFloatArray() {
384         Mat m = getTestMat(5, CvType.CV_32F);
385         float buff[] = new float[4];
386 
387         // whole Mat
388         int bytesNum = m.get(1, 1, buff);
389 
390         assertEquals(16, bytesNum);
391         assertTrue(Arrays.equals(new float[] { 110, 120, 130, 140 }, buff));
392 
393         // sub-Mat
394         Mat sm = m.submat(2, 4, 3, 5);
395         float buff00[] = new float[2];
396         bytesNum = sm.get(0, 0, buff00);
397         assertEquals(8, bytesNum);
398         assertTrue(Arrays.equals(new float[] {230, 240}, buff00));
399         float buff11[] = new float[] {0, 0};
400         bytesNum = sm.get(1, 1, buff11);
401         assertEquals(4, bytesNum);
402         assertTrue(Arrays.equals(new float[] {340, 0}, buff11));
403     }
404 
testGetIntIntIntArray()405     public void testGetIntIntIntArray() {
406         Mat m = getTestMat(5, CvType.CV_32SC2);
407         int[] buff = new int[6];
408 
409         // whole Mat
410         int bytesNum = m.get(1, 1, buff);
411 
412         assertEquals(24, bytesNum);
413         assertTrue(Arrays.equals(new int[] { 110, 111, 120, 121, 130, 131 }, buff));
414 
415         // sub-Mat
416         Mat sm = m.submat(2, 4, 3, 5);
417         int buff00[] = new int[4];
418         bytesNum = sm.get(0, 0, buff00);
419         assertEquals(16, bytesNum);
420         assertTrue(Arrays.equals(new int[] {230, 231, 240, 241}, buff00));
421         int buff11[] = new int[]{0, 0, 0, 0};
422         bytesNum = sm.get(1, 1, buff11);
423         assertEquals(8, bytesNum);
424         assertTrue(Arrays.equals(new int[] {340, 341, 0, 0}, buff11));
425     }
426 
testGetIntIntShortArray()427     public void testGetIntIntShortArray() {
428         Mat m = getTestMat(5, CvType.CV_16SC2);
429         short[] buff = new short[6];
430 
431         // whole Mat
432         int bytesNum = m.get(1, 1, buff);
433 
434         assertEquals(12, bytesNum);
435         assertTrue(Arrays.equals(new short[] { 110, 111, 120, 121, 130, 131 }, buff));
436 
437         // sub-Mat
438         Mat sm = m.submat(2, 4, 3, 5);
439         short buff00[] = new short[4];
440         bytesNum = sm.get(0, 0, buff00);
441         assertEquals(8, bytesNum);
442         assertTrue(Arrays.equals(new short[] {230, 231, 240, 241}, buff00));
443         short buff11[] = new short[]{0, 0, 0, 0};
444         bytesNum = sm.get(1, 1, buff11);
445         assertEquals(4, bytesNum);
446         assertTrue(Arrays.equals(new short[] {340, 341, 0, 0}, buff11));
447     }
448 
testGetNativeObjAddr()449     public void testGetNativeObjAddr() {
450         assertTrue(0 != gray0.getNativeObjAddr());
451     }
452 
testHeight()453     public void testHeight() {
454         assertEquals(gray0.rows(), gray0.height());
455         assertEquals(rgbLena.rows(), rgbLena.height());
456         assertEquals(rgba128.rows(), rgba128.height());
457     }
458 
testInv()459     public void testInv() {
460         dst = grayE_32f.inv();
461         assertMatEqual(grayE_32f, dst, EPS);
462     }
463 
testInvInt()464     public void testInvInt() {
465         Mat src = new Mat(2, 2, CvType.CV_32F) {
466             {
467                 put(0, 0, 1.0);
468                 put(0, 1, 2.0);
469                 put(1, 0, 1.5);
470                 put(1, 1, 4.0);
471             }
472         };
473 
474         dst = src.inv(Core.DECOMP_CHOLESKY);
475 
476         truth = new Mat(2, 2, CvType.CV_32F) {
477             {
478                 put(0, 0, 4.0);
479                 put(0, 1, -2.0);
480                 put(1, 0, -1.5);
481                 put(1, 1, 1.0);
482             }
483         };
484 
485         assertMatEqual(truth, dst, EPS);
486     }
487 
testIsContinuous()488     public void testIsContinuous() {
489         assertTrue(gray0.isContinuous());
490 
491         Mat subMat = gray0.submat(0, 0, gray0.rows() / 2, gray0.cols() / 2);
492         assertFalse(subMat.isContinuous());
493     }
494 
testIsSubmatrix()495     public void testIsSubmatrix() {
496         assertFalse(gray0.isSubmatrix());
497         Mat subMat = gray0.submat(0, 0, gray0.rows() / 2, gray0.cols() / 2);
498         assertTrue(subMat.isSubmatrix());
499     }
500 
testLocateROI()501     public void testLocateROI() {
502         Mat roi = gray0.submat(3, 5, 7, 10);
503         Point offset = new Point();
504         Size size = new Size();
505 
506         roi.locateROI(size, offset);
507 
508         assertPointEquals(new Point(7, 3), offset, EPS);
509         assertSizeEquals(new Size(10, 10), size, EPS);
510     }
511 
testMat()512     public void testMat() {
513         Mat m = new Mat();
514         assertNotNull(m);
515         assertTrue(m.empty());
516     }
517 
testMatIntIntCvType()518     public void testMatIntIntCvType() {
519         Mat gray = new Mat(1, 1, CvType.CV_8UC1);
520         assertFalse(gray.empty());
521 
522         Mat rgb = new Mat(1, 1, CvType.CV_8UC3);
523         assertFalse(rgb.empty());
524     }
525 
testMatIntIntCvTypeScalar()526     public void testMatIntIntCvTypeScalar() {
527         dst = new Mat(gray127.rows(), gray127.cols(), CvType.CV_8U, new Scalar(127));
528         assertFalse(dst.empty());
529         assertMatEqual(dst, gray127);
530 
531         dst = new Mat(rgba128.rows(), rgba128.cols(), CvType.CV_8UC4, Scalar.all(128));
532         assertFalse(dst.empty());
533         assertMatEqual(dst, rgba128);
534     }
535 
testMatIntIntInt()536     public void testMatIntIntInt() {
537         Mat gray = new Mat(1, 1, CvType.CV_8U);
538         assertFalse(gray.empty());
539 
540         Mat rgb = new Mat(1, 1, CvType.CV_8U);
541         assertFalse(rgb.empty());
542     }
543 
testMatIntIntIntScalar()544     public void testMatIntIntIntScalar() {
545         Mat m1 = new Mat(gray127.rows(), gray127.cols(), CvType.CV_8U, new Scalar(127));
546         assertFalse(m1.empty());
547         assertMatEqual(m1, gray127);
548 
549         Mat m2 = new Mat(gray0_32f.rows(), gray0_32f.cols(), CvType.CV_32F, new Scalar(0));
550         assertFalse(m2.empty());
551         assertMatEqual(m2, gray0_32f, EPS);
552     }
553 
testMatMatRange()554     public void testMatMatRange() {
555         dst = new Mat(gray0, new Range(0, 5));
556 
557         truth = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0));
558         assertFalse(dst.empty());
559         assertMatEqual(truth, dst);
560     }
561 
testMatMatRangeRange()562     public void testMatMatRangeRange() {
563         dst = new Mat(gray255_32f, new Range(0, 5), new Range(0, 5));
564 
565         truth = new Mat(5, 5, CvType.CV_32FC1, new Scalar(255));
566 
567         assertFalse(dst.empty());
568         assertMatEqual(truth, dst, EPS);
569     }
570 
testMatMatRect()571     public void testMatMatRect() {
572         Mat m = new Mat(7, 6, CvType.CV_32SC1);
573         m.put(0,  0,
574                  0,  1,  2,  3,  4,  5,
575                 10, 11, 12, 13, 14, 15,
576                 20, 21, 22, 23, 24, 25,
577                 30, 31, 32, 33, 34, 35,
578                 40, 41, 42, 43, 44, 45,
579                 50, 51, 52, 53, 54, 55,
580                 60, 61, 62, 63, 64, 65 );
581 
582         dst = new Mat(m, new Rect(1, 2, 3, 4));
583 
584         truth = new Mat(4, 3, CvType.CV_32SC1);
585         truth.put(0,  0,
586                 21, 22, 23,
587                 31, 32, 33,
588                 41, 42, 43,
589                 51, 52, 53 );
590 
591         assertFalse(dst.empty());
592         assertMatEqual(truth, dst);
593     }
594 
testMatSizeInt()595     public void testMatSizeInt() {
596         dst = new Mat(new Size(10, 10), CvType.CV_8U);
597 
598         assertFalse(dst.empty());
599     }
600 
testMatSizeIntScalar()601     public void testMatSizeIntScalar() {
602         dst = new Mat(new Size(10, 10), CvType.CV_32F, new Scalar(255));
603 
604         assertFalse(dst.empty());
605         assertMatEqual(gray255_32f, dst, EPS);
606     }
607 
testMulMat()608     public void testMulMat() {
609         assertMatEqual(gray0, gray0.mul(gray255));
610 
611         Mat m1 = new Mat(2, 2, CvType.CV_32F, new Scalar(2));
612         Mat m2 = new Mat(2, 2, CvType.CV_32F, new Scalar(3));
613 
614         dst = m1.mul(m2);
615 
616         truth = new Mat(2, 2, CvType.CV_32F, new Scalar(6));
617         assertMatEqual(truth, dst, EPS);
618 
619     }
620 
testMulMatDouble()621     public void testMulMatDouble() {
622         Mat m1 = new Mat(2, 2, CvType.CV_32F, new Scalar(2));
623         Mat m2 = new Mat(2, 2, CvType.CV_32F, new Scalar(3));
624 
625         dst = m1.mul(m2, 3.0);
626 
627         truth = new Mat(2, 2, CvType.CV_32F, new Scalar(18));
628         assertMatEqual(truth, dst, EPS);
629     }
630 
testOnesIntIntInt()631     public void testOnesIntIntInt() {
632         dst = Mat.ones(matSize, matSize, CvType.CV_32F);
633 
634         truth = new Mat(matSize, matSize, CvType.CV_32F, new Scalar(1));
635         assertMatEqual(truth, dst, EPS);
636     }
637 
testOnesSizeInt()638     public void testOnesSizeInt() {
639         dst = Mat.ones(new Size(2, 2), CvType.CV_16S);
640         truth = new Mat(2, 2, CvType.CV_16S, new Scalar(1));
641         assertMatEqual(truth, dst);
642     }
643 
testPush_back()644     public void testPush_back() {
645         Mat m1 = new Mat(2, 4, CvType.CV_32F, new Scalar(2));
646         Mat m2 = new Mat(3, 4, CvType.CV_32F, new Scalar(3));
647 
648         m1.push_back(m2);
649 
650         truth = new Mat(5, 4, CvType.CV_32FC1) {
651             {
652                 put(0, 0, 2, 2, 2, 2);
653                 put(1, 0, 2, 2, 2, 2);
654                 put(2, 0, 3, 3, 3, 3);
655                 put(3, 0, 3, 3, 3, 3);
656                 put(4, 0, 3, 3, 3, 3);
657             }
658         };
659 
660         assertMatEqual(truth, m1, EPS);
661     }
662 
testPutIntIntByteArray()663     public void testPutIntIntByteArray() {
664         Mat m = new Mat(5, 5, CvType.CV_8UC3, new Scalar(1, 2, 3));
665         Mat sm = m.submat(2, 4, 3, 5);
666         byte[] buff  = new byte[] { 0, 0, 0, 0, 0, 0 };
667         byte[] buff0 = new byte[] { 10, 20, 30, 40, 50, 60 };
668         byte[] buff1 = new byte[] { -1, -2, -3, -4, -5, -6 };
669 
670         int bytesNum = m.put(1, 2, buff0);
671 
672         assertEquals(6, bytesNum);
673         bytesNum = m.get(1, 2, buff);
674         assertEquals(6, bytesNum);
675         assertTrue(Arrays.equals(buff, buff0));
676 
677         bytesNum = sm.put(0, 0, buff1);
678 
679         assertEquals(6, bytesNum);
680         bytesNum = sm.get(0, 0, buff);
681         assertEquals(6, bytesNum);
682         assertTrue(Arrays.equals(buff, buff1));
683         bytesNum = m.get(2, 3, buff);
684         assertEquals(6, bytesNum);
685         assertTrue(Arrays.equals(buff, buff1));
686 
687         Mat m1 = m.row(1);
688         bytesNum = m1.get(0, 2, buff);
689         assertEquals(6, bytesNum);
690         assertTrue(Arrays.equals(buff, buff0));
691 
692         try {
693             byte[] bytes2 = new byte[] { 10, 20, 30, 40, 50 };
694             m.put(2, 2, bytes2);
695             fail("Expected UnsupportedOperationException (data.length % CvType.channels(t) != 0)");
696         } catch (UnsupportedOperationException e) {
697             // expected
698         }
699     }
700 
testPutIntIntDoubleArray()701     public void testPutIntIntDoubleArray() {
702         Mat m = new Mat(5, 5, CvType.CV_8UC3, new Scalar(1, 2, 3));
703         Mat sm = m.submat(2, 4, 3, 5);
704         byte[] buff  = new byte[] { 0, 0, 0, 0, 0, 0 };
705 
706         int bytesNum = m.put(1, 2, 10, 20, 30, 40, 50, 60);
707 
708         assertEquals(6, bytesNum);
709         bytesNum = m.get(1, 2, buff);
710         assertEquals(6, bytesNum);
711         assertTrue(Arrays.equals(buff, new byte[]{10, 20, 30, 40, 50, 60}));
712 
713         bytesNum = sm.put(0, 0, 255, 254, 253, 252, 251, 250);
714 
715         assertEquals(6, bytesNum);
716         bytesNum = sm.get(0, 0, buff);
717         assertEquals(6, bytesNum);
718         assertTrue(Arrays.equals(buff, new byte[]{-1, -2, -3, -4, -5, -6}));
719         bytesNum = m.get(2, 3, buff);
720         assertEquals(6, bytesNum);
721         assertTrue(Arrays.equals(buff, new byte[]{-1, -2, -3, -4, -5, -6}));
722     }
723 
testPutIntIntFloatArray()724     public void testPutIntIntFloatArray() {
725         Mat m = new Mat(5, 5, CvType.CV_32FC3, new Scalar(1, 2, 3));
726         float[] elements = new float[] { 10, 20, 30, 40, 50, 60 };
727 
728         int bytesNum = m.put(4, 3, elements);
729 
730         assertEquals(elements.length * 4, bytesNum);
731         Mat m1 = m.row(4);
732         float buff[] = new float[3];
733         bytesNum = m1.get(0, 4, buff);
734         assertEquals(buff.length * 4, bytesNum);
735         assertTrue(Arrays.equals(new float[]{40, 50, 60}, buff));
736         assertArrayEquals(new double[]{10, 20, 30}, m.get(4, 3), EPS);
737 
738         try {
739             float[] elements2 = new float[] { 10, 20, 30, 40, 50 };
740             m.put(2, 2, elements2);
741             fail("Expected UnsupportedOperationException (data.length % CvType.channels(t) != 0)");
742         } catch (UnsupportedOperationException e) {
743             // expected
744         }
745     }
746 
testPutIntIntIntArray()747     public void testPutIntIntIntArray() {
748         Mat m = new Mat(5, 5, CvType.CV_32SC3, new Scalar(-1, -2, -3));
749         int[] elements = new int[] { 10, 20, 30, 40, 50, 60 };
750 
751         int bytesNum = m.put(0, 4, elements);
752 
753         assertEquals(elements.length * 4, bytesNum);
754         Mat m1 = m.col(4);
755         int buff[] = new int[3];
756         bytesNum = m1.get(0, 0, buff);
757         assertEquals(buff.length * 4, bytesNum);
758         assertTrue(Arrays.equals(new int[]{10, 20, 30}, buff));
759         assertArrayEquals(new double[]{40, 50, 60}, m.get(1, 0), EPS);
760 
761         try {
762             int[] elements2 = new int[] { 10, 20, 30, 40, 50 };
763             m.put(2, 2, elements2);
764             fail("Expected UnsupportedOperationException (data.length % CvType.channels(t) != 0)");
765         } catch (UnsupportedOperationException e) {
766             // expected
767         }
768     }
769 
testPutIntIntShortArray()770     public void testPutIntIntShortArray() {
771         Mat m = new Mat(5, 5, CvType.CV_16SC3, new Scalar(-1, -2, -3));
772         short[] elements = new short[] { 10, 20, 30, 40, 50, 60 };
773 
774         int bytesNum = m.put(2, 3, elements);
775 
776         assertEquals(elements.length * 2, bytesNum);
777         Mat m1 = m.col(3);
778         short buff[] = new short[3];
779         bytesNum = m1.get(2, 0, buff);
780         assertTrue(Arrays.equals(new short[]{10, 20, 30}, buff));
781         assertArrayEquals(new double[]{40, 50, 60}, m.get(2, 4), EPS);
782 
783         try {
784             short[] elements2 = new short[] { 10, 20, 30, 40, 50 };
785             m.put(2, 2, elements2);
786             fail("Expected UnsupportedOperationException (data.length % CvType.channels(t) != 0)");
787         } catch (UnsupportedOperationException e) {
788             // expected
789         }
790     }
791 
testRelease()792     public void testRelease() {
793         assertFalse(gray0.empty());
794         assertTrue(gray0.rows() > 0);
795 
796         gray0.release();
797 
798         assertTrue(gray0.empty());
799         assertEquals(0, gray0.rows());
800         assertEquals(0, gray0.dataAddr());
801     }
802 
testReshapeInt()803     public void testReshapeInt() {
804         Mat src = new Mat(4, 4, CvType.CV_8U, new Scalar(0));
805         dst = src.reshape(4);
806 
807         truth = new Mat(4, 1, CvType.CV_8UC4, new Scalar(0));
808         assertMatEqual(truth, dst);
809     }
810 
testReshapeIntInt()811     public void testReshapeIntInt() {
812         Mat src = new Mat(5, 7, CvType.CV_8U, new Scalar(0));
813         dst = src.reshape(7, 5);
814 
815         truth = new Mat(5, 1, CvType.CV_8UC(7), new Scalar(0));
816         assertMatEqual(truth, dst);
817     }
818 
testRow()819     public void testRow() {
820         Mat row = gray0.row(0);
821         assertEquals(1, row.rows());
822         assertEquals(gray0.cols(), row.cols());
823     }
824 
testRowRangeIntInt()825     public void testRowRangeIntInt() {
826         Mat rows = gray0.rowRange(0, gray0.rows() / 2);
827         assertEquals(gray0.rows() / 2, rows.rows());
828         assertEquals(gray0.cols(), rows.cols());
829     }
830 
testRowRangeRange()831     public void testRowRangeRange() {
832         Mat rows = gray255.rowRange(new Range(0, 5));
833 
834         assertEquals(gray255.rows() / 2, rows.rows());
835         assertEquals(gray255.cols(), rows.cols());
836     }
837 
testRows()838     public void testRows() {
839         assertEquals(matSize, gray0.rows());
840     }
841 
testSetToMat()842     public void testSetToMat() {
843         Mat vals = new Mat(7, 1, CvType.CV_8U) {
844             {
845                 put(0, 0, 1, 2, 3, 4, 5, 6, 7);
846             }
847         };
848         Mat dst = new Mat(1, 1, CvType.CV_8UC(7));
849 
850         dst.setTo(vals);
851 
852         Mat truth = new Mat(1, 1, CvType.CV_8UC(7)) {
853             {
854                 put(0, 0, 1, 2, 3, 4, 5, 6, 7);
855             }
856         };
857         assertMatEqual(truth, dst);
858     }
859 
testSetToMatMat()860     public void testSetToMatMat() {
861         Mat vals = new Mat(7, 1, CvType.CV_8U) {
862             {
863                 put(0, 0, 1, 2, 3, 4, 5, 6, 7);
864             }
865         };
866         Mat dst = Mat.zeros(2, 1, CvType.CV_8UC(7));
867         Mat mask = new Mat(2, 1, CvType.CV_8U) {
868             {
869                 put(0, 0, 0, 1);
870             }
871         };
872 
873         dst.setTo(vals, mask);
874 
875         Mat truth = new Mat(2, 1, CvType.CV_8UC(7)) {
876             {
877                 put(0, 0, 0, 0, 0, 0, 0, 0, 0);
878                 put(1, 0, 1, 2, 3, 4, 5, 6, 7);
879             }
880         };
881         assertMatEqual(truth, dst);
882     }
883 
testSetToScalar()884     public void testSetToScalar() {
885         gray0.setTo(new Scalar(127));
886         assertMatEqual(gray127, gray0);
887     }
888 
testSetToScalarMask()889     public void testSetToScalarMask() {
890         Mat mask = gray0.clone();
891         mask.put(1, 1, 1, 2, 3);
892         gray0.setTo(new Scalar(1), mask);
893         assertEquals(3, Core.countNonZero(gray0));
894         Core.subtract(gray0, mask, gray0);
895         assertEquals(0, Core.countNonZero(gray0));
896     }
897 
testSize()898     public void testSize() {
899         assertEquals(new Size(matSize, matSize), gray0.size());
900 
901         assertEquals(new Size(3, 1), v1.size());
902     }
903 
testStep1()904     public void testStep1() {
905         assertEquals(matSize * CvType.channels(CvType.CV_8U), gray0.step1());
906 
907         assertEquals(3, v2.step1());
908     }
909 
testStep1Int()910     public void testStep1Int() {
911         Mat roi = rgba0.submat(3, 5, 7, 10);
912         Mat m = roi.clone();
913 
914         assertTrue(rgba0.channels() * rgba0.cols() <= roi.step1(0));
915         assertEquals(rgba0.channels(), roi.step1(1));
916         assertTrue(m.channels() * (10 - 7) <= m.step1(0));
917         assertEquals(m.channels(), m.step1(1));
918     }
919 
testSubmatIntIntIntInt()920     public void testSubmatIntIntIntInt() {
921         Mat submat = gray0.submat(0, gray0.rows() / 2, 0, gray0.cols() / 2);
922 
923         assertTrue(submat.isSubmatrix());
924         assertFalse(submat.isContinuous());
925         assertEquals(gray0.rows() / 2, submat.rows());
926         assertEquals(gray0.cols() / 2, submat.cols());
927     }
928 
testSubmatRangeRange()929     public void testSubmatRangeRange() {
930         Mat submat = gray255.submat(new Range(2, 4), new Range(2, 4));
931         assertTrue(submat.isSubmatrix());
932         assertFalse(submat.isContinuous());
933 
934         assertEquals(2, submat.rows());
935         assertEquals(2, submat.cols());
936     }
937 
testSubmatRect()938     public void testSubmatRect() {
939         Mat submat = gray255.submat(new Rect(5, gray255.rows() / 2, 5, gray255.cols() / 2));
940         assertTrue(submat.isSubmatrix());
941         assertFalse(submat.isContinuous());
942 
943         assertEquals(gray255.rows() / 2, submat.rows());
944         assertEquals(gray255.cols() / 2, submat.cols());
945     }
946 
testT()947     public void testT() {
948         assertMatEqual(gray255, gray255.t());
949 
950         Mat src = new Mat(3, 3, CvType.CV_16U) {
951             {
952                 put(0, 0, 1, 2, 4);
953                 put(1, 0, 7, 5, 0);
954                 put(2, 0, 3, 4, 6);
955             }
956         };
957 
958         dst = src.t();
959 
960         truth = new Mat(3, 3, CvType.CV_16U) {
961             {
962                 put(0, 0, 1, 7, 3);
963                 put(1, 0, 2, 5, 4);
964                 put(2, 0, 4, 0, 6);
965             }
966         };
967         assertMatEqual(truth, dst);
968     }
969 
testToString()970     public void testToString() {
971         assertTrue(null != gray0.toString());
972     }
973 
testTotal()974     public void testTotal() {
975         int nElements = gray0.rows() * gray0.cols();
976         assertEquals(nElements, gray0.total());
977     }
978 
testType()979     public void testType() {
980         assertEquals(CvType.CV_8UC1, gray0.type());
981         assertEquals(CvType.CV_32FC1, gray0_32f.type());
982         assertEquals(CvType.CV_8UC3, rgbLena.type());
983     }
984 
testWidth()985     public void testWidth() {
986         assertEquals(gray0.cols(), gray0.width());
987         assertEquals(rgbLena.cols(), rgbLena.width());
988         assertEquals(rgba128.cols(), rgba128.width());
989     }
990 
testZerosIntIntInt()991     public void testZerosIntIntInt() {
992         dst = Mat.zeros(matSize, matSize, CvType.CV_32F);
993 
994         assertMatEqual(gray0_32f, dst, EPS);
995     }
996 
testZerosSizeInt()997     public void testZerosSizeInt() {
998         dst = Mat.zeros(new Size(2, 2), CvType.CV_16S);
999 
1000         truth = new Mat(2, 2, CvType.CV_16S, new Scalar(0));
1001         assertMatEqual(truth, dst);
1002     }
1003 
1004 }
1005