File: test_mat.py

package info (click to toggle)
opencv 4.10.0%2Bdfsg-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 282,092 kB
  • sloc: cpp: 1,178,079; xml: 682,621; python: 49,092; lisp: 31,150; java: 25,469; ansic: 11,039; javascript: 6,085; sh: 1,214; cs: 601; perl: 494; objc: 210; makefile: 173
file content (131 lines) | stat: -rw-r--r-- 5,365 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/usr/bin/env python
from __future__ import print_function

import numpy as np
import cv2 as cv

import os
import sys
import unittest

from tests_common import NewOpenCVTests

try:
    if sys.version_info[:2] < (3, 0):
        raise unittest.SkipTest('Python 2.x is not supported')


    class MatTest(NewOpenCVTests):

        def test_mat_construct(self):
            data = np.random.random([10, 10, 3])

            #print(np.ndarray.__dictoffset__)  # 0
            #print(cv.Mat.__dictoffset__)  # 88 (> 0)
            #print(cv.Mat)  # <class cv2.Mat>
            #print(cv.Mat.__base__)  # <class 'numpy.ndarray'>

            mat_data0 = cv.Mat(data)
            assert isinstance(mat_data0, cv.Mat)
            assert isinstance(mat_data0, np.ndarray)
            self.assertEqual(mat_data0.wrap_channels, False)
            res0 = cv.utils.dumpInputArray(mat_data0)
            self.assertEqual(res0, "InputArray: empty()=false kind=0x00010000 flags=0x01010000 total(-1)=300 dims(-1)=3 size(-1)=[10 10 3] type(-1)=CV_64FC1")

            mat_data1 = cv.Mat(data, wrap_channels=True)
            assert isinstance(mat_data1, cv.Mat)
            assert isinstance(mat_data1, np.ndarray)
            self.assertEqual(mat_data1.wrap_channels, True)
            res1 = cv.utils.dumpInputArray(mat_data1)
            self.assertEqual(res1, "InputArray: empty()=false kind=0x00010000 flags=0x01010000 total(-1)=100 dims(-1)=2 size(-1)=10x10 type(-1)=CV_64FC3")

            mat_data2 = cv.Mat(mat_data1)
            assert isinstance(mat_data2, cv.Mat)
            assert isinstance(mat_data2, np.ndarray)
            self.assertEqual(mat_data2.wrap_channels, True)  # fail if __array_finalize__ doesn't work
            res2 = cv.utils.dumpInputArray(mat_data2)
            self.assertEqual(res2, "InputArray: empty()=false kind=0x00010000 flags=0x01010000 total(-1)=100 dims(-1)=2 size(-1)=10x10 type(-1)=CV_64FC3")


        def test_mat_construct_4d(self):
            data = np.random.random([5, 10, 10, 3])

            mat_data0 = cv.Mat(data)
            assert isinstance(mat_data0, cv.Mat)
            assert isinstance(mat_data0, np.ndarray)
            self.assertEqual(mat_data0.wrap_channels, False)
            res0 = cv.utils.dumpInputArray(mat_data0)
            self.assertEqual(res0, "InputArray: empty()=false kind=0x00010000 flags=0x01010000 total(-1)=1500 dims(-1)=4 size(-1)=[5 10 10 3] type(-1)=CV_64FC1")

            mat_data1 = cv.Mat(data, wrap_channels=True)
            assert isinstance(mat_data1, cv.Mat)
            assert isinstance(mat_data1, np.ndarray)
            self.assertEqual(mat_data1.wrap_channels, True)
            res1 = cv.utils.dumpInputArray(mat_data1)
            self.assertEqual(res1, "InputArray: empty()=false kind=0x00010000 flags=0x01010000 total(-1)=500 dims(-1)=3 size(-1)=[5 10 10] type(-1)=CV_64FC3")

            mat_data2 = cv.Mat(mat_data1)
            assert isinstance(mat_data2, cv.Mat)
            assert isinstance(mat_data2, np.ndarray)
            self.assertEqual(mat_data2.wrap_channels, True)  # __array_finalize__ doesn't work
            res2 = cv.utils.dumpInputArray(mat_data2)
            self.assertEqual(res2, "InputArray: empty()=false kind=0x00010000 flags=0x01010000 total(-1)=500 dims(-1)=3 size(-1)=[5 10 10] type(-1)=CV_64FC3")


        def test_mat_wrap_channels_fail(self):
            data = np.random.random([2, 3, 4, 520])

            mat_data0 = cv.Mat(data)
            assert isinstance(mat_data0, cv.Mat)
            assert isinstance(mat_data0, np.ndarray)
            self.assertEqual(mat_data0.wrap_channels, False)
            res0 = cv.utils.dumpInputArray(mat_data0)
            self.assertEqual(res0, "InputArray: empty()=false kind=0x00010000 flags=0x01010000 total(-1)=12480 dims(-1)=4 size(-1)=[2 3 4 520] type(-1)=CV_64FC1")

            with self.assertRaises(cv.error):
                mat_data1 = cv.Mat(data, wrap_channels=True)  # argument unable to wrap channels, too high (520 > CV_CN_MAX=512)
                res1 = cv.utils.dumpInputArray(mat_data1)
                print(mat_data1.__dict__)
                print(res1)


        def test_ufuncs(self):
            data = np.arange(10)
            mat_data = cv.Mat(data)
            mat_data2 = 2 * mat_data
            self.assertEqual(type(mat_data2), cv.Mat)
            np.testing.assert_equal(2 * data, 2 * mat_data)


        def test_comparison(self):
            # Undefined behavior, do NOT use that.
            # Behavior may be changed in the future

            data = np.ones((10, 10, 3))
            mat_wrapped = cv.Mat(data, wrap_channels=True)
            mat_simple = cv.Mat(data)
            np.testing.assert_equal(mat_wrapped, mat_simple)  # ???: wrap_channels is not checked for now
            np.testing.assert_equal(data, mat_simple)
            np.testing.assert_equal(data, mat_wrapped)

            #self.assertEqual(mat_wrapped, mat_simple)  # ???
            #self.assertTrue(mat_wrapped == mat_simple)  # ???
            #self.assertTrue((mat_wrapped == mat_simple).all())


except unittest.SkipTest as e:

    message = str(e)

    class TestSkip(unittest.TestCase):
        def setUp(self):
            self.skipTest('Skip tests: ' + message)

        def test_skip():
            pass

    pass


if __name__ == '__main__':
    NewOpenCVTests.bootstrap()