//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
\r
void cv::gpu::add(const GpuMat& src1, const GpuMat& src2, GpuMat& dst)\r
{\r
+ dst.create( src1.size(), src1.type() );\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
+ int nChannels = src1.channels();\r
+ CV_DbgAssert((src1.depth() == CV_8U && nChannels == 1 || nChannels == 4) || \r
+ (src1.depth() == CV_32F && nChannels == 1));\r
\r
NppiSize sz;\r
- sz.width = src1.cols;\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
+ if (nChannels == 1)\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
+ else\r
+ {\r
+ nppiAdd_8u_C4RSfs((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
+ }\r
+ else //if (src1.depth() == CV_32F)\r
+ {\r
+ nppiAdd_32f_C1R((const Npp32f*)src1.ptr<float>(), src1.step,\r
+ (const Npp32f*)src2.ptr<float>(), src2.step,\r
+ (Npp32f*)dst.ptr<float>(), dst.step, sz);\r
}\r
- //TODO: implement other depths\r
}\r
\r
#endif /* !defined (HAVE_CUDA) */
\ No newline at end of file
//M*/
#include "gputest.hpp"
-#include "highgui.h"
+#include "opencv2/imgproc/imgproc.hpp"
+#include "opencv2/highgui/highgui.hpp"
using namespace cv;
using namespace std;
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" )
CV_GpuNppImageAdditionTest::~CV_GpuNppImageAdditionTest() {}
-void CV_GpuNppImageAdditionTest::run( int )
+int CV_GpuNppImageAdditionTest::test8UC1(const Mat& imgL, const Mat& imgR)
{
- 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);
+ cv::Mat imgL_C1;
+ cv::Mat imgR_C1;
+ cvtColor(imgL, imgL_C1, CV_BGR2GRAY);
+ cvtColor(imgR, imgR_C1, CV_BGR2GRAY);
- if (img_l.empty() || img_r.empty())
- {
- ts->set_failed_test_info(CvTS::FAIL_MISSING_TEST_DATA);
- return;
- }
+ 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(img_l, img_r, cpuAdd);
+ cv::add(imgL, imgR, cpuAdd);
- GpuMat gpuL(img_l);
- GpuMat gpuR(img_r);
+ GpuMat gpuL(imgL);
+ GpuMat gpuR(imgR);
GpuMat gpuAdd;
cv::gpu::add(gpuL, gpuR, gpuAdd);
- //namedWindow("gpu");
- //imshow("gpu", gpuAdd);
- //namedWindow("cpu");
- //imshow("cpu", cpuAdd);
- //waitKey(1000);
+ return CheckNorm(cpuAdd, gpuAdd);
+}
- double ret = norm(cpuAdd, gpuAdd);
+int CV_GpuNppImageAdditionTest::CheckNorm(const Mat& m1, const Mat& m2)
+{
+ double ret = norm(m1, m2);
if (ret < 1.0)
- ts->set_failed_test_info(CvTS::OK);
+ {
+ return CvTS::OK;
+ }
else
{
- ts->printf(CvTS::CONSOLE, "\nNorm: %f\n", ret);
- ts->set_failed_test_info(CvTS::FAIL_GENERIC);
+ ts->printf(CvTS::LOG, "\nNorm: %f\n", ret);
+ return CvTS::FAIL_GENERIC;
+ }
+}
+
+void CV_GpuNppImageAdditionTest::run( int )
+{
+ //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())
+ {
+ ts->set_failed_test_info(CvTS::FAIL_MISSING_TEST_DATA);
+ return;
+ }
+
+ //run tests
+ int testResult = test8UC1(img_l, img_r);
+ if (testResult != CvTS::OK)
+ {
+ 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