From 4c568e6ed3c58ffbbfcc47f841cfdea1eaa8b8b8 Mon Sep 17 00:00:00 2001 From: Vadim Levin Date: Wed, 19 Jul 2023 17:22:10 +0300 Subject: [PATCH] fix: preserve NumPY writeable flag in output arguments --- modules/python/src2/cv2_convert.cpp | 7 +++++++ modules/python/test/test_misc.py | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/modules/python/src2/cv2_convert.cpp b/modules/python/src2/cv2_convert.cpp index 20cd957753..e9e1fed4fd 100644 --- a/modules/python/src2/cv2_convert.cpp +++ b/modules/python/src2/cv2_convert.cpp @@ -101,6 +101,13 @@ bool pyopencv_to(PyObject* o, Mat& m, const ArgInfo& info) PyArrayObject* oarr = (PyArrayObject*) o; + if (info.outputarg && !PyArray_ISWRITEABLE(oarr)) + { + failmsg("%s marked as output argument, but provided NumPy array " + "marked as readonly", info.name); + return false; + } + bool needcopy = false, needcast = false; int typenum = PyArray_TYPE(oarr), new_typenum = typenum; int type = typenum == NPY_UBYTE ? CV_8U : diff --git a/modules/python/test/test_misc.py b/modules/python/test/test_misc.py index afe3fcc5db..9f7406587c 100644 --- a/modules/python/test/test_misc.py +++ b/modules/python/test/test_misc.py @@ -232,6 +232,12 @@ class Arguments(NewOpenCVTests): Exception, msg, cv.utils.dumpInputArray, test_array ) + def test_numpy_writeable_flag_is_preserved(self): + array = np.zeros((10, 10, 1), dtype=np.uint8) + array.setflags(write=False) + with self.assertRaises(Exception): + cv.rectangle(array, (0, 0), (5, 5), (255), 2) + def test_20968(self): pixel = np.uint8([[[40, 50, 200]]]) _ = cv.cvtColor(pixel, cv.COLOR_RGB2BGR) # should not raise exception