Box filter implemented for CV_32FC1
authorfilipsladek <filip.sladek@gmail.com>
Tue, 29 Mar 2016 20:30:49 +0000 (22:30 +0200)
committerfilipsladek <filip.sladek@gmail.com>
Tue, 29 Mar 2016 20:30:49 +0000 (22:30 +0200)
modules/cudafilters/include/opencv2/cudafilters.hpp
modules/cudafilters/src/filtering.cpp

index 2d52265..6769f06 100644 (file)
@@ -89,7 +89,7 @@ public:
 
 /** @brief Creates a normalized 2D box filter.
 
-@param srcType Input image type. Only CV_8UC1 and CV_8UC4 are supported for now.
+@param srcType Input image type. Only CV_8UC1, CV_8UC4 and CV_32FC1 are supported for now.
 @param dstType Output image type. Only the same type as src is supported for now.
 @param ksize Kernel size.
 @param anchor Anchor point. The default value Point(-1, -1) means that the anchor is at the kernel
index b90a8c1..587fbe1 100644 (file)
@@ -103,13 +103,14 @@ namespace
         void apply(InputArray src, OutputArray dst, Stream& stream = Stream::Null());
 
     private:
-        typedef NppStatus (*nppFilterBox_t)(const Npp8u* pSrc, Npp32s nSrcStep, Npp8u* pDst, Npp32s nDstStep,
+        typedef NppStatus (*nppFilterBox8U_t)(const Npp8u* pSrc, Npp32s nSrcStep, Npp8u* pDst, Npp32s nDstStep,
+                                            NppiSize oSizeROI, NppiSize oMaskSize, NppiPoint oAnchor);
+        typedef NppStatus (*nppFilterBox32F_t)(const Npp32f* pSrc, Npp32s nSrcStep, Npp32f* pDst, Npp32s nDstStep,
                                             NppiSize oSizeROI, NppiSize oMaskSize, NppiPoint oAnchor);
 
         Size ksize_;
         Point anchor_;
         int type_;
-        nppFilterBox_t func_;
         int borderMode_;
         Scalar borderVal_;
         GpuMat srcBorder_;
@@ -118,14 +119,10 @@ namespace
     NPPBoxFilter::NPPBoxFilter(int srcType, int dstType, Size ksize, Point anchor, int borderMode, Scalar borderVal) :
         ksize_(ksize), anchor_(anchor), type_(srcType), borderMode_(borderMode), borderVal_(borderVal)
     {
-        static const nppFilterBox_t funcs[] = {0, nppiFilterBox_8u_C1R, 0, 0, nppiFilterBox_8u_C4R};
-
-        CV_Assert( srcType == CV_8UC1 || srcType == CV_8UC4 );
+        CV_Assert( srcType == CV_8UC1 || srcType == CV_8UC4 || srcType == CV_32FC1);
         CV_Assert( dstType == srcType );
 
         normalizeAnchor(anchor_, ksize);
-
-        func_ = funcs[CV_MAT_CN(srcType)];
     }
 
     void NPPBoxFilter::apply(InputArray _src, OutputArray _dst, Stream& _stream)
@@ -155,10 +152,30 @@ namespace
         oAnchor.x = anchor_.x;
         oAnchor.y = anchor_.y;
 
-        nppSafeCall( func_(srcRoi.ptr<Npp8u>(), static_cast<int>(srcRoi.step),
-                           dst.ptr<Npp8u>(), static_cast<int>(dst.step),
-                           oSizeROI, oMaskSize, oAnchor) );
+       const int depth = CV_MAT_DEPTH(type_);
+       const int cn = CV_MAT_CN(type_);
 
+       switch (depth)
+       {
+        case CV_8U:
+        {
+            static const nppFilterBox8U_t funcs8U[] = { 0, nppiFilterBox_8u_C1R, 0, 0, nppiFilterBox_8u_C4R };
+            const nppFilterBox8U_t func8U = funcs8U[cn];
+            nppSafeCall(func8U(srcRoi.ptr<Npp8u>(), static_cast<int>(srcRoi.step),
+                dst.ptr<Npp8u>(), static_cast<int>(dst.step),
+                oSizeROI, oMaskSize, oAnchor));
+        }
+            break;
+        case CV_32F:
+        {
+            static const nppFilterBox32F_t funcs32F[] = { 0, nppiFilterBox_32f_C1R, 0, 0, 0 };
+            const nppFilterBox32F_t func32F = funcs32F[cn];
+            nppSafeCall(func32F(srcRoi.ptr<Npp32f>(), static_cast<int>(srcRoi.step),
+                dst.ptr<Npp32f>(), static_cast<int>(dst.step),
+                oSizeROI, oMaskSize, oAnchor));
+        }
+            break;
+        }
         if (stream == 0)
             cudaSafeCall( cudaDeviceSynchronize() );
     }