added gpu alpha premultiplication
authorVladislav Vinogradov <vlad.vinogradov@itseez.com>
Tue, 31 Jul 2012 06:32:16 +0000 (10:32 +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/test_color.cpp

index d3cd29a..543227a 100644 (file)
@@ -1277,6 +1277,31 @@ namespace
         luv_to_rgb(src, dst, -1, stream);\r
         bgr_to_rgb(dst, dst, -1, stream);\r
     }\r
+\r
+    void rgba_to_mbgra(const GpuMat& src, GpuMat& dst, int, Stream& stream)\r
+    {\r
+    #if (CUDA_VERSION < 5000)\r
+        (void)src;\r
+        (void)dst;\r
+        (void)stream;\r
+        CV_Error( CV_StsBadFlag, "Unknown/unsupported color conversion code" );\r
+    #else\r
+        CV_Assert(src.type() == CV_8UC4 || src.type() == CV_16UC4);\r
+\r
+        dst.create(src.size(), src.type());\r
+\r
+        NppStreamHandler h(StreamAccessor::getStream(stream));\r
+\r
+        NppiSize oSizeROI;\r
+        oSizeROI.width = src.cols;\r
+        oSizeROI.height = src.rows;\r
+\r
+        if (src.depth() == CV_8U)\r
+            nppSafeCall( nppiAlphaPremul_8u_AC4R(src.ptr<Npp8u>(), static_cast<int>(src.step), dst.ptr<Npp8u>(), static_cast<int>(dst.step), oSizeROI) );\r
+        else\r
+            nppSafeCall( nppiAlphaPremul_16u_AC4R(src.ptr<Npp16u>(), static_cast<int>(src.step), dst.ptr<Npp16u>(), static_cast<int>(dst.step), oSizeROI) );\r
+    #endif\r
+    }\r
 }\r
 \r
 void cv::gpu::cvtColor(const GpuMat& src, GpuMat& dst, int code, int dcn, Stream& stream)\r
@@ -1396,10 +1421,63 @@ void cv::gpu::cvtColor(const GpuMat& src, GpuMat& dst, int code, int dcn, Stream
         0,                      // CV_BayerBG2GRAY = 86\r
         0,                      // CV_BayerGB2GRAY = 87\r
         0,                      // CV_BayerRG2GRAY = 88\r
-        0                       // CV_BayerGR2GRAY = 89\r
+        0,                      // CV_BayerGR2GRAY = 89\r
+\r
+        //YUV 4:2:0 formats family\r
+        0,                      // COLOR_YUV2RGB_NV12 = 90,\r
+        0,                      // COLOR_YUV2BGR_NV12 = 91,\r
+        0,                      // COLOR_YUV2RGB_NV21 = 92,\r
+        0,                      // COLOR_YUV2BGR_NV21 = 93,\r
+\r
+        0,                      // COLOR_YUV2RGBA_NV12 = 94,\r
+        0,                      // COLOR_YUV2BGRA_NV12 = 95,\r
+        0,                      // COLOR_YUV2RGBA_NV21 = 96,\r
+        0,                      // COLOR_YUV2BGRA_NV21 = 97,\r
+\r
+        0,                      // COLOR_YUV2RGB_YV12 = 98,\r
+        0,                      // COLOR_YUV2BGR_YV12 = 99,\r
+        0,                      // COLOR_YUV2RGB_IYUV = 100,\r
+        0,                      // COLOR_YUV2BGR_IYUV = 101,\r
+\r
+        0,                      // COLOR_YUV2RGBA_YV12 = 102,\r
+        0,                      // COLOR_YUV2BGRA_YV12 = 103,\r
+        0,                      // COLOR_YUV2RGBA_IYUV = 104,\r
+        0,                      // COLOR_YUV2BGRA_IYUV = 105,\r
+\r
+        0,                      // COLOR_YUV2GRAY_420 = 106,\r
+\r
+        //YUV 4:2:2 formats family\r
+        0,                      // COLOR_YUV2RGB_UYVY = 107,\r
+        0,                      // COLOR_YUV2BGR_UYVY = 108,\r
+        0,                      // //COLOR_YUV2RGB_VYUY = 109,\r
+        0,                      // //COLOR_YUV2BGR_VYUY = 110,\r
+\r
+        0,                      // COLOR_YUV2RGBA_UYVY = 111,\r
+        0,                      // COLOR_YUV2BGRA_UYVY = 112,\r
+        0,                      // //COLOR_YUV2RGBA_VYUY = 113,\r
+        0,                      // //COLOR_YUV2BGRA_VYUY = 114,\r
+\r
+        0,                      // COLOR_YUV2RGB_YUY2 = 115,\r
+        0,                      // COLOR_YUV2BGR_YUY2 = 116,\r
+        0,                      // COLOR_YUV2RGB_YVYU = 117,\r
+        0,                      // COLOR_YUV2BGR_YVYU = 118,\r
+\r
+        0,                      // COLOR_YUV2RGBA_YUY2 = 119,\r
+        0,                      // COLOR_YUV2BGRA_YUY2 = 120,\r
+        0,                      // COLOR_YUV2RGBA_YVYU = 121,\r
+        0,                      // COLOR_YUV2BGRA_YVYU = 122,\r
+\r
+        0,                      // COLOR_YUV2GRAY_UYVY = 123,\r
+        0,                      // COLOR_YUV2GRAY_YUY2 = 124,\r
+\r
+        // alpha premultiplication\r
+        rgba_to_mbgra,          // COLOR_RGBA2mRGBA = 125,\r
+        0,                      // COLOR_mRGBA2RGBA = 126,\r
+\r
+        0,                      // COLOR_COLORCVT_MAX  = 127\r
     };\r
 \r
-    CV_Assert(code < 94);\r
+    CV_Assert(code < 128);\r
 \r
     func_t func = funcs[code];\r
 \r
index 996f84d..89ca1a7 100644 (file)
@@ -1717,6 +1717,33 @@ TEST_P(CvtColor, RGB2Luv)
     }
 }
 
+TEST_P(CvtColor, RGBA2mRGBA)
+{
+    if (depth != CV_8U)
+        return;
+
+    try
+    {
+        cv::Mat src = randomMat(size, CV_MAKE_TYPE(depth, 4));
+
+        cv::gpu::GpuMat dst = createMat(src.size(), src.type(), useRoi);
+        cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_RGBA2mRGBA);
+
+        cv::Mat dst_gold;
+        cv::cvtColor(src, dst_gold, cv::COLOR_RGBA2mRGBA);
+
+        EXPECT_MAT_NEAR(dst_gold, dst, 1);
+    }
+    catch (const cv::Exception& e)
+    {
+#if (CUDA_VERSION < 5000)
+        ASSERT_EQ(CV_StsBadFlag, e.code);
+#else
+        FAIL();
+#endif
+    }
+}
+
 INSTANTIATE_TEST_CASE_P(GPU_ImgProc, CvtColor, testing::Combine(
     ALL_DEVICES,
     DIFFERENT_SIZES,