From 79d0dc25f4e93d5f82dd855a5e140c82449c3cff Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Mon, 30 Jul 2012 18:24:52 +0400 Subject: [PATCH] added gpu RGB<->Lab and BGR<->Luv conversions --- modules/gpu/src/color.cpp | 32 ++++++++++++++++++--- modules/gpu/test/main.cpp | 2 -- modules/gpu/test/precomp.hpp | 5 ++++ modules/gpu/test/test_color.cpp | 62 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+), 6 deletions(-) diff --git a/modules/gpu/src/color.cpp b/modules/gpu/src/color.cpp index 1fe8e87..d3cd29a 100644 --- a/modules/gpu/src/color.cpp +++ b/modules/gpu/src/color.cpp @@ -1170,6 +1170,12 @@ namespace #endif } + void rgb_to_lab(const GpuMat& src, GpuMat& dst, int, Stream& stream) + { + bgr_to_rgb(src, dst, -1, stream); + bgr_to_lab(dst, dst, -1, stream); + } + void lab_to_bgr(const GpuMat& src, GpuMat& dst, int dcn, Stream& stream) { #if (CUDA_VERSION < 5000) @@ -1196,6 +1202,12 @@ namespace #endif } + void lab_to_rgb(const GpuMat& src, GpuMat& dst, int, Stream& stream) + { + lab_to_bgr(src, dst, -1, stream); + bgr_to_rgb(dst, dst, -1, stream); + } + void rgb_to_luv(const GpuMat& src, GpuMat& dst, int dcn, Stream& stream) { #if (CUDA_VERSION < 5000) @@ -1225,6 +1237,12 @@ namespace #endif } + void bgr_to_luv(const GpuMat& src, GpuMat& dst, int, Stream& stream) + { + bgr_to_rgb(src, dst, -1, stream); + rgb_to_luv(dst, dst, -1, stream); + } + void luv_to_rgb(const GpuMat& src, GpuMat& dst, int dcn, Stream& stream) { #if (CUDA_VERSION < 5000) @@ -1253,6 +1271,12 @@ namespace nppSafeCall( nppiLUVToRGB_8u_AC4R(src.ptr(), static_cast(src.step), dst.ptr(), static_cast(dst.step), oSizeROI) ); #endif } + + void luv_to_bgr(const GpuMat& src, GpuMat& dst, int, Stream& stream) + { + luv_to_rgb(src, dst, -1, stream); + bgr_to_rgb(dst, dst, -1, stream); + } } void cv::gpu::cvtColor(const GpuMat& src, GpuMat& dst, int code, int dcn, Stream& stream) @@ -1315,14 +1339,14 @@ void cv::gpu::cvtColor(const GpuMat& src, GpuMat& dst, int code, int dcn, Stream 0, // =43 bgr_to_lab, // CV_BGR2Lab =44 - 0, // CV_RGB2Lab =45 + rgb_to_lab, // CV_RGB2Lab =45 0, // CV_BayerBG2BGR =46 0, // CV_BayerGB2BGR =47 0, // CV_BayerRG2BGR =48 0, // CV_BayerGR2BGR =49 - 0, // CV_BGR2Luv =50 + bgr_to_luv, // CV_BGR2Luv =50 rgb_to_luv, // CV_RGB2Luv =51 bgr_to_hls, // CV_BGR2HLS =52 @@ -1332,8 +1356,8 @@ void cv::gpu::cvtColor(const GpuMat& src, GpuMat& dst, int code, int dcn, Stream hsv_to_rgb, // CV_HSV2RGB =55 lab_to_bgr, // CV_Lab2BGR =56 - 0, // CV_Lab2RGB =57 - 0, // CV_Luv2BGR =58 + lab_to_rgb, // CV_Lab2RGB =57 + luv_to_bgr, // CV_Luv2BGR =58 luv_to_rgb, // CV_Luv2RGB =59 hls_to_bgr, // CV_HLS2BGR =60 diff --git a/modules/gpu/test/main.cpp b/modules/gpu/test/main.cpp index 4d9d380..6a8c67d 100644 --- a/modules/gpu/test/main.cpp +++ b/modules/gpu/test/main.cpp @@ -43,8 +43,6 @@ #ifdef HAVE_CUDA -#include - using namespace std; using namespace cv; using namespace cv::gpu; diff --git a/modules/gpu/test/precomp.hpp b/modules/gpu/test/precomp.hpp index cc708b5..afc3be8 100644 --- a/modules/gpu/test/precomp.hpp +++ b/modules/gpu/test/precomp.hpp @@ -72,4 +72,9 @@ #include "utility.hpp" #include "interpolation.hpp" +#ifdef HAVE_CUDA + #include + #include +#endif + #endif diff --git a/modules/gpu/test/test_color.cpp b/modules/gpu/test/test_color.cpp index 1c08d6a..996f84d 100644 --- a/modules/gpu/test/test_color.cpp +++ b/modules/gpu/test/test_color.cpp @@ -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 } } -- 2.7.4