Skip to content

Commit eb67dc9

Browse files
committed
Merge pull request opencv#17533 from alalek:fix_dumpInputArray_nd_case
2 parents d321a34 + 442999d commit eb67dc9

File tree

2 files changed

+97
-18
lines changed

2 files changed

+97
-18
lines changed

modules/core/src/bindings_utils.cpp

Lines changed: 80 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,26 @@ String dumpInputArray(InputArray argument)
2525
break; // done
2626
}
2727
ss << cv::format(" total(-1)=%lld", (long long int)argument.total(-1));
28-
ss << cv::format(" dims(-1)=%d", argument.dims(-1));
29-
Size size = argument.size(-1);
30-
ss << cv::format(" size(-1)=%dx%d", size.width, size.height);
28+
int dims = argument.dims(-1);
29+
ss << cv::format(" dims(-1)=%d", dims);
30+
if (dims <= 2)
31+
{
32+
Size size = argument.size(-1);
33+
ss << cv::format(" size(-1)=%dx%d", size.width, size.height);
34+
}
35+
else
36+
{
37+
int sz[CV_MAX_DIM] = {0};
38+
argument.sizend(sz, -1);
39+
ss << " size(-1)=[";
40+
for (int i = 0; i < dims; i++)
41+
{
42+
if (i > 0)
43+
ss << ' ';
44+
ss << sz[i];
45+
}
46+
ss << "]";
47+
}
3148
ss << " type(-1)=" << cv::typeToString(argument.type(-1));
3249
} while (0);
3350
}
@@ -61,10 +78,26 @@ CV_EXPORTS_W String dumpInputArrayOfArrays(InputArrayOfArrays argument)
6178
if (argument.total(-1) > 0)
6279
{
6380
ss << " type(0)=" << cv::typeToString(argument.type(0));
64-
ss << cv::format(" dims(0)=%d", argument.dims(0));
65-
size = argument.size(0);
66-
ss << cv::format(" size(0)=%dx%d", size.width, size.height);
67-
ss << " type(0)=" << cv::typeToString(argument.type(0));
81+
int dims = argument.dims(0);
82+
ss << cv::format(" dims(0)=%d", dims);
83+
if (dims <= 2)
84+
{
85+
Size size0 = argument.size(0);
86+
ss << cv::format(" size(0)=%dx%d", size0.width, size0.height);
87+
}
88+
else
89+
{
90+
int sz[CV_MAX_DIM] = {0};
91+
argument.sizend(sz, 0);
92+
ss << " size(0)=[";
93+
for (int i = 0; i < dims; i++)
94+
{
95+
if (i > 0)
96+
ss << ' ';
97+
ss << sz[i];
98+
}
99+
ss << "]";
100+
}
68101
}
69102
} while (0);
70103
}
@@ -92,9 +125,26 @@ CV_EXPORTS_W String dumpInputOutputArray(InputOutputArray argument)
92125
break; // done
93126
}
94127
ss << cv::format(" total(-1)=%lld", (long long int)argument.total(-1));
95-
ss << cv::format(" dims(-1)=%d", argument.dims(-1));
96-
Size size = argument.size(-1);
97-
ss << cv::format(" size(-1)=%dx%d", size.width, size.height);
128+
int dims = argument.dims(-1);
129+
ss << cv::format(" dims(-1)=%d", dims);
130+
if (dims <= 2)
131+
{
132+
Size size = argument.size(-1);
133+
ss << cv::format(" size(-1)=%dx%d", size.width, size.height);
134+
}
135+
else
136+
{
137+
int sz[CV_MAX_DIM] = {0};
138+
argument.sizend(sz, -1);
139+
ss << " size(-1)=[";
140+
for (int i = 0; i < dims; i++)
141+
{
142+
if (i > 0)
143+
ss << ' ';
144+
ss << sz[i];
145+
}
146+
ss << "]";
147+
}
98148
ss << " type(-1)=" << cv::typeToString(argument.type(-1));
99149
} while (0);
100150
}
@@ -128,10 +178,26 @@ CV_EXPORTS_W String dumpInputOutputArrayOfArrays(InputOutputArrayOfArrays argume
128178
if (argument.total(-1) > 0)
129179
{
130180
ss << " type(0)=" << cv::typeToString(argument.type(0));
131-
ss << cv::format(" dims(0)=%d", argument.dims(0));
132-
size = argument.size(0);
133-
ss << cv::format(" size(0)=%dx%d", size.width, size.height);
134-
ss << " type(0)=" << cv::typeToString(argument.type(0));
181+
int dims = argument.dims(0);
182+
ss << cv::format(" dims(0)=%d", dims);
183+
if (dims <= 2)
184+
{
185+
Size size0 = argument.size(0);
186+
ss << cv::format(" size(0)=%dx%d", size0.width, size0.height);
187+
}
188+
else
189+
{
190+
int sz[CV_MAX_DIM] = {0};
191+
argument.sizend(sz, 0);
192+
ss << " size(0)=[";
193+
for (int i = 0; i < dims; i++)
194+
{
195+
if (i > 0)
196+
ss << ' ';
197+
ss << sz[i];
198+
}
199+
ss << "]";
200+
}
135201
}
136202
} while (0);
137203
}

