added cv::split to T-API

This commit is contained in:
Ilya Lavrenov
2013-12-08 14:45:25 +04:00
parent cd3f7fbf05
commit c16c9a2e8e
5 changed files with 143 additions and 81 deletions

View File

@@ -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;