reverted to original plain C++ code
This commit is contained in:
parent
6d4c4dcd94
commit
ad9272e836
@ -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" );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user