modules/python/test/test_misc.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,22 +105,35 @@ def test_InputArray(self):
105105
a = np.array([[[1, 2]], [[3, 4]], [[5, 6]]], dtype=float)
106106
res5 = cv.utils.dumpInputArray(a) # 64FC2
107107
self.assertEqual(res5, "InputArray: empty()=false kind=0x00010000 flags=0x01010000 total(-1)=3 dims(-1)=2 size(-1)=1x3 type(-1)=CV_64FC2")
108+
a = np.zeros((2,3,4), dtype='f')
109+
res6 = cv.utils.dumpInputArray(a)
110+
self.assertEqual(res6, "InputArray: empty()=false kind=0x00010000 flags=0x01010000 total(-1)=6 dims(-1)=2 size(-1)=3x2 type(-1)=CV_32FC4")
111+
a = np.zeros((2,3,4,5), dtype='f')
112+
res7 = cv.utils.dumpInputArray(a)
113+
self.assertEqual(res7, "InputArray: empty()=false kind=0x00010000 flags=0x01010000 total(-1)=120 dims(-1)=4 size(-1)=[2 3 4 5] type(-1)=CV_32FC1")
108114

109115
def test_InputArrayOfArrays(self):
110116
res1 = cv.utils.dumpInputArrayOfArrays(None)
111117
# self.assertEqual(res1, "InputArray: noArray()") # not supported
112118
self.assertEqual(res1, "InputArrayOfArrays: empty()=true kind=0x00050000 flags=0x01050000 total(-1)=0 dims(-1)=1 size(-1)=0x0")
113119
res2_1 = cv.utils.dumpInputArrayOfArrays((1, 2)) # { Scalar:all(1), Scalar::all(2) }
114-
self.assertEqual(res2_1, "InputArrayOfArrays: empty()=false kind=0x00050000 flags=0x01050000 total(-1)=2 dims(-1)=1 size(-1)=2x1 type(0)=CV_64FC1 dims(0)=2 size(0)=1x4 type(0)=CV_64FC1")
120+
self.assertEqual(res2_1, "InputArrayOfArrays: empty()=false kind=0x00050000 flags=0x01050000 total(-1)=2 dims(-1)=1 size(-1)=2x1 type(0)=CV_64FC1 dims(0)=2 size(0)=1x4")
115121
res2_2 = cv.utils.dumpInputArrayOfArrays([1.5])
116-
self.assertEqual(res2_2, "InputArrayOfArrays: empty()=false kind=0x00050000 flags=0x01050000 total(-1)=1 dims(-1)=1 size(-1)=1x1 type(0)=CV_64FC1 dims(0)=2 size(0)=1x4 type(0)=CV_64FC1")
122+
self.assertEqual(res2_2, "InputArrayOfArrays: empty()=false kind=0x00050000 flags=0x01050000 total(-1)=1 dims(-1)=1 size(-1)=1x1 type(0)=CV_64FC1 dims(0)=2 size(0)=1x4")
117123
a = np.array([[1, 2], [3, 4], [5, 6]])
118124
b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
119125
res3 = cv.utils.dumpInputArrayOfArrays([a, b])
120-
self.assertEqual(res3, "InputArrayOfArrays: empty()=false kind=0x00050000 flags=0x01050000 total(-1)=2 dims(-1)=1 size(-1)=2x1 type(0)=CV_32SC1 dims(0)=2 size(0)=2x3 type(0)=CV_32SC1")
126+
self.assertEqual(res3, "InputArrayOfArrays: empty()=false kind=0x00050000 flags=0x01050000 total(-1)=2 dims(-1)=1 size(-1)=2x1 type(0)=CV_32SC1 dims(0)=2 size(0)=2x3")
121127
c = np.array([[[1, 2], [3, 4], [5, 6]]], dtype='f')
122128
res4 = cv.utils.dumpInputArrayOfArrays([c, a, b])
123-
self.assertEqual(res4, "InputArrayOfArrays: empty()=false kind=0x00050000 flags=0x01050000 total(-1)=3 dims(-1)=1 size(-1)=3x1 type(0)=CV_32FC2 dims(0)=2 size(0)=3x1 type(0)=CV_32FC2")
129+
self.assertEqual(res4, "InputArrayOfArrays: empty()=false kind=0x00050000 flags=0x01050000 total(-1)=3 dims(-1)=1 size(-1)=3x1 type(0)=CV_32FC2 dims(0)=2 size(0)=3x1")
130+
a = np.zeros((2,3,4), dtype='f')
131+
res5 = cv.utils.dumpInputArrayOfArrays([a, b])
132+
self.assertEqual(res5, "InputArrayOfArrays: empty()=false kind=0x00050000 flags=0x01050000 total(-1)=2 dims(-1)=1 size(-1)=2x1 type(0)=CV_32FC4 dims(0)=2 size(0)=3x2")
133+
# TODO: fix conversion error
134+
#a = np.zeros((2,3,4,5), dtype='f')
135+
#res6 = cv.utils.dumpInputArray([a, b])
136+
#self.assertEqual(res6, "InputArrayOfArrays: empty()=false kind=0x00050000 flags=0x01050000 total(-1)=2 dims(-1)=1 size(-1)=2x1 type(0)=CV_32FC1 dims(0)=4 size(0)=[2 3 4 5]")
124137

125138
def test_parse_to_bool_convertible(self):
126139
try_to_convert = partial(self._try_to_convert, cv.utils.dumpBool)

0 commit comments

Comments
 (0)