diff --git a/modules/python/src2/cv2_util.cpp b/modules/python/src2/cv2_util.cpp index e5751045df..5858c6372b 100644 --- a/modules/python/src2/cv2_util.cpp +++ b/modules/python/src2/cv2_util.cpp @@ -47,6 +47,8 @@ int numpyTypeToCvDepth(int typenum) // 'long' is 64-bit on LP64 but 32-bit on LLP64, so decide by size, not by name. case NPY_LONG: return NPY_SIZEOF_LONG == 8 ? CV_64S : CV_32S; case NPY_ULONG: return NPY_SIZEOF_LONG == 8 ? CV_64U : CV_32U; + // Map the 32-bit case: it is numpy's int32 on LLP64, and output arrays cannot be cast. + case NPY_LONG: return NPY_SIZEOF_LONG == 4 ? CV_32S : -1; case NPY_HALF: return CV_16F; case NPY_FLOAT: return CV_32F; case NPY_DOUBLE: return CV_64F; diff --git a/modules/python/test/test_misc.py b/modules/python/test/test_misc.py index c6469f7226..73cb6039ab 100644 --- a/modules/python/test/test_misc.py +++ b/modules/python/test/test_misc.py @@ -318,6 +318,11 @@ class Arguments(NewOpenCVTests): #res6 = cv.utils.dumpInputArray([a, b]) #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]") + def test_InputOutputArray(self): + a = np.zeros((2, 3), dtype=np.int32) + res, _ = cv.utils.dumpInputOutputArray(a) + self.assertIn('type(-1)=CV_32SC1', res) + def test_unsupported_numpy_data_types_string_description(self): for dtype in (object, str, np.complex128): test_array = np.zeros((4, 4, 3), dtype=dtype)