Fix GpuMat to correctly calculate dataend when using GpuMat::create().
authorcudawarped <12133430+cudawarped@users.noreply.github.com>
Wed, 2 Feb 2022 14:25:46 +0000 (14:25 +0000)
committercudawarped <12133430+cudawarped@users.noreply.github.com>
Wed, 2 Feb 2022 14:25:46 +0000 (14:25 +0000)
Add output to createMat() to be used by locateROI test cases.

modules/core/src/cuda/gpu_mat.cu
modules/ts/include/opencv2/ts/cuda_test.hpp
modules/ts/src/cuda_test.cpp

index f31f78a..c286f28 100644 (file)
@@ -184,11 +184,8 @@ void cv::cuda::GpuMat::create(int _rows, int _cols, int _type)
         if (esz * cols == step)
             flags |= Mat::CONTINUOUS_FLAG;
 
-        int64 _nettosize = static_cast<int64>(step) * rows;
-        size_t nettosize = static_cast<size_t>(_nettosize);
-
         datastart = data;
-        dataend = data + nettosize;
+        dataend = data + step * (rows - 1) + cols * esz;
 
         if (refcount)
             *refcount = 1;
index 53bdbc8..f1851c5 100644 (file)
@@ -63,6 +63,7 @@ namespace cvtest
     // GpuMat create
 
     cv::cuda::GpuMat createMat(cv::Size size, int type, bool useRoi = false);
+    cv::cuda::GpuMat createMat(cv::Size size, int type, cv::Size& size0, cv::Point& ofs, bool useRoi = false);
     cv::cuda::GpuMat loadMat(const cv::Mat& m, bool useRoi = false);
 
     //////////////////////////////////////////////////////////////////////
index 3870415..a50f2cc 100644 (file)
@@ -91,7 +91,13 @@ namespace cvtest
 
     GpuMat createMat(Size size, int type, bool useRoi)
     {
-        Size size0 = size;
+        Size size0; Point ofs;
+        return createMat(size, type, size0, ofs, useRoi);
+    }
+
+    GpuMat createMat(Size size, int type, Size& size0, Point& ofs, bool useRoi)
+    {
+        size0 = size;
 
         if (useRoi)
         {
@@ -100,9 +106,10 @@ namespace cvtest
         }
 
         GpuMat d_m(size0, type);
-
-        if (size0 != size)
-            d_m = d_m(Rect((size0.width - size.width) / 2, (size0.height - size.height) / 2, size.width, size.height));
+        if (size0 != size) {
+            ofs = Point((size0.width - size.width) / 2, (size0.height - size.height) / 2);
+            d_m = d_m(Rect(ofs, size));
+        }
 
         return d_m;
     }