python: properly handle step for multichannel case
authorAlexander Alekhin <alexander.a.alekhin@gmail.com>
Fri, 29 Oct 2021 16:08:57 +0000 (16:08 +0000)
committerAlexander Alekhin <alexander.a.alekhin@gmail.com>
Fri, 29 Oct 2021 18:29:19 +0000 (18:29 +0000)
modules/core/src/matrix.cpp
modules/python/src2/cv2.cpp
modules/python/test/test_misc.py

index 4642d3b..1729862 100644 (file)
@@ -463,7 +463,7 @@ Mat::Mat(Size _sz, int _type, void* _data, size_t _step)
     }
     else
     {
-        CV_Assert(_step >= minstep);
+        CV_CheckGE(_step, minstep, "");
 
         if (_step % esz1 != 0)
         {
index 6231fde..58b1357 100644 (file)
@@ -788,6 +788,8 @@ static bool pyopencv_to(PyObject* o, Mat& m, const ArgInfo& info)
 
         if (ndims >= 1 && _strides[ndims - 1] != (npy_intp)elemsize*_sizes[ndims])
             needcopy = true;
+
+        elemsize = CV_ELEM_SIZE(type);
     }
 
     if (needcopy)
index 7680399..fe48408 100644 (file)
@@ -187,6 +187,10 @@ 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_20968(self):
+        pixel = np.uint8([[[40, 50, 200]]])
+        _ = cv.cvtColor(pixel, cv.COLOR_RGB2BGR)  # should not raise exception
+
     def test_parse_to_bool_convertible(self):
         try_to_convert = partial(self._try_to_convert, cv.utils.dumpBool)
         for convertible_true in (True, 1, 64, np.bool(1), np.int8(123), np.int16(11), np.int32(2),