added gpu RGB<->Lab and BGR<->Luv conversions
authorVladislav Vinogradov <vlad.vinogradov@itseez.com>
Mon, 30 Jul 2012 14:24:52 +0000 (18:24 +0400)
committerVladislav Vinogradov <vlad.vinogradov@itseez.com>
Tue, 31 Jul 2012 08:46:04 +0000 (12:46 +0400)
modules/gpu/src/color.cpp
modules/gpu/test/main.cpp
modules/gpu/test/precomp.hpp
modules/gpu/test/test_color.cpp

index 1fe8e87..d3cd29a 100644 (file)
@@ -1170,6 +1170,12 @@ namespace
         #endif\r
     }\r
 \r
+    void rgb_to_lab(const GpuMat& src, GpuMat& dst, int, Stream& stream)\r
+    {\r
+        bgr_to_rgb(src, dst, -1, stream);\r
+        bgr_to_lab(dst, dst, -1, stream);\r
+    }\r
+\r
     void lab_to_bgr(const GpuMat& src, GpuMat& dst, int dcn, Stream& stream)\r
     {\r
         #if (CUDA_VERSION < 5000)\r
@@ -1196,6 +1202,12 @@ namespace
         #endif\r
     }\r
 \r
+    void lab_to_rgb(const GpuMat& src, GpuMat& dst, int, Stream& stream)\r
+    {\r
+        lab_to_bgr(src, dst, -1, stream);\r
+        bgr_to_rgb(dst, dst, -1, stream);\r
+    }\r
+\r
     void rgb_to_luv(const GpuMat& src, GpuMat& dst, int dcn, Stream& stream)\r
     {\r
         #if (CUDA_VERSION < 5000)\r
@@ -1225,6 +1237,12 @@ namespace
         #endif\r
     }\r
 \r
+    void bgr_to_luv(const GpuMat& src, GpuMat& dst, int, Stream& stream)\r
+    {\r
+        bgr_to_rgb(src, dst, -1, stream);\r
+        rgb_to_luv(dst, dst, -1, stream);\r
+    }\r
+\r
     void luv_to_rgb(const GpuMat& src, GpuMat& dst, int dcn, Stream& stream)\r
     {\r
         #if (CUDA_VERSION < 5000)\r
@@ -1253,6 +1271,12 @@ namespace
                 nppSafeCall( nppiLUVToRGB_8u_AC4R(src.ptr<Npp8u>(), static_cast<int>(src.step), dst.ptr<Npp8u>(), static_cast<int>(dst.step), oSizeROI) );\r
         #endif\r
     }\r
+\r
+    void luv_to_bgr(const GpuMat& src, GpuMat& dst, int, Stream& stream)\r
+    {\r
+        luv_to_rgb(src, dst, -1, stream);\r
+        bgr_to_rgb(dst, dst, -1, stream);\r
+    }\r
 }\r
 \r
 void cv::gpu::cvtColor(const GpuMat& src, GpuMat& dst, int code, int dcn, Stream& stream)\r
