reverted to original plain C++ code

This commit is contained in:
Ilya Lavrenov 2014-06-26 13:13:01 +04:00
parent 6d4c4dcd94
commit ad9272e836

View File

@ -1545,93 +1545,44 @@ void cv::morphologyEx( InputArray _src, OutputArray _dst, int op,
InputArray kernel, Point anchor, int iterations, InputArray kernel, Point anchor, int iterations,
int borderType, const Scalar& borderValue ) int borderType, const Scalar& borderValue )
{ {
int src_type = _src.type(), dst_type = _dst.type(), Mat src = _src.getMat(), temp;
src_cn = CV_MAT_CN(src_type), src_depth = CV_MAT_DEPTH(src_type); _dst.create(src.size(), src.type());
Mat dst = _dst.getMat();
bool use_opencl = cv::ocl::useOpenCL() && _src.isUMat() && _src.size() == _dst.size() && src_type == dst_type &&
_src.dims()<=2 && (src_cn == 1 || src_cn == 4) && (anchor.x == -1) && (anchor.y == -1) &&
(src_depth == CV_8U || src_depth == CV_32F || src_depth == CV_64F ) &&
(borderType == cv::BORDER_CONSTANT) && (borderValue == morphologyDefaultBorderValue());
_dst.create(_src.size(), _src.type());
Mat src, dst, temp;
UMat usrc, udst, utemp;
switch( op ) switch( op )
{ {
case MORPH_ERODE: case MORPH_ERODE:
erode( _src, _dst, kernel, anchor, iterations, borderType, borderValue ); erode( src, dst, kernel, anchor, iterations, borderType, borderValue );
break; break;
case MORPH_DILATE: case MORPH_DILATE:
dilate( _src, _dst, kernel, anchor, iterations, borderType, borderValue ); dilate( src, dst, kernel, anchor, iterations, borderType, borderValue );
break; break;
case MORPH_OPEN: case MORPH_OPEN:
erode( _src, _dst, kernel, anchor, iterations, borderType, borderValue ); erode( src, dst, kernel, anchor, iterations, borderType, borderValue );
dilate( _dst, _dst, kernel, anchor, iterations, borderType, borderValue ); dilate( dst, dst, kernel, anchor, iterations, borderType, borderValue );
break; break;
case CV_MOP_CLOSE: case CV_MOP_CLOSE:
dilate( _src, _dst, kernel, anchor, iterations, borderType, borderValue ); dilate( src, dst, kernel, anchor, iterations, borderType, borderValue );
erode( _dst, _dst, kernel, anchor, iterations, borderType, borderValue ); erode( dst, dst, kernel, anchor, iterations, borderType, borderValue );
break; break;
case CV_MOP_GRADIENT: case CV_MOP_GRADIENT:
erode( _src, use_opencl ? (cv::OutputArray)utemp : (cv::OutputArray)temp, kernel, anchor, iterations, borderType, borderValue ); erode( src, temp, kernel, anchor, iterations, borderType, borderValue );
dilate( _src, _dst, kernel, anchor, iterations, borderType, borderValue ); dilate( src, dst, kernel, anchor, iterations, borderType, borderValue );
if(use_opencl) dst -= temp;
{
udst = _dst.getUMat();
subtract(udst, utemp, udst);
}
else
{
dst = _dst.getMat();
dst -= temp;
}
break; break;
case CV_MOP_TOPHAT: case CV_MOP_TOPHAT:
if(use_opencl) if( src.data != dst.data )
{ temp = dst;
usrc = _src.getUMat(); erode( src, temp, kernel, anchor, iterations, borderType, borderValue );
udst = _dst.getUMat(); dilate( temp, temp, kernel, anchor, iterations, borderType, borderValue );
if( usrc.u != udst.u ) dst = src - temp;
utemp = udst;
}
else
{
src = _src.getMat();
dst = _dst.getMat();
if( src.data != dst.data )
temp = dst;
}
erode( _src, use_opencl ? (cv::OutputArray)utemp : (cv::OutputArray)temp, kernel, anchor, iterations, borderType, borderValue );
dilate( use_opencl ? (cv::OutputArray)utemp : (cv::OutputArray)temp, use_opencl ? (cv::OutputArray)utemp : (cv::OutputArray)temp, kernel,
anchor, iterations, borderType, borderValue );
if(use_opencl)
subtract(usrc, utemp, udst);
else
dst = src - temp;
break; break;
case CV_MOP_BLACKHAT: case CV_MOP_BLACKHAT:
if(use_opencl) if( src.data != dst.data )
{ temp = dst;
usrc = _src.getUMat(); dilate( src, temp, kernel, anchor, iterations, borderType, borderValue );
udst = _dst.getUMat(); erode( temp, temp, kernel, anchor, iterations, borderType, borderValue );
if( usrc.u != udst.u ) dst = temp - src;
utemp = udst;
}
else
{
src = _src.getMat();
dst = _dst.getMat();
if( src.data != dst.data )
temp = dst;
}
dilate( _src, use_opencl ? (cv::OutputArray)utemp : (cv::OutputArray)temp, kernel, anchor, iterations, borderType, borderValue );
erode( use_opencl ? (cv::OutputArray)utemp : (cv::OutputArray)temp, use_opencl ? (cv::OutputArray)utemp : (cv::OutputArray)temp, kernel,
anchor, iterations, borderType, borderValue );
if(use_opencl)
subtract(utemp, usrc, udst);
else
dst = temp - src;
break; break;
default: default:
CV_Error( CV_StsBadArg, "unknown morphological operation" ); CV_Error( CV_StsBadArg, "unknown morphological operation" );