updated test for gpu::dft, updated dft for handling continous source
authorAlexey Spizhevoy <no@email>
Thu, 23 Dec 2010 13:00:33 +0000 (13:00 +0000)
committerAlexey Spizhevoy <no@email>
Thu, 23 Dec 2010 13:00:33 +0000 (13:00 +0000)
modules/gpu/src/imgproc_gpu.cpp
tests/gpu/src/dft_routines.cpp
tests/gpu/src/imgproc_gpu.cpp

index 1a2b48f..8a94630 100644 (file)
@@ -1159,7 +1159,8 @@ void cv::gpu::dft(const GpuMat& src, GpuMat& dst, int flags, int nonZeroRows, bo
     else\r
     {\r
         src_data = GpuMat(1, src.size().area(), src.type());\r
-        src_aux = GpuMat(src.rows, src.cols, src.type(), src_data.ptr(), src.cols * src.elemSize());\r
+        src_aux = GpuMat(src.rows, src.cols, src.type(), src_data.ptr(),\r
+                         src.cols * src.elemSize());\r
         src.copyTo(src_aux);\r
 \r
         if (is_1d_input && !is_row_dft)\r
@@ -1168,7 +1169,8 @@ void cv::gpu::dft(const GpuMat& src, GpuMat& dst, int flags, int nonZeroRows, bo
             // reshape it into single row\r
             int rows = std::min(src.rows, src.cols);\r
             int cols = src.size().area() / rows;\r
-            src_aux = GpuMat(rows, cols, src.type(), src_data.ptr(), cols * src.elemSize());\r
+            src_aux = GpuMat(rows, cols, src.type(), src_data.ptr(), \r
+                             cols * src.elemSize());\r
         }\r
     }\r
 \r
@@ -1196,7 +1198,7 @@ void cv::gpu::dft(const GpuMat& src, GpuMat& dst, int flags, int nonZeroRows, bo
         if (is_complex_output)\r
         {\r
             is_dst_mem_good = dst.isContinuous() && dst.type() == CV_32FC2 \r
-                              && dst.size().area() >= src.size().area();\r
+                              && dst.cols >= src.cols && dst.rows >= src.rows;\r
 \r
             if (is_dst_mem_good)\r
                 dst_data = dst;\r
@@ -1229,7 +1231,7 @@ void cv::gpu::dft(const GpuMat& src, GpuMat& dst, int flags, int nonZeroRows, bo
             }\r
 \r
             is_dst_mem_good = dst.isContinuous() && dst.type() == CV_32F\r
-                              && dst.rows >= dst_rows && dst.cols >= dst_cols;\r
+                              && dst.cols >= dst_cols && dst.rows >= dst_rows;\r
 \r
             if (is_dst_mem_good)\r
                 dst_data = dst;\r
@@ -1261,7 +1263,7 @@ void cv::gpu::dft(const GpuMat& src, GpuMat& dst, int flags, int nonZeroRows, bo
         }\r
 \r
         is_dst_mem_good = dst.isContinuous() && dst.type() == CV_32FC2 \r
-                          && dst.rows >= dst_rows && dst.cols >= dst_cols;\r
+                          && dst.cols >= dst_cols && dst.rows >= dst_rows;\r
 \r
         if (is_dst_mem_good)\r
             dst_data = dst;\r
index 6ed35eb..6c8d5c7 100644 (file)
@@ -223,30 +223,41 @@ struct CV_GpuDftTest: CvTest
     {\r
         try\r
         {\r
-            int cols = 1 + rand() % 100, rows = 1 + rand() % 100;\r
-\r
-            testC2C(cols, rows, 0, "no flags");\r
-            testC2C(cols, rows + 1, 0, "no flags 0 1");\r
-            testC2C(cols, rows + 1, 0, "no flags 1 0");\r
-            testC2C(cols + 1, rows, 0, "no flags 1 1");\r
-            testC2C(cols, rows, DFT_INVERSE, "DFT_INVERSE");\r
-            testC2C(cols, rows, DFT_ROWS, "DFT_ROWS");\r
-            testC2C(1, rows, 0, "single col");\r
-            testC2C(cols, 1, 0, "single row");\r
-            testC2C(1, rows, DFT_INVERSE, "single col inversed");\r
-            testC2C(cols, 1, DFT_INVERSE, "single row inversed");\r
-            testC2C(cols, 1, DFT_ROWS, "single row DFT_ROWS");\r
-            testC2C(1, 2, 0, "size 1 2");\r
-            testC2C(2, 1, 0, "size 2 1");\r
-\r
-            testR2CThenC2R(cols, rows, "sanity");\r
-            testR2CThenC2R(cols, rows + 1, "sanity 0 1");\r
-            testR2CThenC2R(cols + 1, rows, "sanity 1 0");\r
-            testR2CThenC2R(cols + 1, rows + 1, "sanity 1 1");\r
-            testR2CThenC2R(1, rows, "single col");\r
-            testR2CThenC2R(1, rows + 1, "single col 1");\r
-            testR2CThenC2R(cols, 1, "single row" );;\r
-            testR2CThenC2R(cols + 1, 1, "single row 1" );\r
+            srand(0);\r
+            int cols = 2 + rand() % 100, rows = 2 + rand() % 100;\r
+\r
+            for (int inplace = 0; inplace < 2; ++inplace)\r
+            {\r
+                testC2C("no flags", cols, rows, 0, inplace);\r
+                testC2C("no flags 0 1", cols, rows + 1, 0, inplace);\r
+                testC2C("no flags 1 0", cols, rows + 1, 0, inplace);\r
+                testC2C("no flags 1 1", cols + 1, rows, 0, inplace);\r
+                testC2C("DFT_INVERSE", cols, rows, DFT_INVERSE, inplace);\r
+                testC2C("DFT_ROWS", cols, rows, DFT_ROWS, inplace);\r
+                testC2C("single col", 1, rows, 0, inplace);\r
+                testC2C("single row", cols, 1, 0, inplace);\r
+                testC2C("single col inversed", 1, rows, DFT_INVERSE, inplace);\r
+                testC2C("single row inversed", cols, 1, DFT_INVERSE, inplace);\r
+                testC2C("single row DFT_ROWS", cols, 1, DFT_ROWS, inplace);\r
+                testC2C("size 1 2", 1, 2, 0, inplace);\r
+                testC2C("size 2 1", 2, 1, 0, inplace);\r
+            }\r
+\r
+            testR2CThenC2R("sanity", cols, rows);\r
+            testR2CThenC2R("sanity 0 1", cols, rows + 1);\r
+            testR2CThenC2R("sanity 1 0", cols + 1, rows);\r
+            testR2CThenC2R("sanity 1 1", cols + 1, rows + 1);\r
+            testR2CThenC2R("single col", 1, rows);\r
+            testR2CThenC2R("single col 1", 1, rows + 1);\r
+            testR2CThenC2R("single row", cols, 1);\r
+            testR2CThenC2R("single row 1", cols + 1, 1);\r
+\r
+            testR2CThenC2R("sanity", cols, rows, true);\r
+            testR2CThenC2R("sanity 0 1", cols, rows + 1, true);\r
+            testR2CThenC2R("sanity 1 0", cols + 1, rows, true);\r
+            testR2CThenC2R("sanity 1 1", cols + 1, rows + 1, true);\r
+            testR2CThenC2R("single row", cols, 1, true);\r
+            testR2CThenC2R("single row 1", cols + 1, 1, true);\r
         }\r
         catch (const Exception& e)\r
         {\r
@@ -300,7 +311,7 @@ struct CV_GpuDftTest: CvTest
         return true;\r
     }\r
 \r
-    void testC2C(int cols, int rows, int flags, const std::string& hint)\r
+    void testC2C(const std::string& hint, int cols, int rows, int flags, bool inplace=false)\r
     {\r
         Mat a;\r
         gen(cols, rows, 2, a);\r
@@ -309,9 +320,22 @@ struct CV_GpuDftTest: CvTest
         dft(a, b_gold, flags);\r
 \r
         GpuMat d_b;\r
+        GpuMat d_b_data;\r
+        if (inplace)\r
+        {\r
+            d_b_data.create(1, a.size().area(), CV_32FC2);\r
+            d_b = GpuMat(a.rows, a.cols, CV_32FC2, d_b_data.ptr(), a.cols * d_b_data.elemSize());\r
+        }\r
+\r
         dft(GpuMat(a), d_b, flags);\r
 \r
         bool ok = true;\r
+        if (ok && inplace && d_b.ptr() != d_b_data.ptr())\r
+        {\r
+            ts->printf(CvTS::CONSOLE, "unnecessary reallocation was done\n");\r
+            ts->set_failed_test_info(CvTS::FAIL_INVALID_OUTPUT);\r
+            ok = false;\r
+        }\r
         if (ok && d_b.depth() != CV_32F)\r
         {\r
             ts->printf(CvTS::CONSOLE, "bad depth: %d\n", d_b.depth());\r
@@ -326,10 +350,11 @@ struct CV_GpuDftTest: CvTest
         }\r
         if (ok) ok = cmp(b_gold, Mat(d_b), rows * cols * 1e-4f);\r
         if (!ok) \r
-            ts->printf(CvTS::CONSOLE, "testC2C failed: hint=%s, cols=%d, rows=%d, flags=%d\n", hint.c_str(), cols, rows, flags);\r
+            ts->printf(CvTS::CONSOLE, "testC2C failed: hint=%s, cols=%d, rows=%d, flags=%d, inplace=%d\n", \r
+                       hint.c_str(), cols, rows, flags, inplace);\r
     }\r
 \r
-    void testR2CThenC2R(int cols, int rows, const std::string& hint)\r
+    void testR2CThenC2R(const std::string& hint, int cols, int rows, bool inplace=false)\r
     {\r
         Mat a;\r
         gen(cols, rows, 1, a);\r
@@ -339,11 +364,38 @@ struct CV_GpuDftTest: CvTest
         else odd = a.cols % 2 == 1;\r
         bool ok = true;\r
 \r
-        GpuMat d_b;\r
-        GpuMat d_c;\r
+        GpuMat d_b, d_c;\r
+        GpuMat d_b_data, d_c_data;\r
+        if (inplace)\r
+        {\r
+            if (a.cols == 1)\r
+            {\r
+                d_b_data.create(1, (a.rows / 2 + 1) * a.cols, CV_32FC2);\r
+                d_b = GpuMat(a.rows / 2 + 1, a.cols, CV_32FC2, d_b_data.ptr(), a.cols * d_b_data.elemSize());\r
+            }\r
+            else\r
+            {\r
+                d_b_data.create(1, a.rows * (a.cols / 2 + 1), CV_32FC2);\r
+                d_b = GpuMat(a.rows, a.cols / 2 + 1, CV_32FC2, d_b_data.ptr(), (a.cols / 2 + 1) * d_b_data.elemSize());\r
+            }\r
+            d_c_data.create(1, a.size().area(), CV_32F);\r
+            d_c = GpuMat(a.rows, a.cols, CV_32F, d_c_data.ptr(), a.cols * d_c_data.elemSize());\r
+        }\r
         dft(GpuMat(a), d_b, 0);\r
         dft(d_b, d_c, DFT_REAL_OUTPUT, 0, odd);\r
 \r
+        if (ok && inplace && d_b.ptr() != d_b_data.ptr())\r
+        {\r
+            ts->printf(CvTS::CONSOLE, "unnecessary reallocation was done for b\n");\r
+            ts->set_failed_test_info(CvTS::FAIL_INVALID_OUTPUT);\r
+            ok = false;\r
+        }\r
+        if (ok && inplace && d_c.ptr() != d_c_data.ptr())\r
+        {\r
+            ts->printf(CvTS::CONSOLE, "unnecessary reallocation was done for c\n");\r
+            ts->set_failed_test_info(CvTS::FAIL_INVALID_OUTPUT);\r
+            ok = false;\r
+        }\r
         if (ok && d_c.depth() != CV_32F)\r
         {\r
             ts->printf(CvTS::CONSOLE, "bad depth: %d\n", d_c.depth());\r
index 73ba9b1..9557b88 100644 (file)
@@ -771,7 +771,7 @@ struct CV_GpuColumnSumTest: CvTest
             int n = 375;\r
             int m = 1072;\r
             Mat src(n, m, CV_32F);\r
-            RNG rng;\r
+            RNG rng(1);\r
             rng.fill(src, RNG::UNIFORM, Scalar(0), Scalar(1));\r
             Mat dst_gold, dst2_gold;\r
 \r