|
|
|
@ -1137,98 +1137,6 @@ private: |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
#if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7) |
|
|
|
|
#if 0 |
|
|
|
|
static bool IPPMorphReplicate(int op, const Mat &src, Mat &dst, const Mat &kernel, |
|
|
|
|
const Size& ksize, const Point &anchor, bool rectKernel) |
|
|
|
|
{ |
|
|
|
|
int type = src.type(); |
|
|
|
|
const Mat* _src = &src; |
|
|
|
|
Mat temp; |
|
|
|
|
if (src.data == dst.data) |
|
|
|
|
{ |
|
|
|
|
src.copyTo(temp); |
|
|
|
|
_src = &temp; |
|
|
|
|
} |
|
|
|
|
//DEPRECATED. Allocates and initializes morphology state structure for erosion or dilation operation.
|
|
|
|
|
// typedef IppStatus (CV_STDCALL* ippicviMorphologyInitAllocFunc)(int, const void*, IppiSize, IppiPoint, IppiMorphState **);
|
|
|
|
|
typedef IppStatus (CV_STDCALL* ippicviMorphologyGetSizeFunc)(int, const Ipp8u*, IppiSize, int*); |
|
|
|
|
typedef IppStatus (CV_STDCALL* ippicviMorphologyInit)(int, const Ipp8u*, IppiSize, IppiPoint, IppiMorphState*); |
|
|
|
|
typedef IppStatus (CV_STDCALL* ippicviMorphologyBorderReplicateFunc)(const void*, int, void *, int, IppiSize, IppiBorderType, IppiMorphState *); |
|
|
|
|
typedef IppStatus (CV_STDCALL* ippicviMorphologyBorderFunc8u)(const Ipp8u*, int, Ipp8u*, int, IppiSize, IppiBorderType, Ipp8u, IppiMorphState*, Ipp8u*); |
|
|
|
|
typedef IppStatus (CV_STDCALL* ippicviMorphologyBorderFunc32f)(const Ipp32f*, int, Ipp32f*, int, IppiSize, IppiBorderType, Ipp32f, IppiMorphState*, Ipp8u*); |
|
|
|
|
typedef IppStatus (CV_STDCALL* ippicviFilterMinMaxGetBufferSizeFunc)(int, IppiSize, int*); |
|
|
|
|
typedef IppStatus (CV_STDCALL* ippicviFilterMinMaxBorderReplicateFunc)(const void*, int, void*, int, IppiSize, IppiSize, IppiPoint, void*); |
|
|
|
|
|
|
|
|
|
//ippicviMorphologyInitAllocFunc initAllocFunc = 0;
|
|
|
|
|
ippicviMorphologyGetSizeFunc getSizeFunc = 0; |
|
|
|
|
ippicviMorphologyInit initFunc = 0; |
|
|
|
|
ippicviMorphologyBorderReplicateFunc morphFunc = 0; |
|
|
|
|
ippicviFilterMinMaxGetBufferSizeFunc getBufSizeFunc = 0; |
|
|
|
|
ippicviFilterMinMaxBorderReplicateFunc morphRectFunc = 0; |
|
|
|
|
|
|
|
|
|
#define IPP_MORPH_CASE(type, flavor, datatype) \ |
|
|
|
|
case type: \
|
|
|
|
|
/* initAllocFunc = (ippicviMorphologyInitAllocFunc)ippicviMorphologyInitAlloc_##flavor; */\
|
|
|
|
|
getSizeFunc = (ippicviMorphologyGetSizeFunc)ippicviMorphologyGetSize_##flavor ; \
|
|
|
|
|
initFunc = (ippicviMorphologyInit)ippicviMorphologyInit_##flavor ; \
|
|
|
|
|
morphFunc = op == MORPH_ERODE ? (ippicviMorphologyBorderReplicateFunc)ippicviErodeBorderReplicate_##flavor : \
|
|
|
|
|
(ippicviMorphologyBorderReplicateFunc)ippicviDilateBorderReplicate_##flavor; \
|
|
|
|
|
getBufSizeFunc = (ippicviFilterMinMaxGetBufferSizeFunc)ippicviFilterMinGetBufferSize_##flavor; \
|
|
|
|
|
morphRectFunc = op == MORPH_ERODE ? (ippicviFilterMinMaxBorderReplicateFunc)ippicviFilterMinBorderReplicate_##flavor : \
|
|
|
|
|
(ippicviFilterMinMaxBorderReplicateFunc)ippicviFilterMaxBorderReplicate_##flavor; \
|
|
|
|
|
break |
|
|
|
|
|
|
|
|
|
switch( type ) |
|
|
|
|
{ |
|
|
|
|
IPP_MORPH_CASE(CV_8UC1, 8u_C1R, 8u); |
|
|
|
|
IPP_MORPH_CASE(CV_8UC3, 8u_C3R, 8u); |
|
|
|
|
IPP_MORPH_CASE(CV_8UC4, 8u_C4R, 8u); |
|
|
|
|
IPP_MORPH_CASE(CV_32FC1, 32f_C1R, 32f); |
|
|
|
|
IPP_MORPH_CASE(CV_32FC3, 32f_C3R, 32f); |
|
|
|
|
IPP_MORPH_CASE(CV_32FC4, 32f_C4R, 32f); |
|
|
|
|
default: |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
#undef IPP_MORPH_CASE |
|
|
|
|
|
|
|
|
|
IppiSize roiSize = {src.cols, src.rows}; |
|
|
|
|
IppiSize kernelSize = {ksize.width, ksize.height}; |
|
|
|
|
IppiPoint point = {anchor.x, anchor.y}; |
|
|
|
|
|
|
|
|
|
if( !rectKernel && morphFunc && getSizeFunc && initFunc) |
|
|
|
|
{ |
|
|
|
|
//IppiMorphState* pState;
|
|
|
|
|
//if( initAllocFunc( roiSize.width, kernel.data, kernelSize, point, &pState ) < 0 )
|
|
|
|
|
// return false;
|
|
|
|
|
int stateSize = 0; |
|
|
|
|
if (getSizeFunc(roiSize.width, kernel.data, kernelSize, &stateSize) < 0) |
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
bool ok = false; |
|
|
|
|
IppiMorphState* pState = (IppiMorphState*)ippicvMalloc(stateSize); |
|
|
|
|
if (initFunc(roiSize.width, kernel.data, kernelSize, point, pState) >= 0) |
|
|
|
|
{ |
|
|
|
|
ok = morphFunc( _src->data, (int)_src->step[0], |
|
|
|
|
dst.data, (int)dst.step[0], |
|
|
|
|
roiSize, ippBorderRepl, pState ) >= 0; |
|
|
|
|
} |
|
|
|
|
ippicvFree(pState); |
|
|
|
|
//ippicviMorphologyFree(pState);
|
|
|
|
|
return ok; |
|
|
|
|
} |
|
|
|
|
else if( rectKernel && morphRectFunc && getBufSizeFunc ) |
|
|
|
|
{ |
|
|
|
|
int bufSize = 0; |
|
|
|
|
if( getBufSizeFunc( src.cols, kernelSize, &bufSize) < 0 ) |
|
|
|
|
return false; |
|
|
|
|
AutoBuffer<uchar> buf(bufSize + 64); |
|
|
|
|
uchar* buffer = alignPtr((uchar*)buf, 32); |
|
|
|
|
return morphRectFunc(_src->data, (int)_src->step[0], dst.data, (int)dst.step[0], |
|
|
|
|
roiSize, kernelSize, point, buffer) >= 0; |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
static bool IPPMorphReplicate(int op, const Mat &src, Mat &dst, const Mat &kernel, |
|
|
|
|
const Size& ksize, const Point &anchor, bool rectKernel) |
|
|
|
|
{ |
|
|
|
|