Added initial implementation and test for the GPU version of add, based on NPP. Need...
authorKirill Kornyakov <no@email>
Thu, 9 Sep 2010 15:34:16 +0000 (15:34 +0000)
committerKirill Kornyakov <no@email>
Thu, 9 Sep 2010 15:34:16 +0000 (15:34 +0000)
modules/gpu/include/opencv2/gpu/gpu.hpp
modules/gpu/src/arithm.cpp [new file with mode: 0644]
tests/gpu/src/npp_image_addition.cpp [new file with mode: 0644]

index 44ad9d2..2053397 100644 (file)
@@ -341,6 +341,10 @@ namespace cv
             friend struct StreamAccessor;\r
         };\r
 \r
+        ////////////////////////////// Arithmetics ///////////////////////////////////\r
+\r
+        CV_EXPORTS void add(const GpuMat& src1, const GpuMat& src2, GpuMat& dst);\r
+\r
         ////////////////////////////// Image processing //////////////////////////////\r
         // DST[x,y] = SRC[xmap[x,y],ymap[x,y]] with bilinear interpolation.\r
         // xymap.type() == xymap.type() == CV_32FC1\r
diff --git a/modules/gpu/src/arithm.cpp b/modules/gpu/src/arithm.cpp
new file mode 100644 (file)
index 0000000..1be3290
--- /dev/null
@@ -0,0 +1,78 @@
+/*M///////////////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.\r
+//\r
+//  By downloading, copying, installing or using the software you agree to this license.\r
+//  If you do not agree to this license, do not download, install,\r
+//  copy or use the software.\r
+//\r
+//\r
+//                           License Agreement\r
+//                For Open Source Computer Vision Library\r
+//\r
+// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.\r
+// Copyright (C) 2009, Willow Garage Inc., all rights reserved.\r
+// Third party copyrights are property of their respective owners.\r
+//\r
+// Redistribution and use in source and binary forms, with or without modification,\r
+// are permitted provided that the following conditions are met:\r
+//\r
+//   * Redistribution's of source code must retain the above copyright notice,\r
+//     this list of conditions and the following disclaimer.\r
+//\r
+//   * Redistribution's in binary form must reproduce the above copyright notice,\r
+//     this list of conditions and the following disclaimer in the documentation\r
+//     and/or other GpuMaterials provided with the distribution.\r
+//\r
+//   * The name of the copyright holders may not be used to endorse or promote products\r
+//     derived from this software without specific prior written permission.\r
+//\r
+// This software is provided by the copyright holders and contributors "as is" and\r
+// any express or bpied warranties, including, but not limited to, the bpied\r
+// warranties of merchantability and fitness for a particular purpose are disclaimed.\r
+// In no event shall the Intel Corporation or contributors be liable for any direct,\r
+// indirect, incidental, special, exemplary, or consequential damages\r
+// (including, but not limited to, procurement of substitute goods or services;\r
+// loss of use, data, or profits; or business interruption) however caused\r
+// and on any theory of liability, whether in contract, strict liability,\r
+// or tort (including negligence or otherwise) arising in any way out of\r
+// the use of this software, even if advised of the possibility of such damage.\r
+//\r
+//M*/\r
+\r
+#include "precomp.hpp"\r
+#include "npp.h" //TODO: move to the precomp.hpp\r
+\r
+using namespace cv;\r
+using namespace cv::gpu;\r
+using namespace std;\r
+\r
+#if !defined (HAVE_CUDA)\r
+\r
+void cv::gpu::add(const GpuMat& src1, const GpuMat& src2, GpuMat& dst) { throw_nogpu(); }\r
+\r
+#else /* !defined (HAVE_CUDA) */\r
+\r
+void cv::gpu::add(const GpuMat& src1, const GpuMat& src2, GpuMat& dst)\r
+{\r
+    CV_Assert(src1.size() == src2.size() && src1.type() == src2.type());\r
+\r
+    dst.create( src1.size(), src1.type() );\r
+    \r
+    CV_DbgAssert(src1.depth() == CV_8U || src1.depth() == CV_32F);\r
+    CV_DbgAssert(src1.channels() == 1 || src1.channels() == 4);\r
+\r
+    NppiSize sz;\r
+    sz.width = src1.cols;\r
+    sz.height = src1.rows;\r
+\r
+    if (src1.depth() == CV_8U)\r
+    {\r
+        nppiAdd_8u_C1RSfs((const Npp8u*)src1.ptr<char>(), src1.step, \r
+                          (const Npp8u*)src2.ptr<char>(), src2.step, \r
+                          (Npp8u*)dst.ptr<char>(), dst.step, sz, 0);\r
+    }\r
+    //TODO: implement other depths\r
+}\r
+\r
+#endif /* !defined (HAVE_CUDA) */
\ No newline at end of file
diff --git a/tests/gpu/src/npp_image_addition.cpp b/tests/gpu/src/npp_image_addition.cpp
new file mode 100644 (file)
index 0000000..46be3e7
--- /dev/null
@@ -0,0 +1,101 @@
+/*M///////////////////////////////////////////////////////////////////////////////////////
+//
+//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
+//
+//  By downloading, copying, installing or using the software you agree to this license.
+//  If you do not agree to this license, do not download, install,
+//  copy or use the software.
+//
+//
+//                        Intel License Agreement
+//                For Open Source Computer Vision Library
+//
+// Copyright (C) 2000, Intel Corporation, all rights reserved.
+// Third party copyrights are property of their respective owners.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+//   * Redistribution's of source code must retain the above copyright notice,
+//     this list of conditions and the following disclaimer.
+//
+//   * Redistribution's in binary form must reproduce the above copyright notice,
+//     this list of conditions and the following disclaimer in the documentation
+//     and/or other materials provided with the distribution.
+//
+//   * The name of Intel Corporation may not be used to endorse or promote products
+//     derived from this software without specific prior written permission.
+//
+// This software is provided by the copyright holders and contributors "as is" and
+// any express or implied warranties, including, but not limited to, the implied
+// warranties of merchantability and fitness for a particular purpose are disclaimed.
+// In no event shall the Intel Corporation or contributors be liable for any direct,
+// indirect, incidental, special, exemplary, or consequential damages
+// (including, but not limited to, procurement of substitute goods or services;
+// loss of use, data, or profits; or business interruption) however caused
+// and on any theory of liability, whether in contract, strict liability,
+// or tort (including negligence or otherwise) arising in any way out of
+// the use of this software, even if advised of the possibility of such damage.
+//
+//M*/
+
+#include "gputest.hpp"
+#include "highgui.h"
+
+using namespace cv;
+using namespace std;
+using namespace gpu;
+
+class CV_GpuNppImageAdditionTest : public CvTest
+{
+public:
+    CV_GpuNppImageAdditionTest();
+    ~CV_GpuNppImageAdditionTest();
+
+protected:
+    void run(int);
+};
+
+CV_GpuNppImageAdditionTest::CV_GpuNppImageAdditionTest(): CvTest( "GPU-NppImageAddition", "add" )
+{
+}
+
+CV_GpuNppImageAdditionTest::~CV_GpuNppImageAdditionTest() {}
+
+void CV_GpuNppImageAdditionTest::run( int )
+{
+    cv::Mat img_l = cv::imread(std::string(ts->get_data_path()) + "stereobm/aloe-L.png", 0);
+    cv::Mat img_r = cv::imread(std::string(ts->get_data_path()) + "stereobm/aloe-R.png", 0);
+
+    if (img_l.empty() || img_r.empty())
+    {
+        ts->set_failed_test_info(CvTS::FAIL_MISSING_TEST_DATA);
+        return;
+    }
+
+    cv::Mat cpuAdd;
+    cv::add(img_l, img_r, cpuAdd);
+
+    GpuMat gpuL(img_l);
+    GpuMat gpuR(img_r);
+    GpuMat gpuAdd;
+    cv::gpu::add(gpuL, gpuR, gpuAdd);
+
+    //namedWindow("gpu");
+    //imshow("gpu", gpuAdd);
+    //namedWindow("cpu");
+    //imshow("cpu", cpuAdd);
+    //waitKey(1000);
+
+    double ret = norm(cpuAdd, gpuAdd);
+
+    if (ret < 1.0)
+        ts->set_failed_test_info(CvTS::OK);
+    else
+    {
+        ts->printf(CvTS::CONSOLE, "\nNorm: %f\n", ret);
+        ts->set_failed_test_info(CvTS::FAIL_GENERIC);
+    }
+}
+
+CV_GpuNppImageAdditionTest CV_GpuNppImageAddition_test;
\ No newline at end of file