From 8e380639657eb8960ef809e6ea43e8cb297f3344 Mon Sep 17 00:00:00 2001 From: Kirill Kornyakov Date: Fri, 10 Sep 2010 15:04:54 +0000 Subject: [PATCH] gpu::add now supports 8UC4 and 32FC1 --- modules/gpu/src/arithm.cpp | 34 +++++--- modules/gpu/src/precomp.hpp | 1 + tests/gpu/src/npp_image_addition.cpp | 118 +++++++++++++++++++++------ 3 files changed, 119 insertions(+), 34 deletions(-) diff --git a/modules/gpu/src/arithm.cpp b/modules/gpu/src/arithm.cpp index 1be3290eeb..adde39ffc5 100644 --- a/modules/gpu/src/arithm.cpp +++ b/modules/gpu/src/arithm.cpp @@ -41,7 +41,6 @@ //M*/ #include "precomp.hpp" -#include "npp.h" //TODO: move to the precomp.hpp using namespace cv; using namespace cv::gpu; @@ -55,24 +54,39 @@ void cv::gpu::add(const GpuMat& src1, const GpuMat& src2, GpuMat& dst) { throw_n void cv::gpu::add(const GpuMat& src1, const GpuMat& src2, GpuMat& dst) { + dst.create( src1.size(), src1.type() ); + CV_Assert(src1.size() == src2.size() && src1.type() == src2.type()); - dst.create( src1.size(), src1.type() ); - - CV_DbgAssert(src1.depth() == CV_8U || src1.depth() == CV_32F); - CV_DbgAssert(src1.channels() == 1 || src1.channels() == 4); + int nChannels = src1.channels(); + CV_DbgAssert((src1.depth() == CV_8U && nChannels == 1 || nChannels == 4) || + (src1.depth() == CV_32F && nChannels == 1)); NppiSize sz; - sz.width = src1.cols; + sz.width = src1.cols; sz.height = src1.rows; if (src1.depth() == CV_8U) { - nppiAdd_8u_C1RSfs((const Npp8u*)src1.ptr(), src1.step, - (const Npp8u*)src2.ptr(), src2.step, - (Npp8u*)dst.ptr(), dst.step, sz, 0); + if (nChannels == 1) + { + nppiAdd_8u_C1RSfs((const Npp8u*)src1.ptr(), src1.step, + (const Npp8u*)src2.ptr(), src2.step, + (Npp8u*)dst.ptr(), dst.step, sz, 0); + } + else + { + nppiAdd_8u_C4RSfs((const Npp8u*)src1.ptr(), src1.step, + (const Npp8u*)src2.ptr(), src2.step, + (Npp8u*)dst.ptr(), dst.step, sz, 0); + } + } + else //if (src1.depth() == CV_32F) + { + nppiAdd_32f_C1R((const Npp32f*)src1.ptr(), src1.step, + (const Npp32f*)src2.ptr(), src2.step, + (Npp32f*)dst.ptr(), dst.step, sz); } - //TODO: implement other depths } #endif /* !defined (HAVE_CUDA) */ \ No newline at end of file diff --git a/modules/gpu/src/precomp.hpp b/modules/gpu/src/precomp.hpp index ca89c7292f..948907784a 100644 --- a/modules/gpu/src/precomp.hpp +++ b/modules/gpu/src/precomp.hpp @@ -62,6 +62,7 @@ #include "cuda_shared.hpp" #include "cuda_runtime_api.h" #include "opencv2/gpu/stream_accessor.hpp" + #include "npp.h" #else /* defined(HAVE_CUDA) */ diff --git a/tests/gpu/src/npp_image_addition.cpp b/tests/gpu/src/npp_image_addition.cpp index 46be3e710c..fd6e7562e3 100644 --- a/tests/gpu/src/npp_image_addition.cpp +++ b/tests/gpu/src/npp_image_addition.cpp @@ -40,7 +40,8 @@ //M*/ #include "gputest.hpp" -#include "highgui.h" +#include "opencv2/imgproc/imgproc.hpp" +#include "opencv2/highgui/highgui.hpp" using namespace cv; using namespace std; @@ -54,6 +55,13 @@ public: protected: void run(int); + + int test8UC1(const Mat& imgL, const Mat& imgR); + int test8UC4(const Mat& imgL, const Mat& imgR); + int test32FC1(const Mat& imgL, const Mat& imgR); + + int test(const Mat& imgL, const Mat& imgR); + int CheckNorm(const Mat& m1, const Mat& m2); }; CV_GpuNppImageAdditionTest::CV_GpuNppImageAdditionTest(): CvTest( "GPU-NppImageAddition", "add" ) @@ -62,10 +70,72 @@ CV_GpuNppImageAdditionTest::CV_GpuNppImageAdditionTest(): CvTest( "GPU-NppImageA CV_GpuNppImageAdditionTest::~CV_GpuNppImageAdditionTest() {} +int CV_GpuNppImageAdditionTest::test8UC1(const Mat& imgL, const Mat& imgR) +{ + cv::Mat imgL_C1; + cv::Mat imgR_C1; + cvtColor(imgL, imgL_C1, CV_BGR2GRAY); + cvtColor(imgR, imgR_C1, CV_BGR2GRAY); + + return test(imgL_C1, imgR_C1); +} + +int CV_GpuNppImageAdditionTest::test8UC4(const Mat& imgL, const Mat& imgR) +{ + cv::Mat imgL_C4; + cv::Mat imgR_C4; + cvtColor(imgL, imgL_C4, CV_BGR2BGRA); + cvtColor(imgR, imgR_C4, CV_BGR2BGRA); + + return test(imgL_C4, imgR_C4); +} + +int CV_GpuNppImageAdditionTest::test32FC1( const Mat& imgL, const Mat& imgR ) +{ + cv::Mat imgL_C1; + cv::Mat imgR_C1; + cvtColor(imgL, imgL_C1, CV_BGR2GRAY); + cvtColor(imgR, imgR_C1, CV_BGR2GRAY); + + imgL_C1.convertTo(imgL_C1, CV_32F); + imgR_C1.convertTo(imgR_C1, CV_32F); + + return test(imgL_C1, imgR_C1); +} + +int CV_GpuNppImageAdditionTest::test( const Mat& imgL, const Mat& imgR ) +{ + cv::Mat cpuAdd; + cv::add(imgL, imgR, cpuAdd); + + GpuMat gpuL(imgL); + GpuMat gpuR(imgR); + GpuMat gpuAdd; + cv::gpu::add(gpuL, gpuR, gpuAdd); + + return CheckNorm(cpuAdd, gpuAdd); +} + +int CV_GpuNppImageAdditionTest::CheckNorm(const Mat& m1, const Mat& m2) +{ + double ret = norm(m1, m2); + + if (ret < 1.0) + { + return CvTS::OK; + } + else + { + ts->printf(CvTS::LOG, "\nNorm: %f\n", ret); + return CvTS::FAIL_GENERIC; + } +} + 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); + //load images + cv::Mat img_l = cv::imread(std::string(ts->get_data_path()) + "stereobm/aloe-L.png"); + cv::Mat img_r = cv::imread(std::string(ts->get_data_path()) + "stereobm/aloe-R.png"); if (img_l.empty() || img_r.empty()) { @@ -73,29 +143,29 @@ void CV_GpuNppImageAdditionTest::run( int ) 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 + //run tests + int testResult = test8UC1(img_l, img_r); + if (testResult != CvTS::OK) { - ts->printf(CvTS::CONSOLE, "\nNorm: %f\n", ret); - ts->set_failed_test_info(CvTS::FAIL_GENERIC); + ts->set_failed_test_info(testResult); + return; } + + testResult = test8UC4(img_l, img_r); + if (testResult != CvTS::OK) + { + ts->set_failed_test_info(testResult); + return; + } + + testResult = test32FC1(img_l, img_r); + if (testResult != CvTS::OK) + { + ts->set_failed_test_info(testResult); + return; + } + + ts->set_failed_test_info(CvTS::OK); } CV_GpuNppImageAdditionTest CV_GpuNppImageAddition_test; \ No newline at end of file