@ -48,8 +48,8 @@ using namespace cv::gpu;
# if !defined (HAVE_CUDA)
# if !defined (HAVE_CUDA)
Ptr < FilterEngine_GPU > cv : : gpu : : createFilter2D_GPU ( const Ptr < BaseFilter_GPU > ) { throw_nogpu ( ) ; return Ptr < FilterEngine_GPU > ( 0 ) ; }
Ptr < FilterEngine_GPU > cv : : gpu : : createFilter2D_GPU ( const Ptr < BaseFilter_GPU > , int , int ) { throw_nogpu ( ) ; return Ptr < FilterEngine_GPU > ( 0 ) ; }
Ptr < FilterEngine_GPU > cv : : gpu : : createSeparableFilter_GPU ( const Ptr < BaseRowFilter_GPU > & , const Ptr < BaseColumnFilter_GPU > & ) { throw_nogpu ( ) ; return Ptr < FilterEngine_GPU > ( 0 ) ; }
Ptr < FilterEngine_GPU > cv : : gpu : : createSeparableFilter_GPU ( const Ptr < BaseRowFilter_GPU > & , const Ptr < BaseColumnFilter_GPU > & , int , int , int ) { throw_nogpu ( ) ; return Ptr < FilterEngine_GPU > ( 0 ) ; }
Ptr < BaseRowFilter_GPU > cv : : gpu : : getRowSumFilter_GPU ( int , int , int , int ) { throw_nogpu ( ) ; return Ptr < BaseRowFilter_GPU > ( 0 ) ; }
Ptr < BaseRowFilter_GPU > cv : : gpu : : getRowSumFilter_GPU ( int , int , int , int ) { throw_nogpu ( ) ; return Ptr < BaseRowFilter_GPU > ( 0 ) ; }
Ptr < BaseColumnFilter_GPU > cv : : gpu : : getColumnSumFilter_GPU ( int , int , int , int ) { throw_nogpu ( ) ; return Ptr < BaseColumnFilter_GPU > ( 0 ) ; }
Ptr < BaseColumnFilter_GPU > cv : : gpu : : getColumnSumFilter_GPU ( int , int , int , int ) { throw_nogpu ( ) ; return Ptr < BaseColumnFilter_GPU > ( 0 ) ; }
Ptr < BaseFilter_GPU > cv : : gpu : : getBoxFilter_GPU ( int , int , const Size & , Point ) { throw_nogpu ( ) ; return Ptr < BaseFilter_GPU > ( 0 ) ; }
Ptr < BaseFilter_GPU > cv : : gpu : : getBoxFilter_GPU ( int , int , const Size & , Point ) { throw_nogpu ( ) ; return Ptr < BaseFilter_GPU > ( 0 ) ; }
@ -58,11 +58,11 @@ Ptr<BaseFilter_GPU> cv::gpu::getMorphologyFilter_GPU(int, int, const Mat&, const
Ptr < FilterEngine_GPU > cv : : gpu : : createMorphologyFilter_GPU ( int , int , const Mat & , const Point & , int ) { throw_nogpu ( ) ; return Ptr < FilterEngine_GPU > ( 0 ) ; }
Ptr < FilterEngine_GPU > cv : : gpu : : createMorphologyFilter_GPU ( int , int , const Mat & , const Point & , int ) { throw_nogpu ( ) ; return Ptr < FilterEngine_GPU > ( 0 ) ; }
Ptr < BaseFilter_GPU > cv : : gpu : : getLinearFilter_GPU ( int , int , const Mat & , const Size & , Point ) { throw_nogpu ( ) ; return Ptr < BaseFilter_GPU > ( 0 ) ; }
Ptr < BaseFilter_GPU > cv : : gpu : : getLinearFilter_GPU ( int , int , const Mat & , const Size & , Point ) { throw_nogpu ( ) ; return Ptr < BaseFilter_GPU > ( 0 ) ; }
Ptr < FilterEngine_GPU > cv : : gpu : : createLinearFilter_GPU ( int , int , const Mat & , const Point & ) { throw_nogpu ( ) ; return Ptr < FilterEngine_GPU > ( 0 ) ; }
Ptr < FilterEngine_GPU > cv : : gpu : : createLinearFilter_GPU ( int , int , const Mat & , const Point & ) { throw_nogpu ( ) ; return Ptr < FilterEngine_GPU > ( 0 ) ; }
Ptr < BaseRowFilter_GPU > cv : : gpu : : getLinearRowFilter_GPU ( int , int , const Mat & , int ) { throw_nogpu ( ) ; return Ptr < BaseRowFilter_GPU > ( 0 ) ; }
Ptr < BaseRowFilter_GPU > cv : : gpu : : getLinearRowFilter_GPU ( int , int , const Mat & , int , int ) { throw_nogpu ( ) ; return Ptr < BaseRowFilter_GPU > ( 0 ) ; }
Ptr < BaseColumnFilter_GPU > cv : : gpu : : getLinearColumnFilter_GPU ( int , int , const Mat & , int ) { throw_nogpu ( ) ; return Ptr < BaseColumnFilter_GPU > ( 0 ) ; }
Ptr < BaseColumnFilter_GPU > cv : : gpu : : getLinearColumnFilter_GPU ( int , int , const Mat & , int , int ) { throw_nogpu ( ) ; return Ptr < BaseColumnFilter_GPU > ( 0 ) ; }
Ptr < FilterEngine_GPU > cv : : gpu : : createSeparableLinearFilter_GPU ( int , int , const Mat & , const Mat & , const Point & ) { throw_nogpu ( ) ; return Ptr < FilterEngine_GPU > ( 0 ) ; }
Ptr < FilterEngine_GPU > cv : : gpu : : createSeparableLinearFilter_GPU ( int , int , const Mat & , const Mat & , const Point & , int , int ) { throw_nogpu ( ) ; return Ptr < FilterEngine_GPU > ( 0 ) ; }
Ptr < FilterEngine_GPU > cv : : gpu : : createDerivFilter_GPU ( int , int , int , int , int ) { throw_nogpu ( ) ; return Ptr < FilterEngine_GPU > ( 0 ) ; }
Ptr < FilterEngine_GPU > cv : : gpu : : createDerivFilter_GPU ( int , int , int , int , int , int , int ) { throw_nogpu ( ) ; return Ptr < FilterEngine_GPU > ( 0 ) ; }
Ptr < FilterEngine_GPU > cv : : gpu : : createGaussianFilter_GPU ( int , Size , double , double ) { throw_nogpu ( ) ; return Ptr < FilterEngine_GPU > ( 0 ) ; }
Ptr < FilterEngine_GPU > cv : : gpu : : createGaussianFilter_GPU ( int , Size , double , double , int , int ) { throw_nogpu ( ) ; return Ptr < FilterEngine_GPU > ( 0 ) ; }
Ptr < BaseFilter_GPU > cv : : gpu : : getMaxFilter_GPU ( int , int , const Size & , Point ) { throw_nogpu ( ) ; return Ptr < BaseFilter_GPU > ( 0 ) ; }
Ptr < BaseFilter_GPU > cv : : gpu : : getMaxFilter_GPU ( int , int , const Size & , Point ) { throw_nogpu ( ) ; return Ptr < BaseFilter_GPU > ( 0 ) ; }
Ptr < BaseFilter_GPU > cv : : gpu : : getMinFilter_GPU ( int , int , const Size & , Point ) { throw_nogpu ( ) ; return Ptr < BaseFilter_GPU > ( 0 ) ; }
Ptr < BaseFilter_GPU > cv : : gpu : : getMinFilter_GPU ( int , int , const Size & , Point ) { throw_nogpu ( ) ; return Ptr < BaseFilter_GPU > ( 0 ) ; }
@ -71,10 +71,10 @@ void cv::gpu::erode( const GpuMat&, GpuMat&, const Mat&, Point, int) { throw_nog
void cv : : gpu : : dilate ( const GpuMat & , GpuMat & , const Mat & , Point , int ) { throw_nogpu ( ) ; }
void cv : : gpu : : dilate ( const GpuMat & , GpuMat & , const Mat & , Point , int ) { throw_nogpu ( ) ; }
void cv : : gpu : : morphologyEx ( const GpuMat & , GpuMat & , int , const Mat & , Point , int ) { throw_nogpu ( ) ; }
void cv : : gpu : : morphologyEx ( const GpuMat & , GpuMat & , int , const Mat & , Point , int ) { throw_nogpu ( ) ; }
void cv : : gpu : : filter2D ( const GpuMat & , GpuMat & , int , const Mat & , Point ) { throw_nogpu ( ) ; }
void cv : : gpu : : filter2D ( const GpuMat & , GpuMat & , int , const Mat & , Point ) { throw_nogpu ( ) ; }
void cv : : gpu : : sepFilter2D ( const GpuMat & , GpuMat & , int , const Mat & , const Mat & , Point ) { throw_nogpu ( ) ; }
void cv : : gpu : : sepFilter2D ( const GpuMat & , GpuMat & , int , const Mat & , const Mat & , Point , int , int ) { throw_nogpu ( ) ; }
void cv : : gpu : : Sobel ( const GpuMat & , GpuMat & , int , int , int , int , double ) { throw_nogpu ( ) ; }
void cv : : gpu : : Sobel ( const GpuMat & , GpuMat & , int , int , int , int , double , int , int ) { throw_nogpu ( ) ; }
void cv : : gpu : : Scharr ( const GpuMat & , GpuMat & , int , int , int , double ) { throw_nogpu ( ) ; }
void cv : : gpu : : Scharr ( const GpuMat & , GpuMat & , int , int , int , double , int , int ) { throw_nogpu ( ) ; }
void cv : : gpu : : GaussianBlur ( const GpuMat & , GpuMat & , Size , double , double ) { throw_nogpu ( ) ; }
void cv : : gpu : : GaussianBlur ( const GpuMat & , GpuMat & , Size , double , double , int , int ) { throw_nogpu ( ) ; }
void cv : : gpu : : Laplacian ( const GpuMat & , GpuMat & , int , int , double ) { throw_nogpu ( ) ; }
void cv : : gpu : : Laplacian ( const GpuMat & , GpuMat & , int , int , double ) { throw_nogpu ( ) ; }
# else
# else
@ -133,13 +133,17 @@ namespace
class Filter2DEngine_GPU : public FilterEngine_GPU
class Filter2DEngine_GPU : public FilterEngine_GPU
{
{
public :
public :
Filter2DEngine_GPU ( const Ptr < BaseFilter_GPU > & filter2D_ ) : filter2D ( filter2D_ ) { }
Filter2DEngine_GPU ( const Ptr < BaseFilter_GPU > & filter2D_ , int srcType_ , int dstType_ ) :
filter2D ( filter2D_ ) , srcType ( srcType_ ) , dstType ( dstType_ )
{ }
virtual void apply ( const GpuMat & src , GpuMat & dst , Rect roi = Rect ( 0 , 0 , - 1 , - 1 ) )
virtual void apply ( const GpuMat & src , GpuMat & dst , Rect roi = Rect ( 0 , 0 , - 1 , - 1 ) )
{
{
CV_Assert ( src . type ( ) = = srcType ) ;
Size src_size = src . size ( ) ;
Size src_size = src . size ( ) ;
dst . create ( src_size , src . type ( ) ) ;
dst . create ( src_size , dstType ) ;
dst = Scalar ( 0.0 ) ;
dst = Scalar ( 0.0 ) ;
normalizeROI ( roi , filter2D - > ksize , filter2D - > anchor , src_size ) ;
normalizeROI ( roi , filter2D - > ksize , filter2D - > anchor , src_size ) ;
@ -151,12 +155,13 @@ namespace
}
}
Ptr < BaseFilter_GPU > filter2D ;
Ptr < BaseFilter_GPU > filter2D ;
int srcType , dstType ;
} ;
} ;
}
}
Ptr < FilterEngine_GPU > cv : : gpu : : createFilter2D_GPU ( const Ptr < BaseFilter_GPU > filter2D )
Ptr < FilterEngine_GPU > cv : : gpu : : createFilter2D_GPU ( const Ptr < BaseFilter_GPU > filter2D , int srcType , int dstType )
{
{
return Ptr < FilterEngine_GPU > ( new Filter2DEngine_GPU ( filter2D ) ) ;
return Ptr < FilterEngine_GPU > ( new Filter2DEngine_GPU ( filter2D , srcType , dstType ) ) ;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
@ -168,8 +173,9 @@ namespace
{
{
public :
public :
SeparableFilterEngine_GPU ( const Ptr < BaseRowFilter_GPU > & rowFilter_ ,
SeparableFilterEngine_GPU ( const Ptr < BaseRowFilter_GPU > & rowFilter_ ,
const Ptr < BaseColumnFilter_GPU > & columnFilter_ ) :
const Ptr < BaseColumnFilter_GPU > & columnFilter_ , int srcType_ , int bufType_ , int dstType_ ) :
rowFilter ( rowFilter_ ) , columnFilter ( columnFilter_ )
rowFilter ( rowFilter_ ) , columnFilter ( columnFilter_ ) ,
srcType ( srcType_ ) , bufType ( bufType_ ) , dstType ( dstType_ )
{
{
ksize = Size ( rowFilter - > ksize , columnFilter - > ksize ) ;
ksize = Size ( rowFilter - > ksize , columnFilter - > ksize ) ;
anchor = Point ( rowFilter - > anchor , columnFilter - > anchor ) ;
anchor = Point ( rowFilter - > anchor , columnFilter - > anchor ) ;
@ -177,19 +183,20 @@ namespace
virtual void apply ( const GpuMat & src , GpuMat & dst , Rect roi = Rect ( 0 , 0 , - 1 , - 1 ) )
virtual void apply ( const GpuMat & src , GpuMat & dst , Rect roi = Rect ( 0 , 0 , - 1 , - 1 ) )
{
{
CV_Assert ( src . type ( ) = = srcType ) ;
Size src_size = src . size ( ) ;
Size src_size = src . size ( ) ;
int src_type = src . type ( ) ;
dst . create ( src_size , src_ type ) ;
dst . create ( src_size , d stT ype) ;
dst = Scalar ( 0.0 ) ;
dst = Scalar ( 0.0 ) ;
dstBuf . create ( src_size , src_t ype) ;
dstBuf . create ( src_size , bufT ype) ;
dstBuf = Scalar ( 0.0 ) ;
dstBuf = Scalar ( 0.0 ) ;
normalizeROI ( roi , ksize , anchor , src_size ) ;
normalizeROI ( roi , ksize , anchor , src_size ) ;
srcROI = src ( roi ) ;
GpuMat srcROI = src ( roi ) ;
dstROI = dst ( roi ) ;
GpuMat dstROI = dst ( roi ) ;
dstBufROI = dstBuf ( roi ) ;
GpuMat dstBufROI = dstBuf ( roi ) ;
( * rowFilter ) ( srcROI , dstBufROI ) ;
( * rowFilter ) ( srcROI , dstBufROI ) ;
( * columnFilter ) ( dstBufROI , dstROI ) ;
( * columnFilter ) ( dstBufROI , dstROI ) ;
@ -197,19 +204,19 @@ namespace
Ptr < BaseRowFilter_GPU > rowFilter ;
Ptr < BaseRowFilter_GPU > rowFilter ;
Ptr < BaseColumnFilter_GPU > columnFilter ;
Ptr < BaseColumnFilter_GPU > columnFilter ;
int srcType , bufType , dstType ;
Size ksize ;
Size ksize ;
Point anchor ;
Point anchor ;
GpuMat dstBuf ;
GpuMat dstBuf ;
GpuMat srcROI ;
GpuMat dstROI ;
GpuMat dstBufROI ;
} ;
} ;
}
}
Ptr < FilterEngine_GPU > cv : : gpu : : createSeparableFilter_GPU ( const Ptr < BaseRowFilter_GPU > & rowFilter ,
Ptr < FilterEngine_GPU > cv : : gpu : : createSeparableFilter_GPU ( const Ptr < BaseRowFilter_GPU > & rowFilter ,
const Ptr < BaseColumnFilter_GPU > & columnFilter )
const Ptr < BaseColumnFilter_GPU > & columnFilter , int srcType , int bufType , int dstType )
{
{
return Ptr < FilterEngine_GPU > ( new SeparableFilterEngine_GPU ( rowFilter , columnFilter ) ) ;
return Ptr < FilterEngine_GPU > ( new SeparableFilterEngine_GPU ( rowFilter , columnFilter , srcType , bufType , dstType ) ) ;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
@ -315,7 +322,7 @@ Ptr<BaseFilter_GPU> cv::gpu::getBoxFilter_GPU(int srcType, int dstType, const Si
Ptr < FilterEngine_GPU > cv : : gpu : : createBoxFilter_GPU ( int srcType , int dstType , const Size & ksize , const Point & anchor )
Ptr < FilterEngine_GPU > cv : : gpu : : createBoxFilter_GPU ( int srcType , int dstType , const Size & ksize , const Point & anchor )
{
{
Ptr < BaseFilter_GPU > boxFilter = getBoxFilter_GPU ( srcType , dstType , ksize , anchor ) ;
Ptr < BaseFilter_GPU > boxFilter = getBoxFilter_GPU ( srcType , dstType , ksize , anchor ) ;
return createFilter2D_GPU ( boxFilter ) ;
return createFilter2D_GPU ( boxFilter , srcType , dstType ) ;
}
}
void cv : : gpu : : boxFilter ( const GpuMat & src , GpuMat & dst , int ddepth , Size ksize , Point anchor )
void cv : : gpu : : boxFilter ( const GpuMat & src , GpuMat & dst , int ddepth , Size ksize , Point anchor )
@ -386,8 +393,8 @@ namespace
class MorphologyFilterEngine_GPU : public Filter2DEngine_GPU
class MorphologyFilterEngine_GPU : public Filter2DEngine_GPU
{
{
public :
public :
MorphologyFilterEngine_GPU ( const Ptr < BaseFilter_GPU > & filter2D_ , int iters_ ) :
MorphologyFilterEngine_GPU ( const Ptr < BaseFilter_GPU > & filter2D_ , int type , int iters_ ) :
Filter2DEngine_GPU ( filter2D_ ) , iters ( iters_ ) { }
Filter2DEngine_GPU ( filter2D_ , type , type ) , iters ( iters_ ) { }
virtual void apply ( const GpuMat & src , GpuMat & dst , Rect roi = Rect ( 0 , 0 , - 1 , - 1 ) )
virtual void apply ( const GpuMat & src , GpuMat & dst , Rect roi = Rect ( 0 , 0 , - 1 , - 1 ) )
{
{
@ -415,7 +422,7 @@ Ptr<FilterEngine_GPU> cv::gpu::createMorphologyFilter_GPU(int op, int type, cons
Ptr < BaseFilter_GPU > filter2D = getMorphologyFilter_GPU ( op , type , kernel , ksize , anchor ) ;
Ptr < BaseFilter_GPU > filter2D = getMorphologyFilter_GPU ( op , type , kernel , ksize , anchor ) ;
return Ptr < FilterEngine_GPU > ( new MorphologyFilterEngine_GPU ( filter2D , iterations ) ) ;
return Ptr < FilterEngine_GPU > ( new MorphologyFilterEngine_GPU ( filter2D , type , iterations ) ) ;
}
}
namespace
namespace
@ -558,7 +565,7 @@ Ptr<FilterEngine_GPU> cv::gpu::createLinearFilter_GPU(int srcType, int dstType,
Ptr < BaseFilter_GPU > linearFilter = getLinearFilter_GPU ( srcType , dstType , kernel , ksize , anchor ) ;
Ptr < BaseFilter_GPU > linearFilter = getLinearFilter_GPU ( srcType , dstType , kernel , ksize , anchor ) ;
return createFilter2D_GPU ( linearFilter ) ;
return createFilter2D_GPU ( linearFilter , srcType , dstType ) ;
}
}
void cv : : gpu : : filter2D ( const GpuMat & src , GpuMat & dst , int ddepth , const Mat & kernel , Point anchor )
void cv : : gpu : : filter2D ( const GpuMat & src , GpuMat & dst , int ddepth , const Mat & kernel , Point anchor )
@ -578,10 +585,10 @@ void cv::gpu::filter2D(const GpuMat& src, GpuMat& dst, int ddepth, const Mat& ke
namespace cv { namespace gpu { namespace filters
namespace cv { namespace gpu { namespace filters
{
{
template < typename T , typename D >
template < typename T , typename D >
void linearRowFilter_gpu ( const DevMem2D & src , const DevMem2D & dst , const float kernel [ ] , int ksize , int anchor ) ;
void linearRowFilter_gpu ( const DevMem2D & src , const DevMem2D & dst , const float kernel [ ] , int ksize , int anchor , int brd_type ) ;
template < typename T , typename D >
template < typename T , typename D >
void linearColumnFilter_gpu ( const DevMem2D & src , const DevMem2D & dst , const float kernel [ ] , int ksize , int anchor ) ;
void linearColumnFilter_gpu ( const DevMem2D & src , const DevMem2D & dst , const float kernel [ ] , int ksize , int anchor , int brd_type ) ;
} } }
} } }
namespace
namespace
@ -589,7 +596,7 @@ namespace
typedef NppStatus ( * nppFilter1D_t ) ( const Npp8u * pSrc , Npp32s nSrcStep , Npp8u * pDst , Npp32s nDstStep , NppiSize oROI ,
typedef NppStatus ( * nppFilter1D_t ) ( const Npp8u * pSrc , Npp32s nSrcStep , Npp8u * pDst , Npp32s nDstStep , NppiSize oROI ,
const Npp32s * pKernel , Npp32s nMaskSize , Npp32s nAnchor , Npp32s nDivisor ) ;
const Npp32s * pKernel , Npp32s nMaskSize , Npp32s nAnchor , Npp32s nDivisor ) ;
typedef void ( * gpuFilter1D_t ) ( const DevMem2D & src , const DevMem2D & dst , const float kernel [ ] , int ksize , int anchor ) ;
typedef void ( * gpuFilter1D_t ) ( const DevMem2D & src , const DevMem2D & dst , const float kernel [ ] , int ksize , int anchor , int brd_type ) ;
class NppLinearRowFilter : public BaseRowFilter_GPU
class NppLinearRowFilter : public BaseRowFilter_GPU
{
{
@ -614,35 +621,28 @@ namespace
class GpuLinearRowFilter : public BaseRowFilter_GPU
class GpuLinearRowFilter : public BaseRowFilter_GPU
{
{
public :
public :
GpuLinearRowFilter ( int ksize_ , int anchor_ , const Mat & kernel_ , gpuFilter1D_t func_ ) :
GpuLinearRowFilter ( int ksize_ , int anchor_ , const Mat & kernel_ , gpuFilter1D_t func_ , int brd_type_ ) :
BaseRowFilter_GPU ( ksize_ , anchor_ ) , kernel ( kernel_ ) , func ( func_ ) { }
BaseRowFilter_GPU ( ksize_ , anchor_ ) , kernel ( kernel_ ) , func ( func_ ) , brd_type ( brd_type_ ) { }
virtual void operator ( ) ( const GpuMat & src , GpuMat & dst )
virtual void operator ( ) ( const GpuMat & src , GpuMat & dst )
{
{
func ( src , dst , kernel . ptr < float > ( ) , ksize , anchor ) ;
func ( src , dst , kernel . ptr < float > ( ) , ksize , anchor , brd_type ) ;
}
}
Mat kernel ;
Mat kernel ;
gpuFilter1D_t func ;
gpuFilter1D_t func ;
int brd_type ;
} ;
} ;
}
}
Ptr < BaseRowFilter_GPU > cv : : gpu : : getLinearRowFilter_GPU ( int srcType , int bufType , const Mat & rowKernel , int anchor )
Ptr < BaseRowFilter_GPU > cv : : gpu : : getLinearRowFilter_GPU ( int srcType , int bufType , const Mat & rowKernel , int anchor , int borderType )
{
{
using namespace cv : : gpu : : filters ;
static const nppFilter1D_t nppFilter1D_callers [ ] = { 0 , nppiFilterRow_8u_C1R , 0 , 0 , nppiFilterRow_8u_C4R } ;
static const nppFilter1D_t nppFilter1D_callers [ ] = { 0 , nppiFilterRow_8u_C1R , 0 , 0 , nppiFilterRow_8u_C4R } ;
static const gpuFilter1D_t gpuFilter1D_callers [ 6 ] [ 6 ] =
{
{ linearRowFilter_gpu < uchar4 , uchar4 > , linearRowFilter_gpu < uchar4 , char4 > , 0 , 0 , 0 , 0 } ,
{ linearRowFilter_gpu < char4 , uchar4 > , linearRowFilter_gpu < char4 , char4 > , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , linearRowFilter_gpu < ushort2 , ushort2 > , linearRowFilter_gpu < ushort2 , short2 > , 0 , 0 } ,
{ 0 , 0 , linearRowFilter_gpu < short2 , ushort2 > , linearRowFilter_gpu < short2 , short2 > , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , linearRowFilter_gpu < int , int > , linearRowFilter_gpu < int , float > } ,
{ 0 , 0 , 0 , 0 , linearRowFilter_gpu < float , int > , linearRowFilter_gpu < float , float > }
} ;
if ( ( bufType = = srcType ) & & ( srcType = = CV_8UC1 | | srcType = = CV_8UC4 ) )
if ( ( bufType = = srcType ) & & ( srcType = = CV_8UC1 | | srcType = = CV_8UC4 ) )
{
{
CV_Assert ( borderType = = BORDER_CONSTANT ) ;
GpuMat gpu_row_krnl ;
GpuMat gpu_row_krnl ;
int nDivisor ;
int nDivisor ;
normalizeKernel ( rowKernel , gpu_row_krnl , CV_32S , & nDivisor , true ) ;
normalizeKernel ( rowKernel , gpu_row_krnl , CV_32S , & nDivisor , true ) ;
@ -654,8 +654,14 @@ Ptr<BaseRowFilter_GPU> cv::gpu::getLinearRowFilter_GPU(int srcType, int bufType,
nppFilter1D_callers [ CV_MAT_CN ( srcType ) ] ) ) ;
nppFilter1D_callers [ CV_MAT_CN ( srcType ) ] ) ) ;
}
}
CV_Assert ( srcType = = CV_8UC4 | | srcType = = CV_8SC4 | | srcType = = CV_16UC2 | | srcType = = CV_16SC2 | | srcType = = CV_32SC1 | | srcType = = CV_32FC1 ) ;
CV_Assert ( borderType = = BORDER_REFLECT101 | | borderType = = BORDER_REPLICATE | | borderType = = BORDER_CONSTANT ) ;
CV_Assert ( bufType = = CV_8UC4 | | bufType = = CV_8SC4 | | bufType = = CV_16UC2 | | bufType = = CV_16SC2 | | bufType = = CV_32SC1 | | bufType = = CV_32FC1 ) ;
int gpuBorderType ;
CV_Assert ( tryConvertToGpuBorderType ( borderType , gpuBorderType ) ) ;
CV_Assert ( srcType = = CV_8UC1 | | srcType = = CV_8UC4 | | srcType = = CV_16SC1 | | srcType = = CV_16SC2
| | srcType = = CV_32SC1 | | srcType = = CV_32FC1 ) ;
CV_Assert ( CV_MAT_DEPTH ( bufType ) = = CV_32F & & CV_MAT_CN ( srcType ) = = CV_MAT_CN ( bufType ) ) ;
Mat temp ( rowKernel . size ( ) , CV_32FC1 ) ;
Mat temp ( rowKernel . size ( ) , CV_32FC1 ) ;
rowKernel . convertTo ( temp , CV_32FC1 ) ;
rowKernel . convertTo ( temp , CV_32FC1 ) ;
@ -663,12 +669,35 @@ Ptr<BaseRowFilter_GPU> cv::gpu::getLinearRowFilter_GPU(int srcType, int bufType,
int ksize = cont_krnl . cols ;
int ksize = cont_krnl . cols ;
CV_Assert ( ksize < 16 ) ;
CV_Assert ( ksize > 0 & & ksize < = 16 ) ;
normalizeAnchor ( anchor , ksize ) ;
normalizeAnchor ( anchor , ksize ) ;
return Ptr < BaseRowFilter_GPU > ( new GpuLinearRowFilter ( ksize , anchor , cont_krnl ,
gpuFilter1D_t func = 0 ;
gpuFilter1D_callers [ CV_MAT_DEPTH ( srcType ) ] [ CV_MAT_DEPTH ( bufType ) ] ) ) ;
switch ( srcType )
{
case CV_8UC1 :
func = filters : : linearRowFilter_gpu < uchar , float > ;
break ;
case CV_8UC4 :
func = filters : : linearRowFilter_gpu < uchar4 , float4 > ;
break ;
case CV_16SC1 :
func = filters : : linearRowFilter_gpu < short , float > ;
break ;
case CV_16SC2 :
func = filters : : linearRowFilter_gpu < short2 , float2 > ;
break ;
case CV_32SC1 :
func = filters : : linearRowFilter_gpu < int , float > ;
break ;
case CV_32FC1 :
func = filters : : linearRowFilter_gpu < float , float > ;
break ;
}
return Ptr < BaseRowFilter_GPU > ( new GpuLinearRowFilter ( ksize , anchor , cont_krnl , func , gpuBorderType ) ) ;
}
}
namespace
namespace
@ -696,35 +725,28 @@ namespace
class GpuLinearColumnFilter : public BaseColumnFilter_GPU
class GpuLinearColumnFilter : public BaseColumnFilter_GPU
{
{
public :
public :
GpuLinearColumnFilter ( int ksize_ , int anchor_ , const Mat & kernel_ , gpuFilter1D_t func_ ) :
GpuLinearColumnFilter ( int ksize_ , int anchor_ , const Mat & kernel_ , gpuFilter1D_t func_ , int brd_type_ ) :
BaseColumnFilter_GPU ( ksize_ , anchor_ ) , kernel ( kernel_ ) , func ( func_ ) { }
BaseColumnFilter_GPU ( ksize_ , anchor_ ) , kernel ( kernel_ ) , func ( func_ ) , brd_type ( brd_type_ ) { }
virtual void operator ( ) ( const GpuMat & src , GpuMat & dst )
virtual void operator ( ) ( const GpuMat & src , GpuMat & dst )
{
{
func ( src , dst , kernel . ptr < float > ( ) , ksize , anchor ) ;
func ( src , dst , kernel . ptr < float > ( ) , ksize , anchor , brd_type ) ;
}
}
Mat kernel ;
Mat kernel ;
gpuFilter1D_t func ;
gpuFilter1D_t func ;
int brd_type ;
} ;
} ;
}
}
Ptr < BaseColumnFilter_GPU > cv : : gpu : : getLinearColumnFilter_GPU ( int bufType , int dstType , const Mat & columnKernel , int anchor )
Ptr < BaseColumnFilter_GPU > cv : : gpu : : getLinearColumnFilter_GPU ( int bufType , int dstType , const Mat & columnKernel , int anchor , int borderType )
{
{
using namespace cv : : gpu : : filters ;
static const nppFilter1D_t nppFilter1D_callers [ ] = { 0 , nppiFilterColumn_8u_C1R , 0 , 0 , nppiFilterColumn_8u_C4R } ;
static const nppFilter1D_t nppFilter1D_callers [ ] = { 0 , nppiFilterColumn_8u_C1R , 0 , 0 , nppiFilterColumn_8u_C4R } ;
static const gpuFilter1D_t gpuFilter1D_callers [ 6 ] [ 6 ] =
{
{ linearColumnFilter_gpu < uchar4 , uchar4 > , linearColumnFilter_gpu < uchar4 , char4 > , 0 , 0 , 0 , 0 } ,
{ linearColumnFilter_gpu < char4 , uchar4 > , linearColumnFilter_gpu < char4 , char4 > , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , linearColumnFilter_gpu < ushort2 , ushort2 > , linearColumnFilter_gpu < ushort2 , short2 > , 0 , 0 } ,
{ 0 , 0 , linearColumnFilter_gpu < short2 , ushort2 > , linearColumnFilter_gpu < short2 , short2 > , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , linearColumnFilter_gpu < int , int > , linearColumnFilter_gpu < int , float > } ,
{ 0 , 0 , 0 , 0 , linearColumnFilter_gpu < float , int > , linearColumnFilter_gpu < float , float > }
} ;
if ( ( bufType = = dstType ) & & ( bufType = = CV_8UC1 | | bufType = = CV_8UC4 ) )
if ( ( bufType = = dstType ) & & ( bufType = = CV_8UC1 | | bufType = = CV_8UC4 ) )
{
{
CV_Assert ( borderType = = BORDER_CONSTANT ) ;
GpuMat gpu_col_krnl ;
GpuMat gpu_col_krnl ;
int nDivisor ;
int nDivisor ;
normalizeKernel ( columnKernel , gpu_col_krnl , CV_32S , & nDivisor , true ) ;
normalizeKernel ( columnKernel , gpu_col_krnl , CV_32S , & nDivisor , true ) ;
@ -736,8 +758,14 @@ Ptr<BaseColumnFilter_GPU> cv::gpu::getLinearColumnFilter_GPU(int bufType, int ds
nppFilter1D_callers [ CV_MAT_CN ( bufType ) ] ) ) ;
nppFilter1D_callers [ CV_MAT_CN ( bufType ) ] ) ) ;
}
}
CV_Assert ( dstType = = CV_8UC4 | | dstType = = CV_8SC4 | | dstType = = CV_16UC2 | | dstType = = CV_16SC2 | | dstType = = CV_32SC1 | | dstType = = CV_32FC1 ) ;
CV_Assert ( borderType = = BORDER_REFLECT101 | | borderType = = BORDER_REPLICATE | | borderType = = BORDER_CONSTANT ) ;
CV_Assert ( bufType = = CV_8UC4 | | bufType = = CV_8SC4 | | bufType = = CV_16UC2 | | bufType = = CV_16SC2 | | bufType = = CV_32SC1 | | bufType = = CV_32FC1 ) ;
int gpuBorderType ;
CV_Assert ( tryConvertToGpuBorderType ( borderType , gpuBorderType ) ) ;
CV_Assert ( dstType = = CV_8UC1 | | dstType = = CV_8UC4 | | dstType = = CV_16SC1 | | dstType = = CV_16SC2
| | dstType = = CV_32SC1 | | dstType = = CV_32FC1 ) ;
CV_Assert ( CV_MAT_DEPTH ( bufType ) = = CV_32F & & CV_MAT_CN ( dstType ) = = CV_MAT_CN ( bufType ) ) ;
Mat temp ( columnKernel . size ( ) , CV_32FC1 ) ;
Mat temp ( columnKernel . size ( ) , CV_32FC1 ) ;
columnKernel . convertTo ( temp , CV_32FC1 ) ;
columnKernel . convertTo ( temp , CV_32FC1 ) ;
@ -745,50 +773,76 @@ Ptr<BaseColumnFilter_GPU> cv::gpu::getLinearColumnFilter_GPU(int bufType, int ds
int ksize = cont_krnl . cols ;
int ksize = cont_krnl . cols ;
CV_Assert ( ksize < 16 ) ;
CV_Assert ( ksize > 0 & & ksize < = 16 ) ;
normalizeAnchor ( anchor , ksize ) ;
normalizeAnchor ( anchor , ksize ) ;
return Ptr < BaseColumnFilter_GPU > ( new GpuLinearColumnFilter ( ksize , anchor , cont_krnl ,
gpuFilter1D_t func = 0 ;
gpuFilter1D_callers [ CV_MAT_DEPTH ( bufType ) ] [ CV_MAT_DEPTH ( dstType ) ] ) ) ;
switch ( dstType )
{
case CV_8UC1 :
func = filters : : linearColumnFilter_gpu < float , uchar > ;
break ;
case CV_8UC4 :
func = filters : : linearColumnFilter_gpu < float4 , uchar4 > ;
break ;
case CV_16SC1 :
func = filters : : linearColumnFilter_gpu < float , short > ;
break ;
case CV_16SC2 :
func = filters : : linearColumnFilter_gpu < float2 , short2 > ;
break ;
case CV_32SC1 :
func = filters : : linearColumnFilter_gpu < float , int > ;
break ;
case CV_32FC1 :
func = filters : : linearColumnFilter_gpu < float , float > ;
break ;
}
return Ptr < BaseColumnFilter_GPU > ( new GpuLinearColumnFilter ( ksize , anchor , cont_krnl , func , gpuBorderType ) ) ;
}
}
Ptr < FilterEngine_GPU > cv : : gpu : : createSeparableLinearFilter_GPU ( int srcType , int dstType , const Mat & rowKernel , const Mat & columnKernel ,
Ptr < FilterEngine_GPU > cv : : gpu : : createSeparableLinearFilter_GPU ( int srcType , int dstType , const Mat & rowKernel , const Mat & columnKernel ,
const Point & anchor )
const Point & anchor , int rowBorderType , int columnBorderType )
{
{
if ( columnBorderType < 0 )
columnBorderType = rowBorderType ;
int sdepth = CV_MAT_DEPTH ( srcType ) , ddepth = CV_MAT_DEPTH ( dstType ) ;
int sdepth = CV_MAT_DEPTH ( srcType ) , ddepth = CV_MAT_DEPTH ( dstType ) ;
int cn = CV_MAT_CN ( srcType ) ;
int cn = CV_MAT_CN ( srcType ) ;
int bdepth = std : : max ( sdepth , ddepth ) ;
int bdepth = CV_32F ;
int bufType = CV_MAKETYPE ( bdepth , cn ) ;
int bufType = CV_MAKETYPE ( bdepth , cn ) ;
Ptr < BaseRowFilter_GPU > rowFilter = getLinearRowFilter_GPU ( srcType , bufType , rowKernel , anchor . x ) ;
Ptr < BaseRowFilter_GPU > rowFilter = getLinearRowFilter_GPU ( srcType , bufType , rowKernel , anchor . x , rowBorderType ) ;
Ptr < BaseColumnFilter_GPU > columnFilter = getLinearColumnFilter_GPU ( bufType , dstType , columnKernel , anchor . y ) ;
Ptr < BaseColumnFilter_GPU > columnFilter = getLinearColumnFilter_GPU ( bufType , dstType , columnKernel , anchor . y , columnBorderType ) ;
return createSeparableFilter_GPU ( rowFilter , columnFilter ) ;
return createSeparableFilter_GPU ( rowFilter , columnFilter , srcType , bufType , dstType ) ;
}
}
void cv : : gpu : : sepFilter2D ( const GpuMat & src , GpuMat & dst , int ddepth , const Mat & kernelX , const Mat & kernelY , Point anchor )
void cv : : gpu : : sepFilter2D ( const GpuMat & src , GpuMat & dst , int ddepth , const Mat & kernelX , const Mat & kernelY , Point anchor , int rowBorderType , int columnBorderType )
{
{
if ( ddepth < 0 )
if ( ddepth < 0 )
ddepth = src . depth ( ) ;
ddepth = src . depth ( ) ;
dst . create ( src . size ( ) , CV_MAKETYPE ( ddepth , src . channels ( ) ) ) ;
dst . create ( src . size ( ) , CV_MAKETYPE ( ddepth , src . channels ( ) ) ) ;
Ptr < FilterEngine_GPU > f = createSeparableLinearFilter_GPU ( src . type ( ) , dst . type ( ) , kernelX , kernelY , anchor ) ;
Ptr < FilterEngine_GPU > f = createSeparableLinearFilter_GPU ( src . type ( ) , dst . type ( ) , kernelX , kernelY , anchor , rowBorderType , columnBorderType ) ;
f - > apply ( src , dst ) ;
f - > apply ( src , dst , Rect ( 0 , 0 , src . cols , src . rows ) ) ;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// Deriv Filter
// Deriv Filter
Ptr < FilterEngine_GPU > cv : : gpu : : createDerivFilter_GPU ( int srcType , int dstType , int dx , int dy , int ksize )
Ptr < FilterEngine_GPU > cv : : gpu : : createDerivFilter_GPU ( int srcType , int dstType , int dx , int dy , int ksize , int rowBorderType , int columnBorderType )
{
{
Mat kx , ky ;
Mat kx , ky ;
getDerivKernels ( kx , ky , dx , dy , ksize , false , CV_32F ) ;
getDerivKernels ( kx , ky , dx , dy , ksize , false , CV_32F ) ;
return createSeparableLinearFilter_GPU ( srcType , dstType , kx , ky , Point ( - 1 , - 1 ) ) ;
return createSeparableLinearFilter_GPU ( srcType , dstType , kx , ky , Point ( - 1 , - 1 ) , rowBorderType , columnBorderType ) ;
}
}
void cv : : gpu : : Sobel ( const GpuMat & src , GpuMat & dst , int ddepth , int dx , int dy , int ksize , double scale )
void cv : : gpu : : Sobel ( const GpuMat & src , GpuMat & dst , int ddepth , int dx , int dy , int ksize , double scale , int rowBorderType , int columnBorderType )
{
{
Mat kx , ky ;
Mat kx , ky ;
getDerivKernels ( kx , ky , dx , dy , ksize , false , CV_32F ) ;
getDerivKernels ( kx , ky , dx , dy , ksize , false , CV_32F ) ;
@ -803,10 +857,10 @@ void cv::gpu::Sobel(const GpuMat& src, GpuMat& dst, int ddepth, int dx, int dy,
ky * = scale ;
ky * = scale ;
}
}
sepFilter2D ( src , dst , ddepth , kx , ky , Point ( - 1 , - 1 ) ) ;
sepFilter2D ( src , dst , ddepth , kx , ky , Point ( - 1 , - 1 ) , rowBorderType , columnBorderType ) ;
}
}
void cv : : gpu : : Scharr ( const GpuMat & src , GpuMat & dst , int ddepth , int dx , int dy , double scale )
void cv : : gpu : : Scharr ( const GpuMat & src , GpuMat & dst , int ddepth , int dx , int dy , double scale , int rowBorderType , int columnBorderType )
{
{
Mat kx , ky ;
Mat kx , ky ;
getDerivKernels ( kx , ky , dx , dy , - 1 , false , CV_32F ) ;
getDerivKernels ( kx , ky , dx , dy , - 1 , false , CV_32F ) ;
@ -821,7 +875,7 @@ void cv::gpu::Scharr(const GpuMat& src, GpuMat& dst, int ddepth, int dx, int dy,
ky * = scale ;
ky * = scale ;
}
}
sepFilter2D ( src , dst , ddepth , kx , ky , Point ( - 1 , - 1 ) ) ;
sepFilter2D ( src , dst , ddepth , kx , ky , Point ( - 1 , - 1 ) , rowBorderType , columnBorderType ) ;
}
}
void cv : : gpu : : Laplacian ( const GpuMat & src , GpuMat & dst , int ddepth , int ksize , double scale )
void cv : : gpu : : Laplacian ( const GpuMat & src , GpuMat & dst , int ddepth , int ksize , double scale )
@ -843,7 +897,7 @@ void cv::gpu::Laplacian(const GpuMat& src, GpuMat& dst, int ddepth, int ksize, d
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// Gaussian Filter
// Gaussian Filter
Ptr < FilterEngine_GPU > cv : : gpu : : createGaussianFilter_GPU ( int type , Size ksize , double sigma1 , double sigma2 )
Ptr < FilterEngine_GPU > cv : : gpu : : createGaussianFilter_GPU ( int type , Size ksize , double sigma1 , double sigma2 , int rowBorderType , int columnBorderType )
{
{
int depth = CV_MAT_DEPTH ( type ) ;
int depth = CV_MAT_DEPTH ( type ) ;
@ -868,10 +922,10 @@ Ptr<FilterEngine_GPU> cv::gpu::createGaussianFilter_GPU(int type, Size ksize, do
else
else
ky = getGaussianKernel ( ksize . height , sigma2 , std : : max ( depth , CV_32F ) ) ;
ky = getGaussianKernel ( ksize . height , sigma2 , std : : max ( depth , CV_32F ) ) ;
return createSeparableLinearFilter_GPU ( type , type , kx , ky ) ;
return createSeparableLinearFilter_GPU ( type , type , kx , ky , Point ( - 1 , - 1 ) , rowBorderType , columnBorderType ) ;
}
}
void cv : : gpu : : GaussianBlur ( const GpuMat & src , GpuMat & dst , Size ksize , double sigma1 , double sigma2 )
void cv : : gpu : : GaussianBlur ( const GpuMat & src , GpuMat & dst , Size ksize , double sigma1 , double sigma2 , int rowBorderType , int columnBorderType )
{
{
if ( ksize . width = = 1 & & ksize . height = = 1 )
if ( ksize . width = = 1 & & ksize . height = = 1 )
{
{
@ -881,8 +935,8 @@ void cv::gpu::GaussianBlur(const GpuMat& src, GpuMat& dst, Size ksize, double si
dst . create ( src . size ( ) , src . type ( ) ) ;
dst . create ( src . size ( ) , src . type ( ) ) ;
Ptr < FilterEngine_GPU > f = createGaussianFilter_GPU ( src . type ( ) , ksize , sigma1 , sigma2 ) ;
Ptr < FilterEngine_GPU > f = createGaussianFilter_GPU ( src . type ( ) , ksize , sigma1 , sigma2 , rowBorderType , columnBorderType ) ;
f - > apply ( src , dst ) ;
f - > apply ( src , dst , Rect ( 0 , 0 , src . cols , src . rows ) ) ;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////