Merge pull request #2624 from ElenaGvozdeva:ipp_DistanceTransform
This commit is contained in:
@@ -488,7 +488,6 @@ struct DTColumnInvoker : ParallelLoopBody
|
||||
const float* sqr_tab;
|
||||
};
|
||||
|
||||
|
||||
struct DTRowInvoker : ParallelLoopBody
|
||||
{
|
||||
DTRowInvoker( Mat* _dst, const float* _sqr_tab, const float* _inv_tab )
|
||||
@@ -669,7 +668,8 @@ distanceATS_L1_8u( const Mat& src, Mat& dst )
|
||||
{
|
||||
int b = dbase[x+dststep];
|
||||
a = lut[MIN(a, b)];
|
||||
dbase[x] = (uchar)(MIN(a, dbase[x]));
|
||||
a = MIN(a, dbase[x]);
|
||||
dbase[x] = (uchar)(a);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -677,23 +677,40 @@ distanceATS_L1_8u( const Mat& src, Mat& dst )
|
||||
|
||||
}
|
||||
|
||||
namespace cv
|
||||
{
|
||||
static void distanceTransform_L1_8U(InputArray _src, OutputArray _dst)
|
||||
{
|
||||
Mat src = _src.getMat();
|
||||
|
||||
CV_Assert( src.type() == CV_8UC1);
|
||||
|
||||
_dst.create( src.size(), CV_8UC1);
|
||||
Mat dst = _dst.getMat();
|
||||
|
||||
#if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7) && !defined HAVE_IPP_ICV_ONLY
|
||||
IppiSize roi = { src.cols, src.rows };
|
||||
Ipp32s pMetrics[2] = { 1, 2 }; //L1, 3x3 mask
|
||||
if (ippiDistanceTransform_3x3_8u_C1R(src.ptr<uchar>(), (int)src.step, dst.ptr<uchar>(), (int)dst.step, roi, pMetrics)>=0)
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
#endif
|
||||
|
||||
distanceATS_L1_8u(src, dst);
|
||||
}
|
||||
}
|
||||
|
||||
// Wrapper function for distance transform group
|
||||
void cv::distanceTransform( InputArray _src, OutputArray _dst, OutputArray _labels,
|
||||
int distType, int maskSize, int labelType )
|
||||
{
|
||||
Mat src = _src.getMat(), dst = _dst.getMat(), labels;
|
||||
Mat src = _src.getMat(), labels;
|
||||
bool need_labels = _labels.needed();
|
||||
|
||||
CV_Assert( src.type() == CV_8U );
|
||||
if( dst.size == src.size && dst.type() == CV_8U && !need_labels && distType == CV_DIST_L1 )
|
||||
{
|
||||
distanceATS_L1_8u(src, dst);
|
||||
return;
|
||||
}
|
||||
CV_Assert( src.type() == CV_8UC1);
|
||||
|
||||
_dst.create( src.size(), CV_32F );
|
||||
dst = _dst.getMat();
|
||||
_dst.create( src.size(), CV_32F);
|
||||
Mat dst = _dst.getMat();
|
||||
|
||||
if( need_labels )
|
||||
{
|
||||
@@ -704,7 +721,6 @@ void cv::distanceTransform( InputArray _src, OutputArray _dst, OutputArray _labe
|
||||
maskSize = CV_DIST_MASK_5;
|
||||
}
|
||||
|
||||
CV_Assert( src.type() == CV_8UC1 );
|
||||
float _mask[5] = {0};
|
||||
|
||||
if( maskSize != CV_DIST_MASK_3 && maskSize != CV_DIST_MASK_5 && maskSize != CV_DIST_MASK_PRECISE )
|
||||
@@ -717,6 +733,28 @@ void cv::distanceTransform( InputArray _src, OutputArray _dst, OutputArray _labe
|
||||
|
||||
if( maskSize == CV_DIST_MASK_PRECISE )
|
||||
{
|
||||
|
||||
#if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7)
|
||||
if ((currentParallelFramework()==NULL) || (src.total()<(int)(1<<14)))
|
||||
{
|
||||
IppStatus status;
|
||||
IppiSize roi = { src.cols, src.rows };
|
||||
Ipp8u *pBuffer;
|
||||
int bufSize=0;
|
||||
|
||||
status = ippiTrueDistanceTransformGetBufferSize_8u32f_C1R(roi, &bufSize);
|
||||
if (status>=0)
|
||||
{
|
||||
pBuffer = ippsMalloc_8u( bufSize );
|
||||
status = ippiTrueDistanceTransform_8u32f_C1R(src.ptr<uchar>(),(int)src.step, dst.ptr<float>(), (int)dst.step, roi, pBuffer);
|
||||
ippsFree( pBuffer );
|
||||
if (status>=0)
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
trueDistTrans( src, dst );
|
||||
return;
|
||||
}
|
||||
@@ -734,9 +772,27 @@ void cv::distanceTransform( InputArray _src, OutputArray _dst, OutputArray _labe
|
||||
if( !need_labels )
|
||||
{
|
||||
if( maskSize == CV_DIST_MASK_3 )
|
||||
{
|
||||
#if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7) && !defined HAVE_IPP_ICV_ONLY
|
||||
IppiSize roi = { src.cols, src.rows };
|
||||
if (ippiDistanceTransform_3x3_8u32f_C1R(src.ptr<uchar>(), (int)src.step, dst.ptr<float>(), (int)dst.step, roi, _mask)>=0)
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
#endif
|
||||
|
||||
distanceTransform_3x3(src, temp, dst, _mask);
|
||||
}
|
||||
else
|
||||
{
|
||||
#if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7)
|
||||
IppiSize roi = { src.cols, src.rows };
|
||||
if (ippiDistanceTransform_5x5_8u32f_C1R(src.ptr<uchar>(), (int)src.step, dst.ptr<float>(), (int)dst.step, roi, _mask)>=0)
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
#endif
|
||||
|
||||
distanceTransform_5x5(src, temp, dst, _mask);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -744,17 +800,6 @@ void cv::distanceTransform( InputArray _src, OutputArray _dst, OutputArray _labe
|
||||
|
||||
if( labelType == CV_DIST_LABEL_CCOMP )
|
||||
{
|
||||
#if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7)
|
||||
if( maskSize == CV_DIST_MASK_5 )
|
||||
{
|
||||
IppiSize roi = { src.cols, src.rows };
|
||||
if( ippiDistanceTransform_5x5_8u32f_C1R(
|
||||
src.ptr<uchar>(), (int)src.step,
|
||||
dst.ptr<float>(), (int)dst.step, roi, _mask) >= 0 )
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
}
|
||||
#endif
|
||||
Mat zpix = src == 0;
|
||||
connectedComponents(zpix, labels, 8, CV_32S);
|
||||
}
|
||||
@@ -772,17 +817,19 @@ void cv::distanceTransform( InputArray _src, OutputArray _dst, OutputArray _labe
|
||||
}
|
||||
}
|
||||
|
||||
distanceTransformEx_5x5( src, temp, dst, labels, _mask );
|
||||
distanceTransformEx_5x5( src, temp, dst, labels, _mask );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void cv::distanceTransform( InputArray _src, OutputArray _dst,
|
||||
int distanceType, int maskSize )
|
||||
int distanceType, int maskSize, int dstType)
|
||||
{
|
||||
distanceTransform(_src, _dst, noArray(), distanceType, maskSize, DIST_LABEL_PIXEL);
|
||||
}
|
||||
if (distanceType == CV_DIST_L1 && dstType==CV_8U)
|
||||
distanceTransform_L1_8U(_src, _dst);
|
||||
else
|
||||
distanceTransform(_src, _dst, noArray(), distanceType, maskSize, DIST_LABEL_PIXEL);
|
||||
|
||||
}
|
||||
|
||||
CV_IMPL void
|
||||
cvDistTransform( const void* srcarr, void* dstarr,
|
||||
|
||||
Reference in New Issue
Block a user