Added ocl_medianFilter using Transparent API

This commit is contained in:
Elena Gvozdeva
2013-12-09 10:34:32 +04:00
parent 172a5d42a9
commit b2d8b491c0
3 changed files with 326 additions and 6 deletions

View File

@@ -1661,19 +1661,61 @@ medianBlur_SortNet( const Mat& _src, Mat& _dst, int m )
}
namespace cv
{
static bool ocl_medianFilter ( InputArray _src, OutputArray _dst, int m)
{
int type = _src.type();
int depth = CV_MAT_DEPTH(type), cn = CV_MAT_CN(type);
if (!((depth == CV_8U || depth == CV_16U || depth == CV_16S || depth == CV_32F) && (cn == 1 || cn == 4)))
return false;
const char * kernelName;
if (m==3)
kernelName = "medianFilter3";
else if (m==5)
kernelName = "medianFilter5";
else
return false;
ocl::Kernel k(kernelName,ocl::imgproc::medianFilter_oclsrc,format("-D type=%s",ocl::typeToStr(type)));
if (k.empty())
return false;
_dst.create(_src.size(),type);
UMat src = _src.getUMat(), dst = _dst.getUMat();
size_t globalsize[2] = {(src.cols + 18) / 16 * 16, (src.rows + 15) / 16 * 16};
size_t localsize[2] = {16, 16};
return k.args(ocl::KernelArg::ReadOnlyNoSize(src), ocl::KernelArg::WriteOnly(dst)).run(2,globalsize,localsize,false);
}
}
void cv::medianBlur( InputArray _src0, OutputArray _dst, int ksize )
{
Mat src0 = _src0.getMat();
_dst.create( src0.size(), src0.type() );
Mat dst = _dst.getMat();
CV_Assert( ksize % 2 == 1 );
if( ksize <= 1 )
{
{
Mat src0 = _src0.getMat();
_dst.create( src0.size(), src0.type() );
Mat dst = _dst.getMat();
src0.copyTo(dst);
return;
}
CV_Assert( ksize % 2 == 1 );
bool use_opencl = ocl::useOpenCL() && _dst.isUMat();
// if ( use_opencl && ocl_medianFilter(_src0,_dst, ksize))
if (use_opencl)
{ CV_Assert (ocl_medianFilter(_src0,_dst,ksize));
return;}
Mat src0 = _src0.getMat();
_dst.create( src0.size(), src0.type() );
Mat dst = _dst.getMat();
#ifdef HAVE_TEGRA_OPTIMIZATION
if (tegra::medianBlur(src0, dst, ksize))