optimized cv::copyMakeBorder
This commit is contained in:
@@ -989,7 +989,8 @@ namespace cv {
|
||||
static bool ocl_copyMakeBorder( InputArray _src, OutputArray _dst, int top, int bottom,
|
||||
int left, int right, int borderType, const Scalar& value )
|
||||
{
|
||||
int type = _src.type(), cn = CV_MAT_CN(type), depth = CV_MAT_DEPTH(type);
|
||||
int type = _src.type(), cn = CV_MAT_CN(type), depth = CV_MAT_DEPTH(type),
|
||||
rowsPerWI = ocl::Device::getDefault().isIntel() ? 4 : 1;
|
||||
bool isolated = (borderType & BORDER_ISOLATED) != 0;
|
||||
borderType &= ~cv::BORDER_ISOLATED;
|
||||
|
||||
@@ -1001,12 +1002,10 @@ static bool ocl_copyMakeBorder( InputArray _src, OutputArray _dst, int top, int
|
||||
const char * const borderMap[] = { "BORDER_CONSTANT", "BORDER_REPLICATE", "BORDER_REFLECT", "BORDER_WRAP", "BORDER_REFLECT_101" };
|
||||
int scalarcn = cn == 3 ? 4 : cn;
|
||||
int sctype = CV_MAKETYPE(depth, scalarcn);
|
||||
String buildOptions = format(
|
||||
"-D T=%s -D %s "
|
||||
"-D T1=%s -D cn=%d -D ST=%s",
|
||||
ocl::memopTypeToStr(type), borderMap[borderType],
|
||||
ocl::memopTypeToStr(depth), cn, ocl::memopTypeToStr(sctype)
|
||||
);
|
||||
String buildOptions = format("-D T=%s -D %s -D T1=%s -D cn=%d -D ST=%s -D rowsPerWI=%d",
|
||||
ocl::memopTypeToStr(type), borderMap[borderType],
|
||||
ocl::memopTypeToStr(depth), cn,
|
||||
ocl::memopTypeToStr(sctype), rowsPerWI);
|
||||
|
||||
ocl::Kernel k("copyMakeBorder", ocl::core::copymakeborder_oclsrc, buildOptions);
|
||||
if (k.empty())
|
||||
@@ -1042,7 +1041,7 @@ static bool ocl_copyMakeBorder( InputArray _src, OutputArray _dst, int top, int
|
||||
k.args(ocl::KernelArg::ReadOnly(src), ocl::KernelArg::WriteOnly(dst),
|
||||
top, left, ocl::KernelArg::Constant(Mat(1, 1, sctype, value)));
|
||||
|
||||
size_t globalsize[2] = { dst.cols, dst.rows };
|
||||
size_t globalsize[2] = { dst.cols, (dst.rows + rowsPerWI - 1) / rowsPerWI };
|
||||
return k.run(2, globalsize, NULL, false);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user