InputArray kernel, Point anchor, int iterations,
int borderType, const Scalar& borderValue )
{
- int src_type = _src.type(), dst_type = _dst.type(),
- src_cn = CV_MAT_CN(src_type), src_depth = CV_MAT_DEPTH(src_type);
-
- 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;
+ Mat src = _src.getMat(), temp;
+ _dst.create(src.size(), src.type());
+ Mat dst = _dst.getMat();
switch( op )
{
case MORPH_ERODE:
- erode( _src, _dst, kernel, anchor, iterations, borderType, borderValue );
+ erode( src, dst, kernel, anchor, iterations, borderType, borderValue );
break;
case MORPH_DILATE:
- dilate( _src, _dst, kernel, anchor, iterations, borderType, borderValue );
+ dilate( src, dst, kernel, anchor, iterations, borderType, borderValue );
break;
case MORPH_OPEN:
- erode( _src, _dst, kernel, anchor, iterations, borderType, borderValue );
- dilate( _dst, _dst, kernel, anchor, iterations, borderType, borderValue );
+ erode( src, dst, kernel, anchor, iterations, borderType, borderValue );
+ dilate( dst, dst, kernel, anchor, iterations, borderType, borderValue );
break;
case CV_MOP_CLOSE:
- dilate( _src, _dst, kernel, anchor, iterations, borderType, borderValue );
- erode( _dst, _dst, kernel, anchor, iterations, borderType, borderValue );
+ dilate( src, dst, kernel, anchor, iterations, borderType, borderValue );
+ erode( dst, dst, kernel, anchor, iterations, borderType, borderValue );
break;
case CV_MOP_GRADIENT:
- erode( _src, use_opencl ? (cv::OutputArray)utemp : (cv::OutputArray)temp, kernel, anchor, iterations, borderType, borderValue );
- dilate( _src, _dst, kernel, anchor, iterations, borderType, borderValue );
- if(use_opencl)
- {
- udst = _dst.getUMat();
- subtract(udst, utemp, udst);
- }
- else
- {
- dst = _dst.getMat();
- dst -= temp;
- }
+ erode( src, temp, kernel, anchor, iterations, borderType, borderValue );
+ dilate( src, dst, kernel, anchor, iterations, borderType, borderValue );
+ dst -= temp;
break;
case CV_MOP_TOPHAT:
- if(use_opencl)
- {
- usrc = _src.getUMat();
- udst = _dst.getUMat();
- if( usrc.u != udst.u )
- 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;
+ if( src.data != dst.data )
+ temp = dst;
+ erode( src, temp, kernel, anchor, iterations, borderType, borderValue );
+ dilate( temp, temp, kernel, anchor, iterations, borderType, borderValue );
+ dst = src - temp;
break;
case CV_MOP_BLACKHAT:
- if(use_opencl)
- {
- usrc = _src.getUMat();
- udst = _dst.getUMat();
- if( usrc.u != udst.u )
- 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;
+ if( src.data != dst.data )
+ temp = dst;
+ dilate( src, temp, kernel, anchor, iterations, borderType, borderValue );
+ erode( temp, temp, kernel, anchor, iterations, borderType, borderValue );
+ dst = temp - src;
break;
default:
CV_Error( CV_StsBadArg, "unknown morphological operation" );