added cv::split to T-API
This commit is contained in:
@@ -264,8 +264,50 @@ void cv::split(const Mat& src, Mat* mv)
|
||||
}
|
||||
}
|
||||
|
||||
namespace cv {
|
||||
|
||||
static bool ocl_split( InputArray _m, OutputArrayOfArrays _mv )
|
||||
{
|
||||
int type = _m.type(), depth = CV_MAT_DEPTH(type), cn = CV_MAT_CN(type);
|
||||
|
||||
String dstargs, dstdecl, processelem;
|
||||
for (int i = 0; i < cn; ++i)
|
||||
{
|
||||
dstargs += format("DECLARE_DST_PARAM(%d)", i);
|
||||
dstdecl += format("DECLARE_DATA(%d)", i);
|
||||
processelem += format("PROCESS_ELEM(%d)", i);
|
||||
}
|
||||
|
||||
ocl::Kernel k("split", ocl::core::split_merge_oclsrc,
|
||||
format("-D T=%s -D OP_SPLIT -D cn=%d -D DECLARE_DST_PARAMS=%s "
|
||||
"-D DECLARE_DATA_N=%s -D PROCESS_ELEMS_N=%s",
|
||||
ocl::memopTypeToStr(depth), cn, dstargs.c_str(),
|
||||
dstdecl.c_str(), processelem.c_str()));
|
||||
if (k.empty())
|
||||
return false;
|
||||
|
||||
Size size = _m.size();
|
||||
std::vector<UMat> & dst = *(std::vector<UMat> *)_mv.getObj();
|
||||
dst.resize(cn);
|
||||
for (int i = 0; i < cn; ++i)
|
||||
dst[i].create(size, depth);
|
||||
|
||||
int argidx = k.set(0, ocl::KernelArg::ReadOnly(_m.getUMat()));
|
||||
for (int i = 0; i < cn; ++i)
|
||||
argidx = k.set(argidx, ocl::KernelArg::WriteOnlyNoSize(dst[i]));
|
||||
|
||||
size_t globalsize[2] = { size.width, size.height };
|
||||
return k.run(2, globalsize, NULL, false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void cv::split(InputArray _m, OutputArrayOfArrays _mv)
|
||||
{
|
||||
if (ocl::useOpenCL() && _m.dims() <= 2 && _mv.isUMatVector() &&
|
||||
ocl_split(_m, _mv))
|
||||
return;
|
||||
|
||||
Mat m = _m.getMat();
|
||||
if( m.empty() )
|
||||
{
|
||||
@@ -362,10 +404,6 @@ static bool ocl_merge( InputArrayOfArrays _mv, OutputArray _dst )
|
||||
|
||||
int type = src[0].type(), depth = CV_MAT_DEPTH(type);
|
||||
Size size = src[0].size();
|
||||
bool doubleSupport = ocl::Device::getDefault().doubleFPConfig() > 0;
|
||||
|
||||
if (doubleSupport && depth == CV_64F)
|
||||
return false;
|
||||
|
||||
size_t srcsize = src.size();
|
||||
for (size_t i = 0; i < srcsize; ++i)
|
||||
@@ -390,7 +428,7 @@ static bool ocl_merge( InputArrayOfArrays _mv, OutputArray _dst )
|
||||
if (k.empty())
|
||||
return false;
|
||||
|
||||
_dst.create(size, CV_MAKE_TYPE(depth, srcsize));
|
||||
_dst.create(size, CV_MAKE_TYPE(depth, (int)srcsize));
|
||||
UMat dst = _dst.getUMat();
|
||||
|
||||
int argidx = 0;
|
||||
|
Reference in New Issue
Block a user