From baa6ab19671d93eea003ad0efa48b1512d9a81b2 Mon Sep 17 00:00:00 2001 From: vbystricky Date: Mon, 14 Apr 2014 15:47:50 +0400 Subject: [PATCH 1/9] Change Scharr filter to new ipp functions --- modules/imgproc/src/deriv.cpp | 384 ++++++++++++++++++++++------------ 1 file changed, 251 insertions(+), 133 deletions(-) diff --git a/modules/imgproc/src/deriv.cpp b/modules/imgproc/src/deriv.cpp index c6885d462..854ca73f2 100644 --- a/modules/imgproc/src/deriv.cpp +++ b/modules/imgproc/src/deriv.cpp @@ -187,9 +187,128 @@ cv::Ptr cv::createDerivFilter(int srcType, int dstType, namespace cv { - -static bool IPPDerivScharr(const Mat& src, Mat& dst, int ddepth, int dx, int dy, double scale) +#if (IPP_VERSION_X100 >= 801) +typedef IppStatus (CV_STDCALL* ippiFilterScharrMaskBorder)(const void* pSrc, int srcStep, void* pDst, int dstStep, IppiSize dstRoiSize, IppiMaskSize mask, IppiBorderType borderType, Ipp8u borderValue, Ipp8u* pBuffer); +static bool IPPDerivScharr(InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, double scale, double delta, int borderType) { + if ((0 > dx) || (0 > dy) || (1 != dx + dy)) + return false; + if (fabs(delta) > 0.0001) + return false; + + IppiBorderType ippiBorderType; + switch (borderType & (~BORDER_ISOLATED)) + { + case BORDER_REPLICATE: + ippiBorderType = (IppiBorderType)ippBorderRepl; + break; + case BORDER_REFLECT: + ippiBorderType = (IppiBorderType)ippBorderMirrorR; + break; + case BORDER_WRAP: + ippiBorderType = (IppiBorderType)ippBorderWrap; + break; + case BORDER_REFLECT_101: + ippiBorderType = (IppiBorderType)ippBorderMirror; + break; + default: + return false; + }; + + int stype = _src.type(), sdepth = CV_MAT_DEPTH(stype), cn = CV_MAT_CN(stype); + if (ddepth < 0) + ddepth = sdepth; + int dtype = CV_MAKETYPE(ddepth, cn); + + Mat src = _src.getMat(); + if (0 == (BORDER_ISOLATED & borderType)) + { + Size size; Point offset; + src.locateROI(size, offset); + if (0 < offset.x) + ippiBorderType = (IppiBorderType)(ippiBorderType | ippBorderInMemLeft); + if (0 < offset.y) + ippiBorderType = (IppiBorderType)(ippiBorderType | ippBorderInMemTop); + if (offset.x + src.cols < size.width) + ippiBorderType = (IppiBorderType)(ippiBorderType | ippBorderInMemRight); + if (offset.y + src.rows < size.height) + ippiBorderType = (IppiBorderType)(ippiBorderType | ippBorderInMemBottom); + } + + bool horz = (0 == dx) && (1 == dy); + IppiSize roiSize = {src.cols, src.rows}; + + IppStatus sts = ippStsErr; + int bufferSize = 0; + ippiFilterScharrMaskBorder func = NULL; + if ((CV_8U == stype) && (CV_16S == dtype)) + { + if (horz) + { + sts = ippiFilterScharrHorizMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp8u, ipp16s, 1, &bufferSize); + func = (ippiFilterScharrMaskBorder)ippiFilterScharrHorizMaskBorder_8u16s_C1R; + } + else + { + sts = ippiFilterScharrVertMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp8u, ipp16s, 1, &bufferSize); + func = (ippiFilterScharrMaskBorder)ippiFilterScharrVertMaskBorder_8u16s_C1R; + } + } + else if ((CV_16S == stype) && (CV_16S == dtype)) + { + if (horz) + { + sts = ippiFilterScharrHorizMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp16s, ipp16s, 1, &bufferSize); + func = (ippiFilterScharrMaskBorder)ippiFilterScharrHorizMaskBorder_16s_C1R; + } + else + { + sts = ippiFilterScharrVertMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp16s, ipp16s, 1, &bufferSize); + func = (ippiFilterScharrMaskBorder)ippiFilterScharrVertMaskBorder_16s_C1R; + } + } + else if ((CV_32F == stype) && (CV_32F == dtype)) + { + if (horz) + { + sts = ippiFilterScharrHorizMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp32f, ipp32f, 1, &bufferSize); + func = (ippiFilterScharrMaskBorder)ippiFilterScharrHorizMaskBorder_32f_C1R; + } + else + { + sts = ippiFilterScharrVertMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp32f, ipp32f, 1, &bufferSize); + func = (ippiFilterScharrMaskBorder)ippiFilterScharrVertMaskBorder_32f_C1R; + } + } + if ((sts < 0) || (NULL == func)) + return false; + + Ipp8u *pBuffer = ippsMalloc_8u(bufferSize); + if (NULL == pBuffer) + return false; + + _dst.create( _src.size(), dtype); + Mat dst = _dst.getMat(); + sts = func(src.data, (int)src.step, dst.data, (int)dst.step, roiSize, ippMskSize3x3, ippiBorderType, 0, pBuffer); + ippsFree(pBuffer); + if (0 > sts) + return false; + if ((CV_32F == dtype) && (0.0001 < fabs(scale - 1.0))) + ippiMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, roiSize); + return true; +} +#elif (IPP_VERSION_MAJOR >= 7) +static bool IPPDerivScharr(InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, double scale, double delta, int borderType) +{ + if (BORDER_REPLICATE != IppiBorderType) + return false; + if ((0 > dx) || (0 > dy) || (1 != dx + dy)) + return false; + if (fabs(delta) > 0.0001) + return false; + + Mat src = _src.getMat(), dst = _dst.getMat(); + int bufSize = 0; cv::AutoBuffer buffer; IppiSize roi = ippiSize(src.cols, src.rows); @@ -285,142 +404,143 @@ static bool IPPDerivScharr(const Mat& src, Mat& dst, int ddepth, int dx, int dy, return false; } } +#endif - -static bool IPPDeriv(const Mat& src, Mat& dst, int ddepth, int dx, int dy, int ksize, double scale) +static bool IPPDeriv(InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, int ksize, double scale, double delta) { - int stype = src.type(), dtype = dst.type(), bufSize = 0; + if (ksize != 3 || ksize != 5) + return false; + if (fabs(delta) > 0.0001) + return false; + + int bufSize = 0; cv::AutoBuffer buffer; - if (ksize == 3 || ksize == 5) + Mat src = _src.getMat(), dst = _dst.getMat(); + if ( ddepth < 0 ) + ddepth = src.depth(); + + if (src.type() == CV_8U && dst.type() == CV_16S && scale == 1) { - if (stype == CV_8UC1 && dtype == CV_16SC1 && scale == 1) + if ((dx == 1) && (dy == 0)) { - if (dx == 1 && dy == 0) - { - if (0 > ippiFilterSobelNegVertGetBufferSize_8u16s_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) - return false; - buffer.allocate(bufSize); + if (0 > ippiFilterSobelNegVertGetBufferSize_8u16s_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) + return false; + buffer.allocate(bufSize); - return 0 <= ippiFilterSobelNegVertBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, - (Ipp16s*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), - ippBorderRepl, 0, (Ipp8u*)(char*)buffer); - } - - if (dx == 0 && dy == 1) - { - if (0 > ippiFilterSobelHorizGetBufferSize_8u16s_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) - return false; - buffer.allocate(bufSize); - - return 0 <= ippiFilterSobelHorizBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, - (Ipp16s*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), - ippBorderRepl, 0, (Ipp8u*)(char*)buffer); - } - - if (dx == 2 && dy == 0) - { - if (0 > ippiFilterSobelVertSecondGetBufferSize_8u16s_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) - return false; - buffer.allocate(bufSize); - - return 0 <= ippiFilterSobelVertSecondBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, - (Ipp16s*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), - ippBorderRepl, 0, (Ipp8u*)(char*)buffer); - } - - if (dx == 0 && dy == 2) - { - if (0 > ippiFilterSobelHorizSecondGetBufferSize_8u16s_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) - return false; - buffer.allocate(bufSize); - - return 0 <= ippiFilterSobelHorizSecondBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, - (Ipp16s*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), - ippBorderRepl, 0, (Ipp8u*)(char*)buffer); - } + return (0 <= ippiFilterSobelNegVertBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, + (Ipp16s*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), + ippBorderRepl, 0, (Ipp8u*)(char*)buffer)); } - if (stype == CV_32FC1 && dtype == CV_32FC1) + if ((dx == 0) && (dy == 1)) { -#if defined(HAVE_IPP_ICV_ONLY) // N/A: ippiMulC_32f_C1R - return false; -#else -#if 0 - if (dx == 1 && dy == 0) - { - if (0 > ippiFilterSobelNegVertGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), &bufSize)) - return false; - buffer.allocate(bufSize); + if (0 > ippiFilterSobelHorizGetBufferSize_8u16s_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) + return false; + buffer.allocate(bufSize); - if (0 > ippiFilterSobelNegVertBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step, - (Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), - ippBorderRepl, 0, (Ipp8u*)(char*)buffer)) - { - return false; - } - if(scale != 1) - ippiMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows)); - return true; - } + return (0 <= ippiFilterSobelHorizBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, + (Ipp16s*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), + ippBorderRepl, 0, (Ipp8u*)(char*)buffer)); + } - if (dx == 0 && dy == 1) - { - if (0 > ippiFilterSobelHorizGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) - return false; - buffer.allocate(bufSize); + if ((dx == 2) && (dy == 0)) + { + if (0 > ippiFilterSobelVertSecondGetBufferSize_8u16s_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) + return false; + buffer.allocate(bufSize); - if (0 > ippiFilterSobelHorizBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step, - (Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), - ippBorderRepl, 0, (Ipp8u*)(char*)buffer)) - { - return false; - } - if(scale != 1) - ippiMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows)); - return true; - } -#endif + return (0 <= ippiFilterSobelVertSecondBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, + (Ipp16s*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), + ippBorderRepl, 0, (Ipp8u*)(char*)buffer)); + } - if(dx == 2 && dy == 0) - { - if (0 > ippiFilterSobelVertSecondGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) - return false; - buffer.allocate(bufSize); + if ((dx == 0) && (dy == 2)) + { + if (0 > ippiFilterSobelHorizSecondGetBufferSize_8u16s_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) + return false; + buffer.allocate(bufSize); - if (0 > ippiFilterSobelVertSecondBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step, - (Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), - ippBorderRepl, 0, (Ipp8u*)(char*)buffer)) - { - return false; - } - if(scale != 1) - ippiMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows)); - return true; - } - - if(dx == 0 && dy == 2) - { - if (0 > ippiFilterSobelHorizSecondGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) - return false; - buffer.allocate(bufSize); - - if (0 > ippiFilterSobelHorizSecondBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step, - (Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), - ippBorderRepl, 0, (Ipp8u*)(char*)buffer)) - { - return false; - } - - if(scale != 1) - ippiMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows)); - return true; - } -#endif + return (0 <= ippiFilterSobelHorizSecondBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, + (Ipp16s*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), + ippBorderRepl, 0, (Ipp8u*)(char*)buffer)); } } - if (ksize <= 0) - return IPPDerivScharr(src, dst, ddepth, dx, dy, scale); + if (src.type() == CV_32F && dst.type() == CV_32F) + { +#if defined(HAVE_IPP_ICV_ONLY) // N/A: ippiMulC_32f_C1R + return false; +#else +#if 0 + if ((dx == 1) && (dy == 0)) + { + if (0 > ippiFilterSobelNegVertGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), &bufSize)) + return false; + buffer.allocate(bufSize); + + if (0 > ippiFilterSobelNegVertBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step, + (Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), + ippBorderRepl, 0, (Ipp8u*)(char*)buffer)) + { + return false; + } + if(scale != 1) + ippiMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows)); + return true; + } + + if ((dx == 0) && (dy == 1)) + { + if (0 > ippiFilterSobelHorizGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) + return false; + buffer.allocate(bufSize); + if (0 > ippiFilterSobelHorizBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step, + (Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), + ippBorderRepl, 0, (Ipp8u*)(char*)buffer)) + { + return false; + } + if(scale != 1) + ippiMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows)); + return true; + } +#endif + if((dx == 2) && (dy == 0)) + { + if (0 > ippiFilterSobelVertSecondGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) + return false; + buffer.allocate(bufSize); + + if (0 > ippiFilterSobelVertSecondBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step, + (Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), + ippBorderRepl, 0, (Ipp8u*)(char*)buffer)) + { + return false; + } + if(scale != 1) + ippiMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows)); + return true; + } + + if((dx == 0) && (dy == 2)) + { + if (0 > ippiFilterSobelHorizSecondGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) + return false; + buffer.allocate(bufSize); + + if (0 > ippiFilterSobelHorizSecondBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step, + (Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), + ippBorderRepl, 0, (Ipp8u*)(char*)buffer)) + { + return false; + } + + if(scale != 1) + ippiMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows)); + return true; + } +#endif + } return false; } @@ -449,11 +569,14 @@ void cv::Sobel( InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, #endif #if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7) - if (dx < 3 && dy < 3 && cn == 1 && borderType == BORDER_REPLICATE && - ((stype == CV_8UC1 && dtype == CV_16SC1) || (stype == CV_32FC1 && dtype == CV_32FC1))) + if (ksize < 0) { - Mat src = _src.getMat(), dst = _dst.getMat(); - if (IPPDeriv(src, dst, ddepth, dx, dy, ksize,scale)) + if (IPPDerivScharr(_src, _dst, ddepth, dx, dy, scale, delta, borderType)) + return; + } + else if (0 < ksize && cn == 1 && borderType == BORDER_REPLICATE) + { + if (IPPDeriv(_src, _dst, ddepth, dx, dy, ksize, scale, delta)) return; } #endif @@ -493,14 +616,9 @@ void cv::Scharr( InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, #endif #if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7) - if(dx < 2 && dy < 2 && borderType == BORDER_REPLICATE && - ((stype == CV_8UC1 && dtype == CV_16SC1) || (stype == CV_32FC1 && dtype == CV_32FC1))) - { - Mat src = _src.getMat(), dst = _dst.getMat(); - if(IPPDerivScharr(src, dst, ddepth, dx, dy, scale)) - return; - setIppErrorStatus(); - } + if (IPPDerivScharr(_src, _dst, ddepth, dx, dy, scale, delta, borderType)) + return; + setIppErrorStatus(); #endif int ktype = std::max(CV_32F, std::max(ddepth, sdepth)); From 160c964e4b26d50072820c4d1dfa95e2aad52c99 Mon Sep 17 00:00:00 2001 From: vbystricky Date: Mon, 14 Apr 2014 17:05:17 +0400 Subject: [PATCH 2/9] Fix error --- modules/imgproc/src/deriv.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/imgproc/src/deriv.cpp b/modules/imgproc/src/deriv.cpp index 854ca73f2..d6afe1a73 100644 --- a/modules/imgproc/src/deriv.cpp +++ b/modules/imgproc/src/deriv.cpp @@ -408,7 +408,7 @@ static bool IPPDerivScharr(InputArray _src, OutputArray _dst, int ddepth, int dx static bool IPPDeriv(InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, int ksize, double scale, double delta) { - if (ksize != 3 || ksize != 5) + if (ksize != 3 && ksize != 5) return false; if (fabs(delta) > 0.0001) return false; From 79384beb60e991e2ef183ec683932c4c288807e7 Mon Sep 17 00:00:00 2001 From: vbystricky Date: Tue, 15 Apr 2014 10:00:08 +0400 Subject: [PATCH 3/9] Fix warning --- modules/imgproc/src/deriv.cpp | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/modules/imgproc/src/deriv.cpp b/modules/imgproc/src/deriv.cpp index d6afe1a73..c5acfcedb 100644 --- a/modules/imgproc/src/deriv.cpp +++ b/modules/imgproc/src/deriv.cpp @@ -193,27 +193,15 @@ static bool IPPDerivScharr(InputArray _src, OutputArray _dst, int ddepth, int dx { if ((0 > dx) || (0 > dy) || (1 != dx + dy)) return false; - if (fabs(delta) > 0.0001) + if (fabs(delta) > FLT_EPSILON) return false; - IppiBorderType ippiBorderType; - switch (borderType & (~BORDER_ISOLATED)) - { - case BORDER_REPLICATE: - ippiBorderType = (IppiBorderType)ippBorderRepl; - break; - case BORDER_REFLECT: - ippiBorderType = (IppiBorderType)ippBorderMirrorR; - break; - case BORDER_WRAP: - ippiBorderType = (IppiBorderType)ippBorderWrap; - break; - case BORDER_REFLECT_101: - ippiBorderType = (IppiBorderType)ippBorderMirror; - break; - default: + IppiBorderType ippiBorderType = ippiGetBorderType(borderType & (~BORDER_ISOLATED)); + if ((ippBorderRepl != ippiBorderType) && + (ippBorderMirrorR != ippiBorderType) && + (ippBorderWrap != ippiBorderType) && + (ippBorderMirror != ippiBorderType)) return false; - }; int stype = _src.type(), sdepth = CV_MAT_DEPTH(stype), cn = CV_MAT_CN(stype); if (ddepth < 0) @@ -293,7 +281,7 @@ static bool IPPDerivScharr(InputArray _src, OutputArray _dst, int ddepth, int dx ippsFree(pBuffer); if (0 > sts) return false; - if ((CV_32F == dtype) && (0.0001 < fabs(scale - 1.0))) + if ((CV_32F == dtype) && (FLT_EPSILON < fabs(scale - 1.0))) ippiMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, roiSize); return true; } From 32394df42dad85ee77b70ef757d8a9992cbd413c Mon Sep 17 00:00:00 2001 From: vbystricky Date: Tue, 15 Apr 2014 13:08:02 +0400 Subject: [PATCH 4/9] Add constant border fix call ipp function --- modules/imgproc/src/deriv.cpp | 96 +++++++++++++++++++++-------------- 1 file changed, 57 insertions(+), 39 deletions(-) diff --git a/modules/imgproc/src/deriv.cpp b/modules/imgproc/src/deriv.cpp index c5acfcedb..40cba2dc5 100644 --- a/modules/imgproc/src/deriv.cpp +++ b/modules/imgproc/src/deriv.cpp @@ -188,7 +188,6 @@ cv::Ptr cv::createDerivFilter(int srcType, int dstType, namespace cv { #if (IPP_VERSION_X100 >= 801) -typedef IppStatus (CV_STDCALL* ippiFilterScharrMaskBorder)(const void* pSrc, int srcStep, void* pDst, int dstStep, IppiSize dstRoiSize, IppiMaskSize mask, IppiBorderType borderType, Ipp8u borderValue, Ipp8u* pBuffer); static bool IPPDerivScharr(InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, double scale, double delta, int borderType) { if ((0 > dx) || (0 > dy) || (1 != dx + dy)) @@ -197,10 +196,7 @@ static bool IPPDerivScharr(InputArray _src, OutputArray _dst, int ddepth, int dx return false; IppiBorderType ippiBorderType = ippiGetBorderType(borderType & (~BORDER_ISOLATED)); - if ((ippBorderRepl != ippiBorderType) && - (ippBorderMirrorR != ippiBorderType) && - (ippBorderWrap != ippiBorderType) && - (ippBorderMirror != ippiBorderType)) + if ((int)ippiBorderType < 0) return false; int stype = _src.type(), sdepth = CV_MAT_DEPTH(stype), cn = CV_MAT_CN(stype); @@ -226,64 +222,86 @@ static bool IPPDerivScharr(InputArray _src, OutputArray _dst, int ddepth, int dx bool horz = (0 == dx) && (1 == dy); IppiSize roiSize = {src.cols, src.rows}; - IppStatus sts = ippStsErr; - int bufferSize = 0; - ippiFilterScharrMaskBorder func = NULL; + _dst.create( _src.size(), dtype); + Mat dst = _dst.getMat(); if ((CV_8U == stype) && (CV_16S == dtype)) { + int bufferSize = 0; Ipp8u *pBuffer; IppStatus sts; if (horz) { - sts = ippiFilterScharrHorizMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp8u, ipp16s, 1, &bufferSize); - func = (ippiFilterScharrMaskBorder)ippiFilterScharrHorizMaskBorder_8u16s_C1R; + if (0 > ippiFilterScharrHorizMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp8u, ipp16s, 1, &bufferSize)) + return false; + pBuffer = ippsMalloc_8u(bufferSize); + if (NULL == pBuffer) + return false; + sts = ippiFilterScharrHorizMaskBorder_8u16s_C1R(src.data, (int)src.step, (Ipp16s *)dst.data, (int)dst.step, roiSize, ippMskSize3x3, ippiBorderType, 0, pBuffer); } else { - sts = ippiFilterScharrVertMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp8u, ipp16s, 1, &bufferSize); - func = (ippiFilterScharrMaskBorder)ippiFilterScharrVertMaskBorder_8u16s_C1R; + if (0 > ippiFilterScharrVertMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp8u, ipp16s, 1, &bufferSize)) + return false; + pBuffer = ippsMalloc_8u(bufferSize); + if (NULL == pBuffer) + return false; + sts = ippiFilterScharrVertMaskBorder_8u16s_C1R(src.data, (int)src.step, (Ipp16s *)dst.data, (int)dst.step, roiSize, ippMskSize3x3, ippiBorderType, 0, pBuffer); } + ippsFree(pBuffer); + return (0 <= sts); } else if ((CV_16S == stype) && (CV_16S == dtype)) { + int bufferSize = 0; Ipp8u *pBuffer; IppStatus sts; if (horz) { - sts = ippiFilterScharrHorizMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp16s, ipp16s, 1, &bufferSize); - func = (ippiFilterScharrMaskBorder)ippiFilterScharrHorizMaskBorder_16s_C1R; + if (0 > ippiFilterScharrHorizMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp16s, ipp16s, 1, &bufferSize)) + return false; + pBuffer = ippsMalloc_8u(bufferSize); + if (NULL == pBuffer) + return false; + sts = ippiFilterScharrHorizMaskBorder_16s_C1R((Ipp16s *)src.data, (int)src.step, (Ipp16s *)dst.data, (int)dst.step, roiSize, ippMskSize3x3, ippiBorderType, 0, pBuffer); } else { - sts = ippiFilterScharrVertMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp16s, ipp16s, 1, &bufferSize); - func = (ippiFilterScharrMaskBorder)ippiFilterScharrVertMaskBorder_16s_C1R; + if (0 > ippiFilterScharrVertMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp16s, ipp16s, 1, &bufferSize)) + return false; + pBuffer = ippsMalloc_8u(bufferSize); + if (NULL == pBuffer) + return false; + sts = ippiFilterScharrVertMaskBorder_16s_C1R((Ipp16s *)src.data, (int)src.step, (Ipp16s *)dst.data, (int)dst.step, roiSize, ippMskSize3x3, ippiBorderType, 0, pBuffer); } + ippsFree(pBuffer); + return (0 <= sts); } else if ((CV_32F == stype) && (CV_32F == dtype)) { + int bufferSize = 0; Ipp8u *pBuffer; IppStatus sts; if (horz) { - sts = ippiFilterScharrHorizMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp32f, ipp32f, 1, &bufferSize); - func = (ippiFilterScharrMaskBorder)ippiFilterScharrHorizMaskBorder_32f_C1R; + if (0 > ippiFilterScharrHorizMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp32f, ipp32f, 1, &bufferSize)) + return false; + pBuffer = ippsMalloc_8u(bufferSize); + if (NULL == pBuffer) + return false; + sts = ippiFilterScharrHorizMaskBorder_32f_C1R((Ipp32f *)src.data, (int)src.step, (Ipp32f *)dst.data, (int)dst.step, roiSize, ippMskSize3x3, ippiBorderType, 0, pBuffer); } else { - sts = ippiFilterScharrVertMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp32f, ipp32f, 1, &bufferSize); - func = (ippiFilterScharrMaskBorder)ippiFilterScharrVertMaskBorder_32f_C1R; + if (0 > ippiFilterScharrVertMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp32f, ipp32f, 1, &bufferSize)) + return false; + pBuffer = ippsMalloc_8u(bufferSize); + if (NULL == pBuffer) + return false; + sts = ippiFilterScharrVertMaskBorder_32f_C1R((Ipp32f *)src.data, (int)src.step, (Ipp32f *)dst.data, (int)dst.step, roiSize, ippMskSize3x3, ippiBorderType, 0, pBuffer); } + ippsFree(pBuffer); + if (sts < 0) + return false; + + if (FLT_EPSILON < fabs(scale - 1.0)) + ippiMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, roiSize); + return true; } - if ((sts < 0) || (NULL == func)) - return false; - - Ipp8u *pBuffer = ippsMalloc_8u(bufferSize); - if (NULL == pBuffer) - return false; - - _dst.create( _src.size(), dtype); - Mat dst = _dst.getMat(); - sts = func(src.data, (int)src.step, dst.data, (int)dst.step, roiSize, ippMskSize3x3, ippiBorderType, 0, pBuffer); - ippsFree(pBuffer); - if (0 > sts) - return false; - if ((CV_32F == dtype) && (FLT_EPSILON < fabs(scale - 1.0))) - ippiMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, roiSize); - return true; + return false; } #elif (IPP_VERSION_MAJOR >= 7) static bool IPPDerivScharr(InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, double scale, double delta, int borderType) @@ -394,11 +412,11 @@ static bool IPPDerivScharr(InputArray _src, OutputArray _dst, int ddepth, int dx } #endif -static bool IPPDeriv(InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, int ksize, double scale, double delta) +static bool IPPDerivSobel(InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, int ksize, double scale, double delta) { if (ksize != 3 && ksize != 5) return false; - if (fabs(delta) > 0.0001) + if (fabs(delta) > FLT_EPSILON) return false; int bufSize = 0; @@ -564,7 +582,7 @@ void cv::Sobel( InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, } else if (0 < ksize && cn == 1 && borderType == BORDER_REPLICATE) { - if (IPPDeriv(_src, _dst, ddepth, dx, dy, ksize, scale, delta)) + if (IPPDerivSobel(_src, _dst, ddepth, dx, dy, ksize, scale, delta)) return; } #endif From d17f40dc1fba3ff44e0bff6b93701bc5076dad85 Mon Sep 17 00:00:00 2001 From: vbystricky Date: Tue, 15 Apr 2014 16:20:18 +0400 Subject: [PATCH 5/9] Fix error in code --- modules/imgproc/src/deriv.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/imgproc/src/deriv.cpp b/modules/imgproc/src/deriv.cpp index 40cba2dc5..9d9eb4224 100644 --- a/modules/imgproc/src/deriv.cpp +++ b/modules/imgproc/src/deriv.cpp @@ -306,11 +306,11 @@ static bool IPPDerivScharr(InputArray _src, OutputArray _dst, int ddepth, int dx #elif (IPP_VERSION_MAJOR >= 7) static bool IPPDerivScharr(InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, double scale, double delta, int borderType) { - if (BORDER_REPLICATE != IppiBorderType) + if (BORDER_REPLICATE != borderType) return false; if ((0 > dx) || (0 > dy) || (1 != dx + dy)) return false; - if (fabs(delta) > 0.0001) + if (fabs(delta) > FLT_EPSILON) return false; Mat src = _src.getMat(), dst = _dst.getMat(); From 650762419c8a7ec9a578473d6491e0d605b1ec73 Mon Sep 17 00:00:00 2001 From: vbystricky Date: Fri, 18 Apr 2014 15:13:34 +0400 Subject: [PATCH 6/9] Add setIppErrorStatus() --- modules/imgproc/src/deriv.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/imgproc/src/deriv.cpp b/modules/imgproc/src/deriv.cpp index 9d9eb4224..f752fac25 100644 --- a/modules/imgproc/src/deriv.cpp +++ b/modules/imgproc/src/deriv.cpp @@ -412,12 +412,14 @@ static bool IPPDerivScharr(InputArray _src, OutputArray _dst, int ddepth, int dx } #endif -static bool IPPDerivSobel(InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, int ksize, double scale, double delta) +static bool IPPDerivSobel(InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, int ksize, double scale, double delta, int borderType) { - if (ksize != 3 && ksize != 5) + if ((borderType != BORDER_REPLICATE) || (3 != ksize) || (5 != ksize)) return false; if (fabs(delta) > FLT_EPSILON) return false; + if (1 != _src.channels()) + return false; int bufSize = 0; cv::AutoBuffer buffer; @@ -579,11 +581,13 @@ void cv::Sobel( InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, { if (IPPDerivScharr(_src, _dst, ddepth, dx, dy, scale, delta, borderType)) return; + setIppErrorStatus(); } - else if (0 < ksize && cn == 1 && borderType == BORDER_REPLICATE) + else if (0 < ksize) { - if (IPPDerivSobel(_src, _dst, ddepth, dx, dy, ksize, scale, delta)) + if (IPPDerivSobel(_src, _dst, ddepth, dx, dy, ksize, scale, delta, borderType)) return; + setIppErrorStatus(); } #endif int ktype = std::max(CV_32F, std::max(ddepth, sdepth)); From d97f7da7a959edbf32b3095e1e763463198bdcfb Mon Sep 17 00:00:00 2001 From: vbystricky Date: Mon, 21 Apr 2014 14:19:25 +0400 Subject: [PATCH 7/9] Fix setIppErrorStatus placement --- modules/imgproc/src/deriv.cpp | 101 +++++++++++++++++----------------- 1 file changed, 49 insertions(+), 52 deletions(-) diff --git a/modules/imgproc/src/deriv.cpp b/modules/imgproc/src/deriv.cpp index f752fac25..8dd7f4c36 100644 --- a/modules/imgproc/src/deriv.cpp +++ b/modules/imgproc/src/deriv.cpp @@ -185,6 +185,8 @@ cv::Ptr cv::createDerivFilter(int srcType, int dstType, #if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7) +#define IPP_RETURN_ERROR {setIppErrorStatus(); return false;} + namespace cv { #if (IPP_VERSION_X100 >= 801) @@ -224,84 +226,82 @@ static bool IPPDerivScharr(InputArray _src, OutputArray _dst, int ddepth, int dx _dst.create( _src.size(), dtype); Mat dst = _dst.getMat(); + IppStatus sts = ippStsErr; if ((CV_8U == stype) && (CV_16S == dtype)) { - int bufferSize = 0; Ipp8u *pBuffer; IppStatus sts; + int bufferSize = 0; Ipp8u *pBuffer; if (horz) { if (0 > ippiFilterScharrHorizMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp8u, ipp16s, 1, &bufferSize)) - return false; + IPP_RETURN_ERROR pBuffer = ippsMalloc_8u(bufferSize); if (NULL == pBuffer) - return false; + IPP_RETURN_ERROR sts = ippiFilterScharrHorizMaskBorder_8u16s_C1R(src.data, (int)src.step, (Ipp16s *)dst.data, (int)dst.step, roiSize, ippMskSize3x3, ippiBorderType, 0, pBuffer); } else { if (0 > ippiFilterScharrVertMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp8u, ipp16s, 1, &bufferSize)) - return false; + IPP_RETURN_ERROR pBuffer = ippsMalloc_8u(bufferSize); if (NULL == pBuffer) - return false; + IPP_RETURN_ERROR sts = ippiFilterScharrVertMaskBorder_8u16s_C1R(src.data, (int)src.step, (Ipp16s *)dst.data, (int)dst.step, roiSize, ippMskSize3x3, ippiBorderType, 0, pBuffer); } ippsFree(pBuffer); - return (0 <= sts); } else if ((CV_16S == stype) && (CV_16S == dtype)) { - int bufferSize = 0; Ipp8u *pBuffer; IppStatus sts; + int bufferSize = 0; Ipp8u *pBuffer; if (horz) { if (0 > ippiFilterScharrHorizMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp16s, ipp16s, 1, &bufferSize)) - return false; + IPP_RETURN_ERROR pBuffer = ippsMalloc_8u(bufferSize); if (NULL == pBuffer) - return false; + IPP_RETURN_ERROR sts = ippiFilterScharrHorizMaskBorder_16s_C1R((Ipp16s *)src.data, (int)src.step, (Ipp16s *)dst.data, (int)dst.step, roiSize, ippMskSize3x3, ippiBorderType, 0, pBuffer); } else { if (0 > ippiFilterScharrVertMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp16s, ipp16s, 1, &bufferSize)) - return false; + IPP_RETURN_ERROR pBuffer = ippsMalloc_8u(bufferSize); if (NULL == pBuffer) - return false; + IPP_RETURN_ERROR sts = ippiFilterScharrVertMaskBorder_16s_C1R((Ipp16s *)src.data, (int)src.step, (Ipp16s *)dst.data, (int)dst.step, roiSize, ippMskSize3x3, ippiBorderType, 0, pBuffer); } ippsFree(pBuffer); - return (0 <= sts); } else if ((CV_32F == stype) && (CV_32F == dtype)) { - int bufferSize = 0; Ipp8u *pBuffer; IppStatus sts; + int bufferSize = 0; Ipp8u *pBuffer; if (horz) { if (0 > ippiFilterScharrHorizMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp32f, ipp32f, 1, &bufferSize)) - return false; + IPP_RETURN_ERROR pBuffer = ippsMalloc_8u(bufferSize); if (NULL == pBuffer) - return false; + IPP_RETURN_ERROR sts = ippiFilterScharrHorizMaskBorder_32f_C1R((Ipp32f *)src.data, (int)src.step, (Ipp32f *)dst.data, (int)dst.step, roiSize, ippMskSize3x3, ippiBorderType, 0, pBuffer); } else { if (0 > ippiFilterScharrVertMaskBorderGetBufferSize(roiSize, ippMskSize3x3, ipp32f, ipp32f, 1, &bufferSize)) - return false; + IPP_RETURN_ERROR pBuffer = ippsMalloc_8u(bufferSize); if (NULL == pBuffer) - return false; + IPP_RETURN_ERROR sts = ippiFilterScharrVertMaskBorder_32f_C1R((Ipp32f *)src.data, (int)src.step, (Ipp32f *)dst.data, (int)dst.step, roiSize, ippMskSize3x3, ippiBorderType, 0, pBuffer); } ippsFree(pBuffer); if (sts < 0) - return false; + IPP_RETURN_ERROR; if (FLT_EPSILON < fabs(scale - 1.0)) - ippiMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, roiSize); - return true; + sts = ippiMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, roiSize); } - return false; + return (0 <= sts); } #elif (IPP_VERSION_MAJOR >= 7) static bool IPPDerivScharr(InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, double scale, double delta, int borderType) @@ -432,45 +432,53 @@ static bool IPPDerivSobel(InputArray _src, OutputArray _dst, int ddepth, int dx, if ((dx == 1) && (dy == 0)) { if (0 > ippiFilterSobelNegVertGetBufferSize_8u16s_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) - return false; + IPP_RETURN_ERROR buffer.allocate(bufSize); - return (0 <= ippiFilterSobelNegVertBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, + if (0 > ippiFilterSobelNegVertBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, (Ipp16s*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), - ippBorderRepl, 0, (Ipp8u*)(char*)buffer)); + ippBorderRepl, 0, (Ipp8u*)(char*)buffer)) + IPP_RETURN_ERROR + return true; } if ((dx == 0) && (dy == 1)) { if (0 > ippiFilterSobelHorizGetBufferSize_8u16s_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) - return false; + IPP_RETURN_ERROR buffer.allocate(bufSize); - return (0 <= ippiFilterSobelHorizBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, + if (0 > ippiFilterSobelHorizBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, (Ipp16s*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), - ippBorderRepl, 0, (Ipp8u*)(char*)buffer)); + ippBorderRepl, 0, (Ipp8u*)(char*)buffer)) + IPP_RETURN_ERROR + return true; } if ((dx == 2) && (dy == 0)) { if (0 > ippiFilterSobelVertSecondGetBufferSize_8u16s_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) - return false; + IPP_RETURN_ERROR buffer.allocate(bufSize); - return (0 <= ippiFilterSobelVertSecondBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, + if (0 > ippiFilterSobelVertSecondBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, (Ipp16s*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), - ippBorderRepl, 0, (Ipp8u*)(char*)buffer)); + ippBorderRepl, 0, (Ipp8u*)(char*)buffer)) + IPP_RETURN_ERROR + return true; } if ((dx == 0) && (dy == 2)) { if (0 > ippiFilterSobelHorizSecondGetBufferSize_8u16s_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) - return false; + IPP_RETURN_ERROR buffer.allocate(bufSize); - return (0 <= ippiFilterSobelHorizSecondBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, + if (0 > ippiFilterSobelHorizSecondBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, (Ipp16s*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), - ippBorderRepl, 0, (Ipp8u*)(char*)buffer)); + ippBorderRepl, 0, (Ipp8u*)(char*)buffer)) + IPP_RETURN_ERROR + return true; } } @@ -483,15 +491,13 @@ static bool IPPDerivSobel(InputArray _src, OutputArray _dst, int ddepth, int dx, if ((dx == 1) && (dy == 0)) { if (0 > ippiFilterSobelNegVertGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), &bufSize)) - return false; + IPP_RETURN_ERROR buffer.allocate(bufSize); if (0 > ippiFilterSobelNegVertBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step, (Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), ippBorderRepl, 0, (Ipp8u*)(char*)buffer)) - { - return false; - } + IPP_RETURN_ERROR if(scale != 1) ippiMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows)); return true; @@ -500,14 +506,12 @@ static bool IPPDerivSobel(InputArray _src, OutputArray _dst, int ddepth, int dx, if ((dx == 0) && (dy == 1)) { if (0 > ippiFilterSobelHorizGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) - return false; + IPP_RETURN_ERROR buffer.allocate(bufSize); if (0 > ippiFilterSobelHorizBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step, (Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), ippBorderRepl, 0, (Ipp8u*)(char*)buffer)) - { - return false; - } + IPP_RETURN_ERROR if(scale != 1) ippiMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows)); return true; @@ -516,15 +520,13 @@ static bool IPPDerivSobel(InputArray _src, OutputArray _dst, int ddepth, int dx, if((dx == 2) && (dy == 0)) { if (0 > ippiFilterSobelVertSecondGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) - return false; + IPP_RETURN_ERROR buffer.allocate(bufSize); if (0 > ippiFilterSobelVertSecondBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step, (Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), ippBorderRepl, 0, (Ipp8u*)(char*)buffer)) - { - return false; - } + IPP_RETURN_ERROR if(scale != 1) ippiMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows)); return true; @@ -533,15 +535,13 @@ static bool IPPDerivSobel(InputArray _src, OutputArray _dst, int ddepth, int dx, if((dx == 0) && (dy == 2)) { if (0 > ippiFilterSobelHorizSecondGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize)) - return false; + IPP_RETURN_ERROR buffer.allocate(bufSize); if (0 > ippiFilterSobelHorizSecondBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step, (Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), ippBorderRepl, 0, (Ipp8u*)(char*)buffer)) - { - return false; - } + IPP_RETURN_ERROR if(scale != 1) ippiMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows)); @@ -581,13 +581,11 @@ void cv::Sobel( InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, { if (IPPDerivScharr(_src, _dst, ddepth, dx, dy, scale, delta, borderType)) return; - setIppErrorStatus(); } else if (0 < ksize) { if (IPPDerivSobel(_src, _dst, ddepth, dx, dy, ksize, scale, delta, borderType)) return; - setIppErrorStatus(); } #endif int ktype = std::max(CV_32F, std::max(ddepth, sdepth)); @@ -628,7 +626,6 @@ void cv::Scharr( InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, #if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7) if (IPPDerivScharr(_src, _dst, ddepth, dx, dy, scale, delta, borderType)) return; - setIppErrorStatus(); #endif int ktype = std::max(CV_32F, std::max(ddepth, sdepth)); From f52126725f46f8c2232276f90c3edc814cc3f86d Mon Sep 17 00:00:00 2001 From: vbystricky Date: Mon, 21 Apr 2014 14:43:56 +0400 Subject: [PATCH 8/9] Disable scharr in icv only configuration --- modules/imgproc/src/deriv.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/imgproc/src/deriv.cpp b/modules/imgproc/src/deriv.cpp index 8dd7f4c36..e338e72d9 100644 --- a/modules/imgproc/src/deriv.cpp +++ b/modules/imgproc/src/deriv.cpp @@ -192,6 +192,9 @@ namespace cv #if (IPP_VERSION_X100 >= 801) static bool IPPDerivScharr(InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, double scale, double delta, int borderType) { +#if defined(HAVE_IPP_ICV_ONLY) + return false; +#else if ((0 > dx) || (0 > dy) || (1 != dx + dy)) return false; if (fabs(delta) > FLT_EPSILON) @@ -302,6 +305,7 @@ static bool IPPDerivScharr(InputArray _src, OutputArray _dst, int ddepth, int dx sts = ippiMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, roiSize); } return (0 <= sts); +#endif } #elif (IPP_VERSION_MAJOR >= 7) static bool IPPDerivScharr(InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, double scale, double delta, int borderType) From d9ef5bb5a72ff905c951551fcb4c3da3c521b62f Mon Sep 17 00:00:00 2001 From: vbystricky Date: Mon, 21 Apr 2014 15:02:38 +0400 Subject: [PATCH 9/9] Fix compile warnings --- modules/imgproc/src/deriv.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/imgproc/src/deriv.cpp b/modules/imgproc/src/deriv.cpp index e338e72d9..f232eb5d9 100644 --- a/modules/imgproc/src/deriv.cpp +++ b/modules/imgproc/src/deriv.cpp @@ -193,7 +193,8 @@ namespace cv static bool IPPDerivScharr(InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, double scale, double delta, int borderType) { #if defined(HAVE_IPP_ICV_ONLY) - return false; + _src; _dst; ddepth; dx; dy; scale; delta; borderType; + return false; #else if ((0 > dx) || (0 > dy) || (1 != dx + dy)) return false;