@@ -1315,14 +1339,14 @@ void cv::gpu::cvtColor(const GpuMat& src, GpuMat& dst, int code, int dcn, Stream
         0,                      //                =43\r
 \r
         bgr_to_lab,             // CV_BGR2Lab     =44\r
-        0,                      // CV_RGB2Lab     =45\r
+        rgb_to_lab,             // CV_RGB2Lab     =45\r
 \r
         0,                      // CV_BayerBG2BGR =46\r
         0,                      // CV_BayerGB2BGR =47\r
         0,                      // CV_BayerRG2BGR =48\r
         0,                      // CV_BayerGR2BGR =49\r
 \r
-        0,                      // CV_BGR2Luv     =50\r
+        bgr_to_luv,             // CV_BGR2Luv     =50\r
         rgb_to_luv,             // CV_RGB2Luv     =51\r
 \r
         bgr_to_hls,             // CV_BGR2HLS     =52\r
@@ -1332,8 +1356,8 @@ void cv::gpu::cvtColor(const GpuMat& src, GpuMat& dst, int code, int dcn, Stream
         hsv_to_rgb,             // CV_HSV2RGB     =55\r
 \r
         lab_to_bgr,             // CV_Lab2BGR     =56\r
-        0,                      // CV_Lab2RGB     =57\r
-        0,                      // CV_Luv2BGR     =58\r
+        lab_to_rgb,             // CV_Lab2RGB     =57\r
+        luv_to_bgr,             // CV_Luv2BGR     =58\r
         luv_to_rgb,             // CV_Luv2RGB     =59\r
 \r
         hls_to_bgr,             // CV_HLS2BGR     =60\r
index 4d9d380..6a8c67d 100644 (file)
@@ -43,8 +43,6 @@
 \r
 #ifdef HAVE_CUDA\r
 \r
-#include <cuda_runtime_api.h>\r
-\r
 using namespace std;\r
 using namespace cv;\r
 using namespace cv::gpu;\r
index cc708b5..afc3be8 100644 (file)
@@ -72,4 +72,9 @@
 #include "utility.hpp"\r
 #include "interpolation.hpp"\r
 \r
+#ifdef HAVE_CUDA\r
+    #include <cuda.h>\r
+    #include <cuda_runtime.h>\r
+#endif\r
+\r
 #endif\r
index 1c08d6a..996f84d 100644 (file)
@@ -1628,7 +1628,38 @@ TEST_P(CvtColor, BGR2Lab)
     }
     catch (const cv::Exception& e)
     {
+#if (CUDA_VERSION < 5000)
         ASSERT_EQ(CV_StsBadFlag, e.code);
+#else
+        FAIL();
+#endif
+    }
+}
+
+TEST_P(CvtColor, RGB2Lab)
+{
+    if (depth != CV_8U)
+        return;
+
+    try
+    {
+        cv::Mat src = readImage("stereobm/aloe-L.png");
+
+        cv::gpu::GpuMat dst_lab = createMat(src.size(), src.type(), useRoi);
+        cv::gpu::cvtColor(loadMat(src, useRoi), dst_lab, cv::COLOR_RGB2Lab);
+
+        cv::gpu::GpuMat dst_bgr = createMat(src.size(), src.type(), useRoi);
+        cv::gpu::cvtColor(dst_lab, dst_bgr, cv::COLOR_Lab2RGB);
+
+        EXPECT_MAT_NEAR(src, dst_bgr, 10);
+    }
+    catch (const cv::Exception& e)
+    {
+#if (CUDA_VERSION < 5000)
+        ASSERT_EQ(CV_StsBadFlag, e.code);
+#else
+        FAIL();
+#endif
     }
 }
 
@@ -1642,6 +1673,33 @@ TEST_P(CvtColor, BGR2Luv)
         cv::Mat src = img;
 
         cv::gpu::GpuMat dst_luv = createMat(src.size(), src.type(), useRoi);
+        cv::gpu::cvtColor(loadMat(src, useRoi), dst_luv, cv::COLOR_BGR2Luv);
+
+        cv::gpu::GpuMat dst_rgb = createMat(src.size(), src.type(), useRoi);
+        cv::gpu::cvtColor(dst_luv, dst_rgb, cv::COLOR_Luv2BGR);
+
+        EXPECT_MAT_NEAR(src, dst_rgb, 10);
+    }
+    catch (const cv::Exception& e)
+    {
+#if (CUDA_VERSION < 5000)
+        ASSERT_EQ(CV_StsBadFlag, e.code);
+#else
+        FAIL();
+#endif
+    }
+}
+
+TEST_P(CvtColor, RGB2Luv)
+{
+    if (depth != CV_8U)
+        return;
+
+    try
+    {
+        cv::Mat src = img;
+
+        cv::gpu::GpuMat dst_luv = createMat(src.size(), src.type(), useRoi);
         cv::gpu::cvtColor(loadMat(src, useRoi), dst_luv, cv::COLOR_RGB2Luv);
 
         cv::gpu::GpuMat dst_rgb = createMat(src.size(), src.type(), useRoi);
@@ -1651,7 +1709,11 @@ TEST_P(CvtColor, BGR2Luv)
     }
     catch (const cv::Exception& e)
     {
+#if (CUDA_VERSION < 5000)
         ASSERT_EQ(CV_StsBadFlag, e.code);
+#else
+        FAIL();
+#endif
     }
 }