|
|
|
@ -1309,30 +1309,51 @@ static bool ipp_countNonZero( Mat &src, int &res ) |
|
|
|
|
{ |
|
|
|
|
CV_INSTRUMENT_REGION_IPP() |
|
|
|
|
|
|
|
|
|
Ipp32s count = 0; |
|
|
|
|
IppStatus status = ippStsNoErr; |
|
|
|
|
Ipp32s count = 0; |
|
|
|
|
int depth = src.depth(); |
|
|
|
|
|
|
|
|
|
int type = src.type(), depth = CV_MAT_DEPTH(type); |
|
|
|
|
IppiSize roiSize = { src.cols, src.rows }; |
|
|
|
|
Ipp32s srcstep = (Ipp32s)src.step; |
|
|
|
|
if (src.isContinuous()) |
|
|
|
|
if(src.dims <= 2) |
|
|
|
|
{ |
|
|
|
|
roiSize.width = (Ipp32s)src.total(); |
|
|
|
|
roiSize.height = 1; |
|
|
|
|
srcstep = (Ipp32s)src.total() * CV_ELEM_SIZE(type); |
|
|
|
|
} |
|
|
|
|
IppStatus status; |
|
|
|
|
IppiSize size = {src.cols*src.channels(), src.rows}; |
|
|
|
|
|
|
|
|
|
if(depth == CV_8U) |
|
|
|
|
status = CV_INSTRUMENT_FUN_IPP(ippiCountInRange_8u_C1R, (const Ipp8u *)src.ptr(), (int)src.step, size, &count, 0, 0); |
|
|
|
|
else if(depth == CV_32F) |
|
|
|
|
status = CV_INSTRUMENT_FUN_IPP(ippiCountInRange_32f_C1R, (const Ipp32f *)src.ptr(), (int)src.step, size, &count, 0, 0); |
|
|
|
|
else |
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
if (depth == CV_8U) |
|
|
|
|
status = CV_INSTRUMENT_FUN_IPP(ippiCountInRange_8u_C1R, (const Ipp8u *)src.data, srcstep, roiSize, &count, 0, 0); |
|
|
|
|
else if (depth == CV_32F) |
|
|
|
|
status = CV_INSTRUMENT_FUN_IPP(ippiCountInRange_32f_C1R, (const Ipp32f *)src.data, srcstep, roiSize, &count, 0, 0); |
|
|
|
|
if(status < 0) |
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
if (status >= 0) |
|
|
|
|
res = size.width*size.height - count; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
res = ((Ipp32s)src.total() - count); |
|
|
|
|
return true; |
|
|
|
|
IppStatus status; |
|
|
|
|
const Mat *arrays[] = {&src, NULL}; |
|
|
|
|
uchar *ptrs[1] = {NULL}; |
|
|
|
|
NAryMatIterator it(arrays, ptrs); |
|
|
|
|
IppiSize size = {(int)it.size*src.channels(), 1}; |
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < it.nplanes; i++, ++it) |
|
|
|
|
{ |
|
|
|
|
if(depth == CV_8U) |
|
|
|
|
status = CV_INSTRUMENT_FUN_IPP(ippiCountInRange_8u_C1R, (const Ipp8u *)src.ptr(), (int)src.step, size, &count, 0, 0); |
|
|
|
|
else if(depth == CV_32F) |
|
|
|
|
status = CV_INSTRUMENT_FUN_IPP(ippiCountInRange_32f_C1R, (const Ipp32f *)src.ptr(), (int)src.step, size, &count, 0, 0); |
|
|
|
|
else |
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
if(status < 0) |
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
res += (size.width*size.height - count); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
@ -1356,7 +1377,7 @@ int cv::countNonZero( InputArray _src ) |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
Mat src = _src.getMat(); |
|
|
|
|
CV_IPP_RUN(0 && (_src.dims() <= 2 || _src.isContinuous()), ipp_countNonZero(src, res), res); |
|
|
|
|
CV_IPP_RUN_FAST(ipp_countNonZero(src, res), res); |
|
|
|
|
|
|
|
|
|
CountNonZeroFunc func = getCountNonZeroTab(src.depth()); |
|
|
|
|
CV_Assert( func != 0 ); |
|
|
|
@ -2373,109 +2394,273 @@ static bool openvx_minMaxIdx(Mat &src, double* minVal, double* maxVal, int* minI |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef HAVE_IPP |
|
|
|
|
static bool ipp_minMaxIdx( Mat &src, double* minVal, double* maxVal, int* minIdx, int* maxIdx, Mat &mask) |
|
|
|
|
static IppStatus ipp_minMaxIndex_wrap(const void* pSrc, int srcStep, IppiSize size, IppDataType dataType, |
|
|
|
|
float* pMinVal, float* pMaxVal, IppiPoint* pMinIndex, IppiPoint* pMaxIndex, const Ipp8u*, int) |
|
|
|
|
{ |
|
|
|
|
CV_INSTRUMENT_REGION_IPP() |
|
|
|
|
switch(dataType) |
|
|
|
|
{ |
|
|
|
|
case ipp8u: return CV_INSTRUMENT_FUN_IPP(ippiMinMaxIndx_8u_C1R, (const Ipp8u*)pSrc, srcStep, size, pMinVal, pMaxVal, pMinIndex, pMaxIndex); |
|
|
|
|
case ipp16u: return CV_INSTRUMENT_FUN_IPP(ippiMinMaxIndx_16u_C1R, (const Ipp16u*)pSrc, srcStep, size, pMinVal, pMaxVal, pMinIndex, pMaxIndex); |
|
|
|
|
case ipp32f: return CV_INSTRUMENT_FUN_IPP(ippiMinMaxIndx_32f_C1R, (const Ipp32f*)pSrc, srcStep, size, pMinVal, pMaxVal, pMinIndex, pMaxIndex); |
|
|
|
|
default: return ippStsDataTypeErr; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#if IPP_VERSION_X100 >= 700 |
|
|
|
|
int type = src.type(), depth = CV_MAT_DEPTH(type), cn = CV_MAT_CN(type); |
|
|
|
|
size_t total_size = src.total(); |
|
|
|
|
int rows = src.size[0], cols = rows ? (int)(total_size/rows) : 0; |
|
|
|
|
if( src.dims == 2 || (src.isContinuous() && mask.isContinuous() && cols > 0 && (size_t)rows*cols == total_size) ) |
|
|
|
|
static IppStatus ipp_minMaxIndexMask_wrap(const void* pSrc, int srcStep, IppiSize size, IppDataType dataType, |
|
|
|
|
float* pMinVal, float* pMaxVal, IppiPoint* pMinIndex, IppiPoint* pMaxIndex, const Ipp8u* pMask, int maskStep) |
|
|
|
|
{ |
|
|
|
|
switch(dataType) |
|
|
|
|
{ |
|
|
|
|
IppiSize sz = { cols * cn, rows }; |
|
|
|
|
case ipp8u: return CV_INSTRUMENT_FUN_IPP(ippiMinMaxIndx_8u_C1MR, (const Ipp8u*)pSrc, srcStep, pMask, maskStep, size, pMinVal, pMaxVal, pMinIndex, pMaxIndex); |
|
|
|
|
case ipp16u: return CV_INSTRUMENT_FUN_IPP(ippiMinMaxIndx_16u_C1MR, (const Ipp16u*)pSrc, srcStep, pMask, maskStep, size, pMinVal, pMaxVal, pMinIndex, pMaxIndex); |
|
|
|
|
case ipp32f: return CV_INSTRUMENT_FUN_IPP(ippiMinMaxIndx_32f_C1MR, (const Ipp32f*)pSrc, srcStep, pMask, maskStep, size, pMinVal, pMaxVal, pMinIndex, pMaxIndex); |
|
|
|
|
default: return ippStsDataTypeErr; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if( !mask.empty() ) |
|
|
|
|
{ |
|
|
|
|
typedef IppStatus (CV_STDCALL* ippiMaskMinMaxIndxFuncC1)(const void *, int, const void *, int, |
|
|
|
|
IppiSize, Ipp32f *, Ipp32f *, IppiPoint *, IppiPoint *); |
|
|
|
|
|
|
|
|
|
CV_SUPPRESS_DEPRECATED_START |
|
|
|
|
ippiMaskMinMaxIndxFuncC1 ippiMinMaxIndx_C1MR = |
|
|
|
|
type == CV_8UC1 ? (ippiMaskMinMaxIndxFuncC1)ippiMinMaxIndx_8u_C1MR : |
|
|
|
|
#if IPP_VERSION_X100 < 900 |
|
|
|
|
type == CV_8SC1 ? (ippiMaskMinMaxIndxFuncC1)ippiMinMaxIndx_8s_C1MR : |
|
|
|
|
static IppStatus ipp_minMax_wrap(const void* pSrc, int srcStep, IppiSize size, IppDataType dataType, |
|
|
|
|
float* pMinVal, float* pMaxVal, IppiPoint*, IppiPoint*, const Ipp8u*, int) |
|
|
|
|
{ |
|
|
|
|
IppStatus status; |
|
|
|
|
|
|
|
|
|
switch(dataType) |
|
|
|
|
{ |
|
|
|
|
#if IPP_VERSION_X100 > 201701 // wrong min values
|
|
|
|
|
case ipp8u: |
|
|
|
|
{ |
|
|
|
|
Ipp8u val[2]; |
|
|
|
|
status = CV_INSTRUMENT_FUN_IPP(ippiMinMax_8u_C1R, (const Ipp8u*)pSrc, srcStep, size, &val[0], &val[1]); |
|
|
|
|
*pMinVal = val[0]; |
|
|
|
|
*pMaxVal = val[1]; |
|
|
|
|
return status; |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
type == CV_16UC1 ? (ippiMaskMinMaxIndxFuncC1)ippiMinMaxIndx_16u_C1MR : |
|
|
|
|
type == CV_32FC1 ? (ippiMaskMinMaxIndxFuncC1)ippiMinMaxIndx_32f_C1MR : 0; |
|
|
|
|
CV_SUPPRESS_DEPRECATED_END |
|
|
|
|
case ipp16u: |
|
|
|
|
{ |
|
|
|
|
Ipp16u val[2]; |
|
|
|
|
status = CV_INSTRUMENT_FUN_IPP(ippiMinMax_16u_C1R, (const Ipp16u*)pSrc, srcStep, size, &val[0], &val[1]); |
|
|
|
|
*pMinVal = val[0]; |
|
|
|
|
*pMaxVal = val[1]; |
|
|
|
|
return status; |
|
|
|
|
} |
|
|
|
|
case ipp16s: |
|
|
|
|
{ |
|
|
|
|
Ipp16s val[2]; |
|
|
|
|
status = CV_INSTRUMENT_FUN_IPP(ippiMinMax_16s_C1R, (const Ipp16s*)pSrc, srcStep, size, &val[0], &val[1]); |
|
|
|
|
*pMinVal = val[0]; |
|
|
|
|
*pMaxVal = val[1]; |
|
|
|
|
return status; |
|
|
|
|
} |
|
|
|
|
case ipp32f: return CV_INSTRUMENT_FUN_IPP(ippiMinMax_32f_C1R, (const Ipp32f*)pSrc, srcStep, size, pMinVal, pMaxVal); |
|
|
|
|
default: return ipp_minMaxIndex_wrap(pSrc, srcStep, size, dataType, pMinVal, pMaxVal, NULL, NULL, NULL, 0); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if( ippiMinMaxIndx_C1MR ) |
|
|
|
|
static IppStatus ipp_minIdx_wrap(const void* pSrc, int srcStep, IppiSize size, IppDataType dataType, |
|
|
|
|
float* pMinVal, float*, IppiPoint* pMinIndex, IppiPoint*, const Ipp8u*, int) |
|
|
|
|
{ |
|
|
|
|
IppStatus status; |
|
|
|
|
|
|
|
|
|
switch(dataType) |
|
|
|
|
{ |
|
|
|
|
case ipp8u: |
|
|
|
|
{ |
|
|
|
|
Ipp8u val; |
|
|
|
|
status = CV_INSTRUMENT_FUN_IPP(ippiMinIndx_8u_C1R, (const Ipp8u*)pSrc, srcStep, size, &val, &pMinIndex->x, &pMinIndex->y); |
|
|
|
|
*pMinVal = val; |
|
|
|
|
return status; |
|
|
|
|
} |
|
|
|
|
case ipp16u: |
|
|
|
|
{ |
|
|
|
|
Ipp16u val; |
|
|
|
|
status = CV_INSTRUMENT_FUN_IPP(ippiMinIndx_16u_C1R, (const Ipp16u*)pSrc, srcStep, size, &val, &pMinIndex->x, &pMinIndex->y); |
|
|
|
|
*pMinVal = val; |
|
|
|
|
return status; |
|
|
|
|
} |
|
|
|
|
case ipp16s: |
|
|
|
|
{ |
|
|
|
|
Ipp16s val; |
|
|
|
|
status = CV_INSTRUMENT_FUN_IPP(ippiMinIndx_16s_C1R, (const Ipp16s*)pSrc, srcStep, size, &val, &pMinIndex->x, &pMinIndex->y); |
|
|
|
|
*pMinVal = val; |
|
|
|
|
return status; |
|
|
|
|
} |
|
|
|
|
case ipp32f: return CV_INSTRUMENT_FUN_IPP(ippiMinIndx_32f_C1R, (const Ipp32f*)pSrc, srcStep, size, pMinVal, &pMinIndex->x, &pMinIndex->y); |
|
|
|
|
default: return ipp_minMaxIndex_wrap(pSrc, srcStep, size, dataType, pMinVal, NULL, pMinIndex, NULL, NULL, 0); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static IppStatus ipp_maxIdx_wrap(const void* pSrc, int srcStep, IppiSize size, IppDataType dataType, |
|
|
|
|
float*, float* pMaxVal, IppiPoint*, IppiPoint* pMaxIndex, const Ipp8u*, int) |
|
|
|
|
{ |
|
|
|
|
IppStatus status; |
|
|
|
|
|
|
|
|
|
switch(dataType) |
|
|
|
|
{ |
|
|
|
|
case ipp8u: |
|
|
|
|
{ |
|
|
|
|
Ipp8u val; |
|
|
|
|
status = CV_INSTRUMENT_FUN_IPP(ippiMaxIndx_8u_C1R, (const Ipp8u*)pSrc, srcStep, size, &val, &pMaxIndex->x, &pMaxIndex->y); |
|
|
|
|
*pMaxVal = val; |
|
|
|
|
return status; |
|
|
|
|
} |
|
|
|
|
case ipp16u: |
|
|
|
|
{ |
|
|
|
|
Ipp16u val; |
|
|
|
|
status = CV_INSTRUMENT_FUN_IPP(ippiMaxIndx_16u_C1R, (const Ipp16u*)pSrc, srcStep, size, &val, &pMaxIndex->x, &pMaxIndex->y); |
|
|
|
|
*pMaxVal = val; |
|
|
|
|
return status; |
|
|
|
|
} |
|
|
|
|
case ipp16s: |
|
|
|
|
{ |
|
|
|
|
Ipp16s val; |
|
|
|
|
status = CV_INSTRUMENT_FUN_IPP(ippiMaxIndx_16s_C1R, (const Ipp16s*)pSrc, srcStep, size, &val, &pMaxIndex->x, &pMaxIndex->y); |
|
|
|
|
*pMaxVal = val; |
|
|
|
|
return status; |
|
|
|
|
} |
|
|
|
|
case ipp32f: return CV_INSTRUMENT_FUN_IPP(ippiMaxIndx_32f_C1R, (const Ipp32f*)pSrc, srcStep, size, pMaxVal, &pMaxIndex->x, &pMaxIndex->y); |
|
|
|
|
default: return ipp_minMaxIndex_wrap(pSrc, srcStep, size, dataType, NULL, pMaxVal, NULL, pMaxIndex, NULL, 0); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
typedef IppStatus (*IppMinMaxSelector)(const void* pSrc, int srcStep, IppiSize size, IppDataType dataType, |
|
|
|
|
float* pMinVal, float* pMaxVal, IppiPoint* pMinIndex, IppiPoint* pMaxIndex, const Ipp8u* pMask, int maskStep); |
|
|
|
|
|
|
|
|
|
static bool ipp_minMaxIdx(Mat &src, double* _minVal, double* _maxVal, int* _minIdx, int* _maxIdx, Mat &mask) |
|
|
|
|
{ |
|
|
|
|
#if IPP_VERSION_X100 >= 700 |
|
|
|
|
CV_INSTRUMENT_REGION_IPP() |
|
|
|
|
|
|
|
|
|
IppStatus status; |
|
|
|
|
IppDataType dataType = ippiGetDataType(src.depth()); |
|
|
|
|
float minVal = 0; |
|
|
|
|
float maxVal = 0; |
|
|
|
|
IppiPoint minIdx = {-1, -1}; |
|
|
|
|
IppiPoint maxIdx = {-1, -1}; |
|
|
|
|
|
|
|
|
|
float *pMinVal = (_minVal)?&minVal:NULL; |
|
|
|
|
float *pMaxVal = (_maxVal)?&maxVal:NULL; |
|
|
|
|
IppiPoint *pMinIdx = (_minIdx)?&minIdx:NULL; |
|
|
|
|
IppiPoint *pMaxIdx = (_maxIdx)?&maxIdx:NULL; |
|
|
|
|
|
|
|
|
|
IppMinMaxSelector ippMinMaxFun = ipp_minMaxIndexMask_wrap; |
|
|
|
|
if(mask.empty()) |
|
|
|
|
{ |
|
|
|
|
if(_maxVal && _maxIdx && !_minVal && !_minIdx) |
|
|
|
|
ippMinMaxFun = ipp_maxIdx_wrap; |
|
|
|
|
else if(!_maxVal && !_maxIdx && _minVal && _minIdx) |
|
|
|
|
ippMinMaxFun = ipp_minIdx_wrap; |
|
|
|
|
else if(_maxVal && !_maxIdx && _minVal && !_minIdx) |
|
|
|
|
ippMinMaxFun = ipp_minMax_wrap; |
|
|
|
|
else |
|
|
|
|
ippMinMaxFun = ipp_minMaxIndex_wrap; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(src.dims <= 2) |
|
|
|
|
{ |
|
|
|
|
IppiSize size = ippiSize(src.size()); |
|
|
|
|
size.width *= src.channels(); |
|
|
|
|
|
|
|
|
|
status = ippMinMaxFun(src.ptr(), (int)src.step, size, dataType, pMinVal, pMaxVal, pMinIdx, pMaxIdx, (Ipp8u*)mask.ptr(), (int)mask.step); |
|
|
|
|
if(status < 0 || status == ippStsNoOperation) |
|
|
|
|
return false; |
|
|
|
|
if(_minVal) |
|
|
|
|
*_minVal = minVal; |
|
|
|
|
if(_maxVal) |
|
|
|
|
*_maxVal = maxVal; |
|
|
|
|
if(_minIdx) |
|
|
|
|
{ |
|
|
|
|
if(!mask.empty() && !minIdx.y && !minIdx.x) |
|
|
|
|
{ |
|
|
|
|
Ipp32f min, max; |
|
|
|
|
IppiPoint minp, maxp; |
|
|
|
|
if( CV_INSTRUMENT_FUN_IPP(ippiMinMaxIndx_C1MR, src.ptr(), (int)src.step[0], mask.ptr(), (int)mask.step[0], sz, &min, &max, &minp, &maxp) >= 0 ) |
|
|
|
|
{ |
|
|
|
|
if( minVal ) |
|
|
|
|
*minVal = (double)min; |
|
|
|
|
if( maxVal ) |
|
|
|
|
*maxVal = (double)max; |
|
|
|
|
if( !minp.x && !minp.y && !maxp.x && !maxp.y && !mask.ptr()[0] ) |
|
|
|
|
minp.x = maxp.x = -1; |
|
|
|
|
if( minIdx ) |
|
|
|
|
{ |
|
|
|
|
size_t minidx = minp.y * cols + minp.x + 1; |
|
|
|
|
ofs2idx(src, minidx, minIdx); |
|
|
|
|
} |
|
|
|
|
if( maxIdx ) |
|
|
|
|
{ |
|
|
|
|
size_t maxidx = maxp.y * cols + maxp.x + 1; |
|
|
|
|
ofs2idx(src, maxidx, maxIdx); |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
_minIdx[0] = -1; |
|
|
|
|
_minIdx[1] = -1; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
_minIdx[0] = minIdx.y; |
|
|
|
|
_minIdx[1] = minIdx.x; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
if(_maxIdx) |
|
|
|
|
{ |
|
|
|
|
typedef IppStatus (CV_STDCALL* ippiMinMaxIndxFuncC1)(const void *, int, IppiSize, Ipp32f *, Ipp32f *, IppiPoint *, IppiPoint *); |
|
|
|
|
|
|
|
|
|
CV_SUPPRESS_DEPRECATED_START |
|
|
|
|
ippiMinMaxIndxFuncC1 ippiMinMaxIndx_C1R = |
|
|
|
|
#if IPP_VERSION_X100 != 900 // bug in 9.0.0 avx2 optimization
|
|
|
|
|
depth == CV_8U ? (ippiMinMaxIndxFuncC1)ippiMinMaxIndx_8u_C1R : |
|
|
|
|
#endif |
|
|
|
|
#if IPP_VERSION_X100 < 900 |
|
|
|
|
depth == CV_8S ? (ippiMinMaxIndxFuncC1)ippiMinMaxIndx_8s_C1R : |
|
|
|
|
#endif |
|
|
|
|
depth == CV_16U ? (ippiMinMaxIndxFuncC1)ippiMinMaxIndx_16u_C1R : |
|
|
|
|
#if IPP_DISABLE_BLOCK && !((defined _MSC_VER && defined _M_IX86) || defined __i386__) |
|
|
|
|
// See bug #4955: the function fails with SEGFAULT when the source matrix contains NANs
|
|
|
|
|
// IPPICV version is 9.0.1.
|
|
|
|
|
depth == CV_32F ? (ippiMinMaxIndxFuncC1)ippiMinMaxIndx_32f_C1R : |
|
|
|
|
if(!mask.empty() && !maxIdx.y && !maxIdx.x) |
|
|
|
|
{ |
|
|
|
|
_maxIdx[0] = -1; |
|
|
|
|
_maxIdx[1] = -1; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
_maxIdx[0] = maxIdx.y; |
|
|
|
|
_maxIdx[1] = maxIdx.x; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
const Mat *arrays[] = {&src, mask.empty()?NULL:&mask, NULL}; |
|
|
|
|
uchar *ptrs[3] = {NULL}; |
|
|
|
|
NAryMatIterator it(arrays, ptrs); |
|
|
|
|
IppiSize size = ippiSize(it.size*src.channels(), 1); |
|
|
|
|
int srcStep = (int)(size.width*src.elemSize1()); |
|
|
|
|
int maskStep = size.width; |
|
|
|
|
size_t idxPos = 1; |
|
|
|
|
size_t minIdxAll = 0; |
|
|
|
|
size_t maxIdxAll = 0; |
|
|
|
|
float minValAll = IPP_MAXABS_32F; |
|
|
|
|
float maxValAll = -IPP_MAXABS_32F; |
|
|
|
|
|
|
|
|
|
for(size_t i = 0; i < it.nplanes; i++, ++it, idxPos += size.width) |
|
|
|
|
{ |
|
|
|
|
status = ippMinMaxFun(ptrs[0], srcStep, size, dataType, pMinVal, pMaxVal, pMinIdx, pMaxIdx, ptrs[1], maskStep); |
|
|
|
|
if(status < 0) |
|
|
|
|
return false; |
|
|
|
|
#if IPP_VERSION_X100 > 201701 |
|
|
|
|
// Zero-mask check, function should return ippStsNoOperation warning
|
|
|
|
|
if(status == ippStsNoOperation) |
|
|
|
|
continue; |
|
|
|
|
#else |
|
|
|
|
// Crude zero-mask check, waiting for fix in IPP function
|
|
|
|
|
if(ptrs[1]) |
|
|
|
|
{ |
|
|
|
|
Mat localMask(Size(size.width, 1), CV_8U, ptrs[1], maskStep); |
|
|
|
|
if(!cv::countNonZero(localMask)) |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
0; |
|
|
|
|
CV_SUPPRESS_DEPRECATED_END |
|
|
|
|
|
|
|
|
|
if( ippiMinMaxIndx_C1R ) |
|
|
|
|
if(_minVal && minVal < minValAll) |
|
|
|
|
{ |
|
|
|
|
Ipp32f min, max; |
|
|
|
|
IppiPoint minp, maxp; |
|
|
|
|
if( CV_INSTRUMENT_FUN_IPP(ippiMinMaxIndx_C1R, src.ptr(), (int)src.step[0], sz, &min, &max, &minp, &maxp) >= 0 ) |
|
|
|
|
{ |
|
|
|
|
if( minVal ) |
|
|
|
|
*minVal = (double)min; |
|
|
|
|
if( maxVal ) |
|
|
|
|
*maxVal = (double)max; |
|
|
|
|
if( minIdx ) |
|
|
|
|
{ |
|
|
|
|
size_t minidx = minp.y * cols + minp.x + 1; |
|
|
|
|
ofs2idx(src, minidx, minIdx); |
|
|
|
|
} |
|
|
|
|
if( maxIdx ) |
|
|
|
|
{ |
|
|
|
|
size_t maxidx = maxp.y * cols + maxp.x + 1; |
|
|
|
|
ofs2idx(src, maxidx, maxIdx); |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
minValAll = minVal; |
|
|
|
|
minIdxAll = idxPos+minIdx.x; |
|
|
|
|
} |
|
|
|
|
if(_maxVal && maxVal > maxValAll) |
|
|
|
|
{ |
|
|
|
|
maxValAll = maxVal; |
|
|
|
|
maxIdxAll = idxPos+maxIdx.x; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if(!src.empty() && mask.empty()) |
|
|
|
|
{ |
|
|
|
|
if(minIdxAll == 0) |
|
|
|
|
minIdxAll = 1; |
|
|
|
|
if(maxValAll == 0) |
|
|
|
|
maxValAll = 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(_minVal) |
|
|
|
|
*_minVal = minValAll; |
|
|
|
|
if(_maxVal) |
|
|
|
|
*_maxVal = maxValAll; |
|
|
|
|
if(_minIdx) |
|
|
|
|
ofs2idx(src, minIdxAll, _minIdx); |
|
|
|
|
if(_maxIdx) |
|
|
|
|
ofs2idx(src, maxIdxAll, _maxIdx); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
#else |
|
|
|
|
#endif |
|
|
|
|
CV_UNUSED(src); CV_UNUSED(minVal); CV_UNUSED(maxVal); CV_UNUSED(minIdx); CV_UNUSED(maxIdx); CV_UNUSED(mask); |
|
|
|
|
return false; |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
@ -2499,7 +2684,7 @@ void cv::minMaxIdx(InputArray _src, double* minVal, |
|
|
|
|
CV_OVX_RUN(true, |
|
|
|
|
openvx_minMaxIdx(src, minVal, maxVal, minIdx, maxIdx, mask)) |
|
|
|
|
|
|
|
|
|
CV_IPP_RUN(IPP_VERSION_X100 >= 700, ipp_minMaxIdx(src, minVal, maxVal, minIdx, maxIdx, mask)) |
|
|
|
|
CV_IPP_RUN_FAST(ipp_minMaxIdx(src, minVal, maxVal, minIdx, maxIdx, mask)) |
|
|
|
|
|
|
|
|
|
MinMaxIdxFunc func = getMinmaxTab(depth); |
|
|
|
|
CV_Assert( func != 0 ); |
|
|
|
@ -2837,42 +3022,31 @@ static bool ipp_norm(Mat &src, int normType, Mat &mask, double &result) |
|
|
|
|
CV_INSTRUMENT_REGION_IPP() |
|
|
|
|
|
|
|
|
|
#if IPP_VERSION_X100 >= 700 |
|
|
|
|
int cn = src.channels(); |
|
|
|
|
size_t total_size = src.total(); |
|
|
|
|
int rows = src.size[0], cols = rows ? (int)(total_size/rows) : 0; |
|
|
|
|
|
|
|
|
|
if( (src.dims == 2 || (src.isContinuous() && mask.isContinuous())) |
|
|
|
|
&& cols > 0 && (size_t)rows*cols == total_size |
|
|
|
|
&& (normType == NORM_INF || normType == NORM_L1 || |
|
|
|
|
normType == NORM_L2 || normType == NORM_L2SQR) ) |
|
|
|
|
&& cols > 0 && (size_t)rows*cols == total_size ) |
|
|
|
|
{ |
|
|
|
|
IppiSize sz = { cols, rows }; |
|
|
|
|
int type = src.type(); |
|
|
|
|
if( !mask.empty() ) |
|
|
|
|
{ |
|
|
|
|
IppiSize sz = { cols, rows }; |
|
|
|
|
int type = src.type(); |
|
|
|
|
|
|
|
|
|
typedef IppStatus (CV_STDCALL* ippiMaskNormFuncC1)(const void *, int, const void *, int, IppiSize, Ipp64f *); |
|
|
|
|
ippiMaskNormFuncC1 ippiNorm_C1MR = |
|
|
|
|
normType == NORM_INF ? |
|
|
|
|
(type == CV_8UC1 ? (ippiMaskNormFuncC1)ippiNorm_Inf_8u_C1MR : |
|
|
|
|
#if IPP_VERSION_X100 < 900 |
|
|
|
|
type == CV_8SC1 ? (ippiMaskNormFuncC1)ippiNorm_Inf_8s_C1MR : |
|
|
|
|
#endif |
|
|
|
|
// type == CV_16UC1 ? (ippiMaskNormFuncC1)ippiNorm_Inf_16u_C1MR :
|
|
|
|
|
type == CV_16UC1 ? (ippiMaskNormFuncC1)ippiNorm_Inf_16u_C1MR : |
|
|
|
|
type == CV_32FC1 ? (ippiMaskNormFuncC1)ippiNorm_Inf_32f_C1MR : |
|
|
|
|
0) : |
|
|
|
|
normType == NORM_L1 ? |
|
|
|
|
(type == CV_8UC1 ? (ippiMaskNormFuncC1)ippiNorm_L1_8u_C1MR : |
|
|
|
|
#if IPP_VERSION_X100 < 900 |
|
|
|
|
type == CV_8SC1 ? (ippiMaskNormFuncC1)ippiNorm_L1_8s_C1MR : |
|
|
|
|
#endif |
|
|
|
|
type == CV_16UC1 ? (ippiMaskNormFuncC1)ippiNorm_L1_16u_C1MR : |
|
|
|
|
type == CV_32FC1 ? (ippiMaskNormFuncC1)ippiNorm_L1_32f_C1MR : |
|
|
|
|
0) : |
|
|
|
|
normType == NORM_L2 || normType == NORM_L2SQR ? |
|
|
|
|
(type == CV_8UC1 ? (ippiMaskNormFuncC1)ippiNorm_L2_8u_C1MR : |
|
|
|
|
#if IPP_VERSION_X100 < 900 |
|
|
|
|
type == CV_8SC1 ? (ippiMaskNormFuncC1)ippiNorm_L2_8s_C1MR : |
|
|
|
|
#endif |
|
|
|
|
type == CV_16UC1 ? (ippiMaskNormFuncC1)ippiNorm_L2_16u_C1MR : |
|
|
|
|
type == CV_32FC1 ? (ippiMaskNormFuncC1)ippiNorm_L2_32f_C1MR : |
|
|
|
|
0) : 0; |
|
|
|
@ -2885,39 +3059,29 @@ static bool ipp_norm(Mat &src, int normType, Mat &mask, double &result) |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#if IPP_DISABLE_BLOCK |
|
|
|
|
typedef IppStatus (CV_STDCALL* ippiMaskNormFuncC3)(const void *, int, const void *, int, IppiSize, int, Ipp64f *); |
|
|
|
|
ippiMaskNormFuncC3 ippiNorm_C3CMR = |
|
|
|
|
normType == NORM_INF ? |
|
|
|
|
(type == CV_8UC3 ? (ippiMaskNormFuncC3)ippiNorm_Inf_8u_C3CMR : |
|
|
|
|
#if IPP_VERSION_X100 < 900 |
|
|
|
|
type == CV_8SC3 ? (ippiMaskNormFuncC3)ippiNorm_Inf_8s_C3CMR : |
|
|
|
|
#endif |
|
|
|
|
type == CV_16UC3 ? (ippiMaskNormFuncC3)ippiNorm_Inf_16u_C3CMR : |
|
|
|
|
type == CV_32FC3 ? (ippiMaskNormFuncC3)ippiNorm_Inf_32f_C3CMR : |
|
|
|
|
0) : |
|
|
|
|
normType == NORM_L1 ? |
|
|
|
|
(type == CV_8UC3 ? (ippiMaskNormFuncC3)ippiNorm_L1_8u_C3CMR : |
|
|
|
|
#if IPP_VERSION_X100 < 900 |
|
|
|
|
type == CV_8SC3 ? (ippiMaskNormFuncC3)ippiNorm_L1_8s_C3CMR : |
|
|
|
|
#endif |
|
|
|
|
type == CV_16UC3 ? (ippiMaskNormFuncC3)ippiNorm_L1_16u_C3CMR : |
|
|
|
|
type == CV_32FC3 ? (ippiMaskNormFuncC3)ippiNorm_L1_32f_C3CMR : |
|
|
|
|
0) : |
|
|
|
|
normType == NORM_L2 || normType == NORM_L2SQR ? |
|
|
|
|
(type == CV_8UC3 ? (ippiMaskNormFuncC3)ippiNorm_L2_8u_C3CMR : |
|
|
|
|
#if IPP_VERSION_X100 < 900 |
|
|
|
|
type == CV_8SC3 ? (ippiMaskNormFuncC3)ippiNorm_L2_8s_C3CMR : |
|
|
|
|
#endif |
|
|
|
|
type == CV_16UC3 ? (ippiMaskNormFuncC3)ippiNorm_L2_16u_C3CMR : |
|
|
|
|
type == CV_32FC3 ? (ippiMaskNormFuncC3)ippiNorm_L2_32f_C3CMR : |
|
|
|
|
0) : 0; |
|
|
|
|
if( ippiNorm_C3CMR ) |
|
|
|
|
{ |
|
|
|
|
Ipp64f norm1, norm2, norm3; |
|
|
|
|
if( CV_INSTRUMENT_FUN_IPP(ippiNorm_C3CMR, (src.data, (int)src.step[0], mask.data, (int)mask.step[0], sz, 1, &norm1)) >= 0 && |
|
|
|
|
CV_INSTRUMENT_FUN_IPP(ippiNorm_C3CMR, (src.data, (int)src.step[0], mask.data, (int)mask.step[0], sz, 2, &norm2)) >= 0 && |
|
|
|
|
CV_INSTRUMENT_FUN_IPP(ippiNorm_C3CMR, (src.data, (int)src.step[0], mask.data, (int)mask.step[0], sz, 3, &norm3)) >= 0) |
|
|
|
|
if( CV_INSTRUMENT_FUN_IPP(ippiNorm_C3CMR, src.data, (int)src.step[0], mask.data, (int)mask.step[0], sz, 1, &norm1) >= 0 && |
|
|
|
|
CV_INSTRUMENT_FUN_IPP(ippiNorm_C3CMR, src.data, (int)src.step[0], mask.data, (int)mask.step[0], sz, 2, &norm2) >= 0 && |
|
|
|
|
CV_INSTRUMENT_FUN_IPP(ippiNorm_C3CMR, src.data, (int)src.step[0], mask.data, (int)mask.step[0], sz, 3, &norm3) >= 0) |
|
|
|
|
{ |
|
|
|
|
Ipp64f norm = |
|
|
|
|
normType == NORM_INF ? std::max(std::max(norm1, norm2), norm3) : |
|
|
|
@ -2928,81 +3092,46 @@ static bool ipp_norm(Mat &src, int normType, Mat &mask, double &result) |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
IppiSize sz = { cols*src.channels(), rows }; |
|
|
|
|
int type = src.depth(); |
|
|
|
|
|
|
|
|
|
typedef IppStatus (CV_STDCALL* ippiNormFuncHint)(const void *, int, IppiSize, Ipp64f *, IppHintAlgorithm hint); |
|
|
|
|
typedef IppStatus (CV_STDCALL* ippiNormFuncNoHint)(const void *, int, IppiSize, Ipp64f *); |
|
|
|
|
ippiNormFuncHint ippiNormHint = |
|
|
|
|
normType == NORM_L1 ? |
|
|
|
|
(type == CV_32FC1 ? (ippiNormFuncHint)ippiNorm_L1_32f_C1R : |
|
|
|
|
type == CV_32FC3 ? (ippiNormFuncHint)ippiNorm_L1_32f_C3R : |
|
|
|
|
type == CV_32FC4 ? (ippiNormFuncHint)ippiNorm_L1_32f_C4R : |
|
|
|
|
0) : |
|
|
|
|
normType == NORM_L2 || normType == NORM_L2SQR ? |
|
|
|
|
(type == CV_32FC1 ? (ippiNormFuncHint)ippiNorm_L2_32f_C1R : |
|
|
|
|
type == CV_32FC3 ? (ippiNormFuncHint)ippiNorm_L2_32f_C3R : |
|
|
|
|
type == CV_32FC4 ? (ippiNormFuncHint)ippiNorm_L2_32f_C4R : |
|
|
|
|
0) : 0; |
|
|
|
|
ippiNormFuncNoHint ippiNorm = |
|
|
|
|
normType == NORM_INF ? |
|
|
|
|
(type == CV_8UC1 ? (ippiNormFuncNoHint)ippiNorm_Inf_8u_C1R : |
|
|
|
|
type == CV_8UC3 ? (ippiNormFuncNoHint)ippiNorm_Inf_8u_C3R : |
|
|
|
|
type == CV_8UC4 ? (ippiNormFuncNoHint)ippiNorm_Inf_8u_C4R : |
|
|
|
|
type == CV_16UC1 ? (ippiNormFuncNoHint)ippiNorm_Inf_16u_C1R : |
|
|
|
|
type == CV_16UC3 ? (ippiNormFuncNoHint)ippiNorm_Inf_16u_C3R : |
|
|
|
|
type == CV_16UC4 ? (ippiNormFuncNoHint)ippiNorm_Inf_16u_C4R : |
|
|
|
|
type == CV_16SC1 ? (ippiNormFuncNoHint)ippiNorm_Inf_16s_C1R : |
|
|
|
|
#if (IPP_VERSION_X100 >= 810) |
|
|
|
|
type == CV_16SC3 ? (ippiNormFuncNoHint)ippiNorm_Inf_16s_C3R : //Aug 2013: problem in IPP 7.1, 8.0 : -32768
|
|
|
|
|
type == CV_16SC4 ? (ippiNormFuncNoHint)ippiNorm_Inf_16s_C4R : //Aug 2013: problem in IPP 7.1, 8.0 : -32768
|
|
|
|
|
#endif |
|
|
|
|
type == CV_32FC1 ? (ippiNormFuncNoHint)ippiNorm_Inf_32f_C1R : |
|
|
|
|
type == CV_32FC3 ? (ippiNormFuncNoHint)ippiNorm_Inf_32f_C3R : |
|
|
|
|
type == CV_32FC4 ? (ippiNormFuncNoHint)ippiNorm_Inf_32f_C4R : |
|
|
|
|
0) : |
|
|
|
|
normType == NORM_L1 ? |
|
|
|
|
(type == CV_8UC1 ? (ippiNormFuncNoHint)ippiNorm_L1_8u_C1R : |
|
|
|
|
type == CV_8UC3 ? (ippiNormFuncNoHint)ippiNorm_L1_8u_C3R : |
|
|
|
|
type == CV_8UC4 ? (ippiNormFuncNoHint)ippiNorm_L1_8u_C4R : |
|
|
|
|
type == CV_16UC1 ? (ippiNormFuncNoHint)ippiNorm_L1_16u_C1R : |
|
|
|
|
type == CV_16UC3 ? (ippiNormFuncNoHint)ippiNorm_L1_16u_C3R : |
|
|
|
|
type == CV_16UC4 ? (ippiNormFuncNoHint)ippiNorm_L1_16u_C4R : |
|
|
|
|
type == CV_16SC1 ? (ippiNormFuncNoHint)ippiNorm_L1_16s_C1R : |
|
|
|
|
type == CV_16SC3 ? (ippiNormFuncNoHint)ippiNorm_L1_16s_C3R : |
|
|
|
|
type == CV_16SC4 ? (ippiNormFuncNoHint)ippiNorm_L1_16s_C4R : |
|
|
|
|
0) : |
|
|
|
|
normType == NORM_L2 || normType == NORM_L2SQR ? |
|
|
|
|
(type == CV_8UC1 ? (ippiNormFuncNoHint)ippiNorm_L2_8u_C1R : |
|
|
|
|
type == CV_8UC3 ? (ippiNormFuncNoHint)ippiNorm_L2_8u_C3R : |
|
|
|
|
type == CV_8UC4 ? (ippiNormFuncNoHint)ippiNorm_L2_8u_C4R : |
|
|
|
|
type == CV_16UC1 ? (ippiNormFuncNoHint)ippiNorm_L2_16u_C1R : |
|
|
|
|
type == CV_16UC3 ? (ippiNormFuncNoHint)ippiNorm_L2_16u_C3R : |
|
|
|
|
type == CV_16UC4 ? (ippiNormFuncNoHint)ippiNorm_L2_16u_C4R : |
|
|
|
|
type == CV_16SC1 ? (ippiNormFuncNoHint)ippiNorm_L2_16s_C1R : |
|
|
|
|
type == CV_16SC3 ? (ippiNormFuncNoHint)ippiNorm_L2_16s_C3R : |
|
|
|
|
type == CV_16SC4 ? (ippiNormFuncNoHint)ippiNorm_L2_16s_C4R : |
|
|
|
|
0) : 0; |
|
|
|
|
// Make sure only zero or one version of the function pointer is valid
|
|
|
|
|
CV_Assert(!ippiNormHint || !ippiNorm); |
|
|
|
|
if( ippiNormHint || ippiNorm ) |
|
|
|
|
{ |
|
|
|
|
Ipp64f norm_array[4]; |
|
|
|
|
IppStatus ret = ippiNormHint ? CV_INSTRUMENT_FUN_IPP(ippiNormHint, src.ptr(), (int)src.step[0], sz, norm_array, ippAlgHintAccurate) : |
|
|
|
|
CV_INSTRUMENT_FUN_IPP(ippiNorm, src.ptr(), (int)src.step[0], sz, norm_array); |
|
|
|
|
Ipp64f norm; |
|
|
|
|
IppStatus ret = ippiNormHint ? CV_INSTRUMENT_FUN_IPP(ippiNormHint, src.ptr(), (int)src.step[0], sz, &norm, ippAlgHintAccurate) : |
|
|
|
|
CV_INSTRUMENT_FUN_IPP(ippiNorm, src.ptr(), (int)src.step[0], sz, &norm); |
|
|
|
|
if( ret >= 0 ) |
|
|
|
|
{ |
|
|
|
|
Ipp64f norm = (normType == NORM_L2 || normType == NORM_L2SQR) ? norm_array[0] * norm_array[0] : norm_array[0]; |
|
|
|
|
for( int i = 1; i < cn; i++ ) |
|
|
|
|
{ |
|
|
|
|
norm = |
|
|
|
|
normType == NORM_INF ? std::max(norm, norm_array[i]) : |
|
|
|
|
normType == NORM_L1 ? norm + norm_array[i] : |
|
|
|
|
normType == NORM_L2 || normType == NORM_L2SQR ? norm + norm_array[i] * norm_array[i] : |
|
|
|
|
0; |
|
|
|
|
} |
|
|
|
|
result = (normType == NORM_L2 ? (double)std::sqrt(norm) : (double)norm); |
|
|
|
|
result = (normType == NORM_L2SQR) ? norm * norm : norm; |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -3248,53 +3377,38 @@ static bool ipp_norm(InputArray _src1, InputArray _src2, int normType, InputArra |
|
|
|
|
if( normType & CV_RELATIVE ) |
|
|
|
|
{ |
|
|
|
|
normType &= NORM_TYPE_MASK; |
|
|
|
|
CV_Assert( normType == NORM_INF || normType == NORM_L1 || normType == NORM_L2 || normType == NORM_L2SQR || |
|
|
|
|
((normType == NORM_HAMMING || normType == NORM_HAMMING2) && src1.type() == CV_8U) ); |
|
|
|
|
|
|
|
|
|
size_t total_size = src1.total(); |
|
|
|
|
int rows = src1.size[0], cols = rows ? (int)(total_size/rows) : 0; |
|
|
|
|
if( (src1.dims == 2 || (src1.isContinuous() && src2.isContinuous() && mask.isContinuous())) |
|
|
|
|
&& cols > 0 && (size_t)rows*cols == total_size |
|
|
|
|
&& (normType == NORM_INF || normType == NORM_L1 || |
|
|
|
|
normType == NORM_L2 || normType == NORM_L2SQR) ) |
|
|
|
|
&& cols > 0 && (size_t)rows*cols == total_size ) |
|
|
|
|
{ |
|
|
|
|
IppiSize sz = { cols, rows }; |
|
|
|
|
int type = src1.type(); |
|
|
|
|
if( !mask.empty() ) |
|
|
|
|
{ |
|
|
|
|
typedef IppStatus (CV_STDCALL* ippiMaskNormRelFuncC1)(const void *, int, const void *, int, const void *, int, IppiSize, Ipp64f *); |
|
|
|
|
ippiMaskNormRelFuncC1 ippiNormDiff_C1MR = |
|
|
|
|
IppiSize sz = { cols, rows }; |
|
|
|
|
int type = src1.type(); |
|
|
|
|
|
|
|
|
|
typedef IppStatus (CV_STDCALL* ippiMaskNormDiffFuncC1)(const void *, int, const void *, int, const void *, int, IppiSize, Ipp64f *); |
|
|
|
|
ippiMaskNormDiffFuncC1 ippiNormRel_C1MR = |
|
|
|
|
normType == NORM_INF ? |
|
|
|
|
(type == CV_8UC1 ? (ippiMaskNormRelFuncC1)ippiNormRel_Inf_8u_C1MR : |
|
|
|
|
#if IPP_VERSION_X100 < 900 |
|
|
|
|
#ifndef __APPLE__ |
|
|
|
|
type == CV_8SC1 ? (ippiMaskNormRelFuncC1)ippiNormRel_Inf_8s_C1MR : |
|
|
|
|
#endif |
|
|
|
|
#endif |
|
|
|
|
type == CV_16UC1 ? (ippiMaskNormRelFuncC1)ippiNormRel_Inf_16u_C1MR : |
|
|
|
|
type == CV_32FC1 ? (ippiMaskNormRelFuncC1)ippiNormRel_Inf_32f_C1MR : |
|
|
|
|
(type == CV_8UC1 ? (ippiMaskNormDiffFuncC1)ippiNormRel_Inf_8u_C1MR : |
|
|
|
|
type == CV_16UC1 ? (ippiMaskNormDiffFuncC1)ippiNormRel_Inf_16u_C1MR : |
|
|
|
|
type == CV_32FC1 ? (ippiMaskNormDiffFuncC1)ippiNormRel_Inf_32f_C1MR : |
|
|
|
|
0) : |
|
|
|
|
normType == NORM_L1 ? |
|
|
|
|
(type == CV_8UC1 ? (ippiMaskNormRelFuncC1)ippiNormRel_L1_8u_C1MR : |
|
|
|
|
#if IPP_VERSION_X100 < 900 |
|
|
|
|
#ifndef __APPLE__ |
|
|
|
|
type == CV_8SC1 ? (ippiMaskNormRelFuncC1)ippiNormRel_L1_8s_C1MR : |
|
|
|
|
#endif |
|
|
|
|
#endif |
|
|
|
|
type == CV_16UC1 ? (ippiMaskNormRelFuncC1)ippiNormRel_L1_16u_C1MR : |
|
|
|
|
type == CV_32FC1 ? (ippiMaskNormRelFuncC1)ippiNormRel_L1_32f_C1MR : |
|
|
|
|
(type == CV_8UC1 ? (ippiMaskNormDiffFuncC1)ippiNormRel_L1_8u_C1MR : |
|
|
|
|
type == CV_16UC1 ? (ippiMaskNormDiffFuncC1)ippiNormRel_L1_16u_C1MR : |
|
|
|
|
type == CV_32FC1 ? (ippiMaskNormDiffFuncC1)ippiNormRel_L1_32f_C1MR : |
|
|
|
|
0) : |
|
|
|
|
normType == NORM_L2 || normType == NORM_L2SQR ? |
|
|
|
|
(type == CV_8UC1 ? (ippiMaskNormRelFuncC1)ippiNormRel_L2_8u_C1MR : |
|
|
|
|
#if IPP_VERSION_X100 < 900 |
|
|
|
|
type == CV_8SC1 ? (ippiMaskNormRelFuncC1)ippiNormRel_L2_8s_C1MR : |
|
|
|
|
#endif |
|
|
|
|
type == CV_16UC1 ? (ippiMaskNormRelFuncC1)ippiNormRel_L2_16u_C1MR : |
|
|
|
|
type == CV_32FC1 ? (ippiMaskNormRelFuncC1)ippiNormRel_L2_32f_C1MR : |
|
|
|
|
(type == CV_8UC1 ? (ippiMaskNormDiffFuncC1)ippiNormRel_L2_8u_C1MR : |
|
|
|
|
type == CV_16UC1 ? (ippiMaskNormDiffFuncC1)ippiNormRel_L2_16u_C1MR : |
|
|
|
|
type == CV_32FC1 ? (ippiMaskNormDiffFuncC1)ippiNormRel_L2_32f_C1MR : |
|
|
|
|
0) : 0; |
|
|
|
|
if( ippiNormDiff_C1MR ) |
|
|
|
|
if( ippiNormRel_C1MR ) |
|
|
|
|
{ |
|
|
|
|
Ipp64f norm; |
|
|
|
|
if( CV_INSTRUMENT_FUN_IPP(ippiNormDiff_C1MR, src1.ptr(), (int)src1.step[0], src2.ptr(), (int)src2.step[0], mask.ptr(), (int)mask.step[0], sz, &norm) >= 0 ) |
|
|
|
|
if( CV_INSTRUMENT_FUN_IPP(ippiNormRel_C1MR, src1.ptr(), (int)src1.step[0], src2.ptr(), (int)src2.step[0], mask.ptr(), (int)mask.step[0], sz, &norm) >= 0 ) |
|
|
|
|
{ |
|
|
|
|
result = (normType == NORM_L2SQR ? (double)(norm * norm) : (double)norm); |
|
|
|
|
return true; |
|
|
|
@ -3303,47 +3417,43 @@ static bool ipp_norm(InputArray _src1, InputArray _src2, int normType, InputArra |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
typedef IppStatus (CV_STDCALL* ippiNormRelFuncNoHint)(const void *, int, const void *, int, IppiSize, Ipp64f *); |
|
|
|
|
IppiSize sz = { cols*src1.channels(), rows }; |
|
|
|
|
int type = src1.depth(); |
|
|
|
|
|
|
|
|
|
typedef IppStatus (CV_STDCALL* ippiNormRelFuncHint)(const void *, int, const void *, int, IppiSize, Ipp64f *, IppHintAlgorithm hint); |
|
|
|
|
ippiNormRelFuncNoHint ippiNormDiff = |
|
|
|
|
normType == NORM_INF ? |
|
|
|
|
(type == CV_8UC1 ? (ippiNormRelFuncNoHint)ippiNormRel_Inf_8u_C1R : |
|
|
|
|
type == CV_16UC1 ? (ippiNormRelFuncNoHint)ippiNormRel_Inf_16u_C1R : |
|
|
|
|
type == CV_16SC1 ? (ippiNormRelFuncNoHint)ippiNormRel_Inf_16s_C1R : |
|
|
|
|
type == CV_32FC1 ? (ippiNormRelFuncNoHint)ippiNormRel_Inf_32f_C1R : |
|
|
|
|
0) : |
|
|
|
|
typedef IppStatus (CV_STDCALL* ippiNormRelFuncNoHint)(const void *, int, const void *, int, IppiSize, Ipp64f *); |
|
|
|
|
ippiNormRelFuncHint ippiNormRelHint = |
|
|
|
|
normType == NORM_L1 ? |
|
|
|
|
(type == CV_8UC1 ? (ippiNormRelFuncNoHint)ippiNormRel_L1_8u_C1R : |
|
|
|
|
type == CV_16UC1 ? (ippiNormRelFuncNoHint)ippiNormRel_L1_16u_C1R : |
|
|
|
|
type == CV_16SC1 ? (ippiNormRelFuncNoHint)ippiNormRel_L1_16s_C1R : |
|
|
|
|
(type == CV_32F ? (ippiNormRelFuncHint)ippiNormRel_L1_32f_C1R : |
|
|
|
|
0) : |
|
|
|
|
normType == NORM_L2 || normType == NORM_L2SQR ? |
|
|
|
|
(type == CV_8UC1 ? (ippiNormRelFuncNoHint)ippiNormRel_L2_8u_C1R : |
|
|
|
|
type == CV_16UC1 ? (ippiNormRelFuncNoHint)ippiNormRel_L2_16u_C1R : |
|
|
|
|
type == CV_16SC1 ? (ippiNormRelFuncNoHint)ippiNormRel_L2_16s_C1R : |
|
|
|
|
(type == CV_32F ? (ippiNormRelFuncHint)ippiNormRel_L2_32f_C1R : |
|
|
|
|
0) : 0; |
|
|
|
|
ippiNormRelFuncHint ippiNormDiffHint = |
|
|
|
|
ippiNormRelFuncNoHint ippiNormRel = |
|
|
|
|
normType == NORM_INF ? |
|
|
|
|
(type == CV_8U ? (ippiNormRelFuncNoHint)ippiNormRel_Inf_8u_C1R : |
|
|
|
|
type == CV_16U ? (ippiNormRelFuncNoHint)ippiNormRel_Inf_16u_C1R : |
|
|
|
|
type == CV_16S ? (ippiNormRelFuncNoHint)ippiNormRel_Inf_16s_C1R : |
|
|
|
|
type == CV_32F ? (ippiNormRelFuncNoHint)ippiNormRel_Inf_32f_C1R : |
|
|
|
|
0) : |
|
|
|
|
normType == NORM_L1 ? |
|
|
|
|
(type == CV_32FC1 ? (ippiNormRelFuncHint)ippiNormRel_L1_32f_C1R : |
|
|
|
|
(type == CV_8U ? (ippiNormRelFuncNoHint)ippiNormRel_L1_8u_C1R : |
|
|
|
|
type == CV_16U ? (ippiNormRelFuncNoHint)ippiNormRel_L1_16u_C1R : |
|
|
|
|
type == CV_16S ? (ippiNormRelFuncNoHint)ippiNormRel_L1_16s_C1R : |
|
|
|
|
0) : |
|
|
|
|
normType == NORM_L2 || normType == NORM_L2SQR ? |
|
|
|
|
(type == CV_32FC1 ? (ippiNormRelFuncHint)ippiNormRel_L2_32f_C1R : |
|
|
|
|
(type == CV_8U ? (ippiNormRelFuncNoHint)ippiNormRel_L2_8u_C1R : |
|
|
|
|
type == CV_16U ? (ippiNormRelFuncNoHint)ippiNormRel_L2_16u_C1R : |
|
|
|
|
type == CV_16S ? (ippiNormRelFuncNoHint)ippiNormRel_L2_16s_C1R : |
|
|
|
|
0) : 0; |
|
|
|
|
if (ippiNormDiff) |
|
|
|
|
{ |
|
|
|
|
Ipp64f norm; |
|
|
|
|
if( CV_INSTRUMENT_FUN_IPP(ippiNormDiff, src1.ptr(), (int)src1.step[0], src2.ptr(), (int)src2.step[0], sz, &norm) >= 0 ) |
|
|
|
|
{ |
|
|
|
|
result = (double)norm; |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (ippiNormDiffHint) |
|
|
|
|
if( ippiNormRelHint || ippiNormRel ) |
|
|
|
|
{ |
|
|
|
|
Ipp64f norm; |
|
|
|
|
if( CV_INSTRUMENT_FUN_IPP(ippiNormDiffHint, src1.ptr(), (int)src1.step[0], src2.ptr(), (int)src2.step[0], sz, &norm, ippAlgHintAccurate) >= 0 ) |
|
|
|
|
IppStatus ret = ippiNormRelHint ? CV_INSTRUMENT_FUN_IPP(ippiNormRelHint, src1.ptr(), (int)src1.step[0], src2.ptr(), (int)src2.step[0], sz, &norm, ippAlgHintAccurate) : |
|
|
|
|
CV_INSTRUMENT_FUN_IPP(ippiNormRel, src1.ptr(), (int)src1.step[0], src2.ptr(), (int)src2.step[0], sz, &norm); |
|
|
|
|
if( ret >= 0 ) |
|
|
|
|
{ |
|
|
|
|
result = (double)norm; |
|
|
|
|
result = (normType == NORM_L2SQR) ? norm * norm : norm; |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -3352,47 +3462,32 @@ static bool ipp_norm(InputArray _src1, InputArray _src2, int normType, InputArra |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
normType &= 7; |
|
|
|
|
CV_Assert( normType == NORM_INF || normType == NORM_L1 || |
|
|
|
|
normType == NORM_L2 || normType == NORM_L2SQR || |
|
|
|
|
((normType == NORM_HAMMING || normType == NORM_HAMMING2) && src1.type() == CV_8U) ); |
|
|
|
|
normType &= NORM_TYPE_MASK; |
|
|
|
|
|
|
|
|
|
size_t total_size = src1.total(); |
|
|
|
|
int rows = src1.size[0], cols = rows ? (int)(total_size/rows) : 0; |
|
|
|
|
if( (src1.dims == 2 || (src1.isContinuous() && src2.isContinuous() && mask.isContinuous())) |
|
|
|
|
&& cols > 0 && (size_t)rows*cols == total_size |
|
|
|
|
&& (normType == NORM_INF || normType == NORM_L1 || |
|
|
|
|
normType == NORM_L2 || normType == NORM_L2SQR) ) |
|
|
|
|
&& cols > 0 && (size_t)rows*cols == total_size ) |
|
|
|
|
{ |
|
|
|
|
IppiSize sz = { cols, rows }; |
|
|
|
|
int type = src1.type(); |
|
|
|
|
if( !mask.empty() ) |
|
|
|
|
{ |
|
|
|
|
IppiSize sz = { cols, rows }; |
|
|
|
|
int type = src1.type(); |
|
|
|
|
|
|
|
|
|
typedef IppStatus (CV_STDCALL* ippiMaskNormDiffFuncC1)(const void *, int, const void *, int, const void *, int, IppiSize, Ipp64f *); |
|
|
|
|
ippiMaskNormDiffFuncC1 ippiNormDiff_C1MR = |
|
|
|
|
normType == NORM_INF ? |
|
|
|
|
(type == CV_8UC1 ? (ippiMaskNormDiffFuncC1)ippiNormDiff_Inf_8u_C1MR : |
|
|
|
|
#if IPP_VERSION_X100 < 900 |
|
|
|
|
type == CV_8SC1 ? (ippiMaskNormDiffFuncC1)ippiNormDiff_Inf_8s_C1MR : |
|
|
|
|
#endif |
|
|
|
|
type == CV_16UC1 ? (ippiMaskNormDiffFuncC1)ippiNormDiff_Inf_16u_C1MR : |
|
|
|
|
type == CV_32FC1 ? (ippiMaskNormDiffFuncC1)ippiNormDiff_Inf_32f_C1MR : |
|
|
|
|
0) : |
|
|
|
|
normType == NORM_L1 ? |
|
|
|
|
(type == CV_8UC1 ? (ippiMaskNormDiffFuncC1)ippiNormDiff_L1_8u_C1MR : |
|
|
|
|
#if IPP_VERSION_X100 < 900 |
|
|
|
|
#ifndef __APPLE__ |
|
|
|
|
type == CV_8SC1 ? (ippiMaskNormDiffFuncC1)ippiNormDiff_L1_8s_C1MR : |
|
|
|
|
#endif |
|
|
|
|
#endif |
|
|
|
|
type == CV_16UC1 ? (ippiMaskNormDiffFuncC1)ippiNormDiff_L1_16u_C1MR : |
|
|
|
|
type == CV_32FC1 ? (ippiMaskNormDiffFuncC1)ippiNormDiff_L1_32f_C1MR : |
|
|
|
|
0) : |
|
|
|
|
normType == NORM_L2 || normType == NORM_L2SQR ? |
|
|
|
|
(type == CV_8UC1 ? (ippiMaskNormDiffFuncC1)ippiNormDiff_L2_8u_C1MR : |
|
|
|
|
#if IPP_VERSION_X100 < 900 |
|
|
|
|
type == CV_8SC1 ? (ippiMaskNormDiffFuncC1)ippiNormDiff_L2_8s_C1MR : |
|
|
|
|
#endif |
|
|
|
|
type == CV_16UC1 ? (ippiMaskNormDiffFuncC1)ippiNormDiff_L2_16u_C1MR : |
|
|
|
|
type == CV_32FC1 ? (ippiMaskNormDiffFuncC1)ippiNormDiff_L2_32f_C1MR : |
|
|
|
|
0) : 0; |
|
|
|
@ -3405,30 +3500,20 @@ static bool ipp_norm(InputArray _src1, InputArray _src2, int normType, InputArra |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#ifndef __APPLE__ |
|
|
|
|
typedef IppStatus (CV_STDCALL* ippiMaskNormDiffFuncC3)(const void *, int, const void *, int, const void *, int, IppiSize, int, Ipp64f *); |
|
|
|
|
ippiMaskNormDiffFuncC3 ippiNormDiff_C3CMR = |
|
|
|
|
normType == NORM_INF ? |
|
|
|
|
(type == CV_8UC3 ? (ippiMaskNormDiffFuncC3)ippiNormDiff_Inf_8u_C3CMR : |
|
|
|
|
#if IPP_VERSION_X100 < 900 |
|
|
|
|
type == CV_8SC3 ? (ippiMaskNormDiffFuncC3)ippiNormDiff_Inf_8s_C3CMR : |
|
|
|
|
#endif |
|
|
|
|
type == CV_16UC3 ? (ippiMaskNormDiffFuncC3)ippiNormDiff_Inf_16u_C3CMR : |
|
|
|
|
type == CV_32FC3 ? (ippiMaskNormDiffFuncC3)ippiNormDiff_Inf_32f_C3CMR : |
|
|
|
|
0) : |
|
|
|
|
normType == NORM_L1 ? |
|
|
|
|
(type == CV_8UC3 ? (ippiMaskNormDiffFuncC3)ippiNormDiff_L1_8u_C3CMR : |
|
|
|
|
#if IPP_VERSION_X100 < 900 |
|
|
|
|
type == CV_8SC3 ? (ippiMaskNormDiffFuncC3)ippiNormDiff_L1_8s_C3CMR : |
|
|
|
|
#endif |
|
|
|
|
type == CV_16UC3 ? (ippiMaskNormDiffFuncC3)ippiNormDiff_L1_16u_C3CMR : |
|
|
|
|
type == CV_32FC3 ? (ippiMaskNormDiffFuncC3)ippiNormDiff_L1_32f_C3CMR : |
|
|
|
|
0) : |
|
|
|
|
normType == NORM_L2 || normType == NORM_L2SQR ? |
|
|
|
|
(type == CV_8UC3 ? (ippiMaskNormDiffFuncC3)ippiNormDiff_L2_8u_C3CMR : |
|
|
|
|
#if IPP_VERSION_X100 < 900 |
|
|
|
|
type == CV_8SC3 ? (ippiMaskNormDiffFuncC3)ippiNormDiff_L2_8s_C3CMR : |
|
|
|
|
#endif |
|
|
|
|
type == CV_16UC3 ? (ippiMaskNormDiffFuncC3)ippiNormDiff_L2_16u_C3CMR : |
|
|
|
|
type == CV_32FC3 ? (ippiMaskNormDiffFuncC3)ippiNormDiff_L2_32f_C3CMR : |
|
|
|
|
0) : 0; |
|
|
|
@ -3448,83 +3533,46 @@ static bool ipp_norm(InputArray _src1, InputArray _src2, int normType, InputArra |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
IppiSize sz = { cols*src1.channels(), rows }; |
|
|
|
|
int type = src1.depth(); |
|
|
|
|
|
|
|
|
|
typedef IppStatus (CV_STDCALL* ippiNormDiffFuncHint)(const void *, int, const void *, int, IppiSize, Ipp64f *, IppHintAlgorithm hint); |
|
|
|
|
typedef IppStatus (CV_STDCALL* ippiNormDiffFuncNoHint)(const void *, int, const void *, int, IppiSize, Ipp64f *); |
|
|
|
|
ippiNormDiffFuncHint ippiNormDiffHint = |
|
|
|
|
normType == NORM_L1 ? |
|
|
|
|
(type == CV_32FC1 ? (ippiNormDiffFuncHint)ippiNormDiff_L1_32f_C1R : |
|
|
|
|
type == CV_32FC3 ? (ippiNormDiffFuncHint)ippiNormDiff_L1_32f_C3R : |
|
|
|
|
type == CV_32FC4 ? (ippiNormDiffFuncHint)ippiNormDiff_L1_32f_C4R : |
|
|
|
|
(type == CV_32F ? (ippiNormDiffFuncHint)ippiNormDiff_L1_32f_C1R : |
|
|
|
|
0) : |
|
|
|
|
normType == NORM_L2 || normType == NORM_L2SQR ? |
|
|
|
|
(type == CV_32FC1 ? (ippiNormDiffFuncHint)ippiNormDiff_L2_32f_C1R : |
|
|
|
|
type == CV_32FC3 ? (ippiNormDiffFuncHint)ippiNormDiff_L2_32f_C3R : |
|
|
|
|
type == CV_32FC4 ? (ippiNormDiffFuncHint)ippiNormDiff_L2_32f_C4R : |
|
|
|
|
(type == CV_32F ? (ippiNormDiffFuncHint)ippiNormDiff_L2_32f_C1R : |
|
|
|
|
0) : 0; |
|
|
|
|
ippiNormDiffFuncNoHint ippiNormDiff = |
|
|
|
|
normType == NORM_INF ? |
|
|
|
|
(type == CV_8UC1 ? (ippiNormDiffFuncNoHint)ippiNormDiff_Inf_8u_C1R : |
|
|
|
|
type == CV_8UC3 ? (ippiNormDiffFuncNoHint)ippiNormDiff_Inf_8u_C3R : |
|
|
|
|
type == CV_8UC4 ? (ippiNormDiffFuncNoHint)ippiNormDiff_Inf_8u_C4R : |
|
|
|
|
type == CV_16UC1 ? (ippiNormDiffFuncNoHint)ippiNormDiff_Inf_16u_C1R : |
|
|
|
|
type == CV_16UC3 ? (ippiNormDiffFuncNoHint)ippiNormDiff_Inf_16u_C3R : |
|
|
|
|
type == CV_16UC4 ? (ippiNormDiffFuncNoHint)ippiNormDiff_Inf_16u_C4R : |
|
|
|
|
type == CV_16SC1 ? (ippiNormDiffFuncNoHint)ippiNormDiff_Inf_16s_C1R : |
|
|
|
|
#if (IPP_VERSION_X100 >= 810) |
|
|
|
|
type == CV_16SC3 ? (ippiNormDiffFuncNoHint)ippiNormDiff_Inf_16s_C3R : //Aug 2013: problem in IPP 7.1, 8.0 : -32768
|
|
|
|
|
type == CV_16SC4 ? (ippiNormDiffFuncNoHint)ippiNormDiff_Inf_16s_C4R : //Aug 2013: problem in IPP 7.1, 8.0 : -32768
|
|
|
|
|
#endif |
|
|
|
|
type == CV_32FC1 ? (ippiNormDiffFuncNoHint)ippiNormDiff_Inf_32f_C1R : |
|
|
|
|
type == CV_32FC3 ? (ippiNormDiffFuncNoHint)ippiNormDiff_Inf_32f_C3R : |
|
|
|
|
type == CV_32FC4 ? (ippiNormDiffFuncNoHint)ippiNormDiff_Inf_32f_C4R : |
|
|
|
|
(type == CV_8U ? (ippiNormDiffFuncNoHint)ippiNormDiff_Inf_8u_C1R : |
|
|
|
|
type == CV_16U ? (ippiNormDiffFuncNoHint)ippiNormDiff_Inf_16u_C1R : |
|
|
|
|
type == CV_16S ? (ippiNormDiffFuncNoHint)ippiNormDiff_Inf_16s_C1R : |
|
|
|
|
type == CV_32F ? (ippiNormDiffFuncNoHint)ippiNormDiff_Inf_32f_C1R : |
|
|
|
|
0) : |
|
|
|
|
normType == NORM_L1 ? |
|
|
|
|
(type == CV_8UC1 ? (ippiNormDiffFuncNoHint)ippiNormDiff_L1_8u_C1R : |
|
|
|
|
type == CV_8UC3 ? (ippiNormDiffFuncNoHint)ippiNormDiff_L1_8u_C3R : |
|
|
|
|
type == CV_8UC4 ? (ippiNormDiffFuncNoHint)ippiNormDiff_L1_8u_C4R : |
|
|
|
|
type == CV_16UC1 ? (ippiNormDiffFuncNoHint)ippiNormDiff_L1_16u_C1R : |
|
|
|
|
type == CV_16UC3 ? (ippiNormDiffFuncNoHint)ippiNormDiff_L1_16u_C3R : |
|
|
|
|
type == CV_16UC4 ? (ippiNormDiffFuncNoHint)ippiNormDiff_L1_16u_C4R : |
|
|
|
|
#if !(IPP_VERSION_X100 == 820 || IPP_VERSION_X100 == 821) // Oct 2014: Accuracy issue with IPP 8.2 / 8.2.1
|
|
|
|
|
type == CV_16SC1 ? (ippiNormDiffFuncNoHint)ippiNormDiff_L1_16s_C1R : |
|
|
|
|
#endif |
|
|
|
|
type == CV_16SC3 ? (ippiNormDiffFuncNoHint)ippiNormDiff_L1_16s_C3R : |
|
|
|
|
type == CV_16SC4 ? (ippiNormDiffFuncNoHint)ippiNormDiff_L1_16s_C4R : |
|
|
|
|
(type == CV_8U ? (ippiNormDiffFuncNoHint)ippiNormDiff_L1_8u_C1R : |
|
|
|
|
type == CV_16U ? (ippiNormDiffFuncNoHint)ippiNormDiff_L1_16u_C1R : |
|
|
|
|
type == CV_16S ? (ippiNormDiffFuncNoHint)ippiNormDiff_L1_16s_C1R : |
|
|
|
|
0) : |
|
|
|
|
normType == NORM_L2 || normType == NORM_L2SQR ? |
|
|
|
|
(type == CV_8UC1 ? (ippiNormDiffFuncNoHint)ippiNormDiff_L2_8u_C1R : |
|
|
|
|
type == CV_8UC3 ? (ippiNormDiffFuncNoHint)ippiNormDiff_L2_8u_C3R : |
|
|
|
|
type == CV_8UC4 ? (ippiNormDiffFuncNoHint)ippiNormDiff_L2_8u_C4R : |
|
|
|
|
type == CV_16UC1 ? (ippiNormDiffFuncNoHint)ippiNormDiff_L2_16u_C1R : |
|
|
|
|
type == CV_16UC3 ? (ippiNormDiffFuncNoHint)ippiNormDiff_L2_16u_C3R : |
|
|
|
|
type == CV_16UC4 ? (ippiNormDiffFuncNoHint)ippiNormDiff_L2_16u_C4R : |
|
|
|
|
type == CV_16SC1 ? (ippiNormDiffFuncNoHint)ippiNormDiff_L2_16s_C1R : |
|
|
|
|
type == CV_16SC3 ? (ippiNormDiffFuncNoHint)ippiNormDiff_L2_16s_C3R : |
|
|
|
|
type == CV_16SC4 ? (ippiNormDiffFuncNoHint)ippiNormDiff_L2_16s_C4R : |
|
|
|
|
(type == CV_8U ? (ippiNormDiffFuncNoHint)ippiNormDiff_L2_8u_C1R : |
|
|
|
|
type == CV_16U ? (ippiNormDiffFuncNoHint)ippiNormDiff_L2_16u_C1R : |
|
|
|
|
type == CV_16S ? (ippiNormDiffFuncNoHint)ippiNormDiff_L2_16s_C1R : |
|
|
|
|
0) : 0; |
|
|
|
|
// Make sure only zero or one version of the function pointer is valid
|
|
|
|
|
CV_Assert(!ippiNormDiffHint || !ippiNormDiff); |
|
|
|
|
if( ippiNormDiffHint || ippiNormDiff ) |
|
|
|
|
{ |
|
|
|
|
Ipp64f norm_array[4]; |
|
|
|
|
IppStatus ret = ippiNormDiffHint ? CV_INSTRUMENT_FUN_IPP(ippiNormDiffHint, src1.ptr(), (int)src1.step[0], src2.ptr(), (int)src2.step[0], sz, norm_array, ippAlgHintAccurate) : |
|
|
|
|
CV_INSTRUMENT_FUN_IPP(ippiNormDiff, src1.ptr(), (int)src1.step[0], src2.ptr(), (int)src2.step[0], sz, norm_array); |
|
|
|
|
Ipp64f norm; |
|
|
|
|
IppStatus ret = ippiNormDiffHint ? CV_INSTRUMENT_FUN_IPP(ippiNormDiffHint, src1.ptr(), (int)src1.step[0], src2.ptr(), (int)src2.step[0], sz, &norm, ippAlgHintAccurate) : |
|
|
|
|
CV_INSTRUMENT_FUN_IPP(ippiNormDiff, src1.ptr(), (int)src1.step[0], src2.ptr(), (int)src2.step[0], sz, &norm); |
|
|
|
|
if( ret >= 0 ) |
|
|
|
|
{ |
|
|
|
|
Ipp64f norm = (normType == NORM_L2 || normType == NORM_L2SQR) ? norm_array[0] * norm_array[0] : norm_array[0]; |
|
|
|
|
for( int i = 1; i < src1.channels(); i++ ) |
|
|
|
|
{ |
|
|
|
|
norm = |
|
|
|
|
normType == NORM_INF ? std::max(norm, norm_array[i]) : |
|
|
|
|
normType == NORM_L1 ? norm + norm_array[i] : |
|
|
|
|
normType == NORM_L2 || normType == NORM_L2SQR ? norm + norm_array[i] * norm_array[i] : |
|
|
|
|
0; |
|
|
|
|
} |
|
|
|
|
result = (normType == NORM_L2 ? (double)std::sqrt(norm) : (double)norm); |
|
|
|
|
result = (normType == NORM_L2SQR) ? norm * norm : norm; |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|