From ad7f2311c07143f1ac3e7af624874a8f7d042ab5 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Sat, 12 Apr 2014 15:40:26 +0400 Subject: [PATCH 1/2] cv::Laplacian --- modules/core/include/opencv2/core/private.hpp | 9 +++ modules/imgproc/src/deriv.cpp | 56 +++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/modules/core/include/opencv2/core/private.hpp b/modules/core/include/opencv2/core/private.hpp index 593ee9fd55..8857fa378f 100644 --- a/modules/core/include/opencv2/core/private.hpp +++ b/modules/core/include/opencv2/core/private.hpp @@ -230,6 +230,15 @@ static inline IppiSize ippiSize(const cv::Size & _size) return size; } +static inline IppiBorderType ippiGetBorderType(int borderTypeNI) +{ + return borderTypeNI == cv::BORDER_CONSTANT ? ippBorderConst : + borderTypeNI == cv::BORDER_WRAP ? ippBorderWrap : + borderTypeNI == cv::BORDER_REPLICATE ? ippBorderRepl : + borderTypeNI == cv::BORDER_REFLECT_101 ? ippBorderMirror : + borderTypeNI == cv::BORDER_REFLECT ? ippBorderMirrorR : (IppiBorderType)-1; +} + #else # define IPP_VERSION_X100 0 #endif diff --git a/modules/imgproc/src/deriv.cpp b/modules/imgproc/src/deriv.cpp index 1b3e2c417b..5d66318a89 100644 --- a/modules/imgproc/src/deriv.cpp +++ b/modules/imgproc/src/deriv.cpp @@ -577,6 +577,62 @@ void cv::Laplacian( InputArray _src, OutputArray _dst, int ddepth, int ksize, ddepth = sdepth; _dst.create( _src.size(), CV_MAKETYPE(ddepth, cn) ); +#if defined HAVE_IPP && !defined HAVE_IPP_ICV_ONLY + if ((ksize == 3 || ksize == 5) && ((borderType & BORDER_ISOLATED) != 0 || !_src.isSubmatrix()) && + ((stype == CV_8UC1 && ddepth == CV_16S) || (ddepth == CV_32F && stype == CV_32FC1))) + { + int iscale = saturate_cast(scale), idelta = saturate_cast(delta); + bool floatScale = std::fabs(scale - iscale) > DBL_EPSILON, needScale = iscale != 1; + bool floatDelta = std::fabs(delta - idelta) > DBL_EPSILON, needDelta = delta != 0; + int borderTypeNI = borderType & ~BORDER_ISOLATED; + Mat src = _src.getMat(), dst = _dst.getMat(); + + if (src.data != dst.data) + { + Ipp32s bufsize; + IppStatus status = (IppStatus)-1; + IppiSize roisize = { src.cols, src.rows }; + IppiMaskSize masksize = ksize == 3 ? ippMskSize3x3 : ippMskSize5x5; + IppiBorderType borderTypeIpp = ippiGetBorderType(borderTypeNI); + +#define IPP_FILTER_LAPLACIAN(ippsrctype, ippdsttype, ippfavor) \ + do \ + { \ + if (borderTypeIpp >= 0 && ippiFilterLaplacianGetBufferSize_##ippfavor##_C1R(roisize, masksize, &bufsize) >= 0) \ + { \ + Ipp8u * buffer = ippsMalloc_8u(bufsize); \ + status = ippiFilterLaplacianBorder_##ippfavor##_C1R((const ippsrctype *)src.data, (int)src.step, (ippdsttype *)dst.data, \ + (int)dst.step, roisize, masksize, borderTypeIpp, 0, buffer); \ + ippsFree(buffer); \ + } \ + } while ((void)0, 0) + + if (sdepth == CV_8U && ddepth == CV_16S && !floatScale && !floatDelta) + { + IPP_FILTER_LAPLACIAN(Ipp8u, Ipp16s, 8u16s); + + if (needScale && status >= 0) + status = ippiMulC_16s_C1IRSfs((Ipp16s)iscale, (Ipp16s *)dst.data, (int)dst.step, roisize, 0); + if (needDelta && status >= 0) + status = ippiAddC_16s_C1IRSfs((Ipp16s)idelta, (Ipp16s *)dst.data, (int)dst.step, roisize, 0); + } + else if (sdepth == CV_32F && ddepth == CV_32F) + { + IPP_FILTER_LAPLACIAN(Ipp32f, Ipp32f, 32f); + + if (needScale && status >= 0) + status = ippiMulC_32f_C1IR((Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, roisize); + if (needDelta && status >= 0) + status = ippiAddC_32f_C1IR((Ipp32f)delta, (Ipp32f *)dst.data, (int)dst.step, roisize); + } + + if (status >= 0) + return; + } + } +#undef IPP_FILTER_LAPLACIAN +#endif + #ifdef HAVE_TEGRA_OPTIMIZATION if (scale == 1.0 && delta == 0) { From 884b706b3ac5a2a2c5a2c4281b0c5f836e4da788 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Mon, 14 Apr 2014 14:39:46 +0400 Subject: [PATCH 2/2] fixed warning --- modules/core/src/stat.cpp | 2 +- modules/imgproc/perf/opencl/perf_filters.cpp | 2 +- modules/imgproc/src/deriv.cpp | 2 ++ modules/imgproc/src/filter.cpp | 8 ++++---- modules/imgproc/src/histogram.cpp | 2 +- modules/imgproc/src/moments.cpp | 2 ++ 6 files changed, 11 insertions(+), 7 deletions(-) diff --git a/modules/core/src/stat.cpp b/modules/core/src/stat.cpp index 6d590f9075..88dad4e35d 100644 --- a/modules/core/src/stat.cpp +++ b/modules/core/src/stat.cpp @@ -696,7 +696,7 @@ int cv::countNonZero( InputArray _src ) if (src.dims <= 2 || src.isContinuous()) { IppiSize roiSize = { src.cols, src.rows }; - Ipp32s count, srcstep = (Ipp32s)src.step; + Ipp32s count = 0, srcstep = (Ipp32s)src.step; IppStatus status = (IppStatus)-1; if (src.isContinuous()) diff --git a/modules/imgproc/perf/opencl/perf_filters.cpp b/modules/imgproc/perf/opencl/perf_filters.cpp index f7329e3194..d4dfbe0cc6 100644 --- a/modules/imgproc/perf/opencl/perf_filters.cpp +++ b/modules/imgproc/perf/opencl/perf_filters.cpp @@ -112,7 +112,7 @@ OCL_PERF_TEST_P(LaplacianFixture, Laplacian, const FilterParams params = GetParam(); const Size srcSize = get<0>(params); const int type = get<1>(params), ksize = get<2>(params); - const double eps = CV_MAT_DEPTH(type) <= CV_32S ? 1 : 1e-5; + const double eps = CV_MAT_DEPTH(type) <= CV_32S ? 1 : 2e-5; checkDeviceMaxMemoryAllocSize(srcSize, type); diff --git a/modules/imgproc/src/deriv.cpp b/modules/imgproc/src/deriv.cpp index 5d66318a89..326f86cd41 100644 --- a/modules/imgproc/src/deriv.cpp +++ b/modules/imgproc/src/deriv.cpp @@ -607,6 +607,7 @@ void cv::Laplacian( InputArray _src, OutputArray _dst, int ddepth, int ksize, } \ } while ((void)0, 0) + CV_SUPPRESS_DEPRECATED_START if (sdepth == CV_8U && ddepth == CV_16S && !floatScale && !floatDelta) { IPP_FILTER_LAPLACIAN(Ipp8u, Ipp16s, 8u16s); @@ -625,6 +626,7 @@ void cv::Laplacian( InputArray _src, OutputArray _dst, int ddepth, int ksize, if (needDelta && status >= 0) status = ippiAddC_32f_C1IR((Ipp32f)delta, (Ipp32f *)dst.data, (int)dst.step, roisize); } + CV_SUPPRESS_DEPRECATED_END if (status >= 0) return; diff --git a/modules/imgproc/src/filter.cpp b/modules/imgproc/src/filter.cpp index c9a5ed1e75..f0355103cb 100644 --- a/modules/imgproc/src/filter.cpp +++ b/modules/imgproc/src/filter.cpp @@ -1413,14 +1413,14 @@ struct RowVec_32f { kernel = _kernel; haveSSE = checkHardwareSupport(CV_CPU_SSE); -#ifdef USE_IPP_SEP_FILTERS +#if defined USE_IPP_SEP_FILTERS && 0 bufsz = -1; #endif } int operator()(const uchar* _src, uchar* _dst, int width, int cn) const { -#ifdef USE_IPP_SEP_FILTERS +#if defined USE_IPP_SEP_FILTERS && 0 int ret = ippiOperator(_src, _dst, width, cn); if (ret > 0) return ret; @@ -1458,13 +1458,13 @@ struct RowVec_32f Mat kernel; bool haveSSE; -#ifdef USE_IPP_SEP_FILTERS +#if defined USE_IPP_SEP_FILTERS && 0 private: mutable int bufsz; int ippiOperator(const uchar* _src, uchar* _dst, int width, int cn) const { int _ksize = kernel.rows + kernel.cols - 1; -// if ((1 != cn && 3 != cn) || width < _ksize*8) + if ((1 != cn && 3 != cn) || width < _ksize*8) return 0; const float* src = (const float*)_src; diff --git a/modules/imgproc/src/histogram.cpp b/modules/imgproc/src/histogram.cpp index 8e8484d6b7..ea73547713 100644 --- a/modules/imgproc/src/histogram.cpp +++ b/modules/imgproc/src/histogram.cpp @@ -1242,7 +1242,7 @@ void cv::calcHist( const Mat* images, int nimages, const int* channels, bool ok = true; const Mat & src = images[0]; - int nstripes = std::min(8, src.total() / (1 << 16)); + int nstripes = std::min(8, static_cast(src.total() / (1 << 16))); #ifdef HAVE_CONCURRENCY nstripes = 1; #endif diff --git a/modules/imgproc/src/moments.cpp b/modules/imgproc/src/moments.cpp index 631806c56f..8e0749776a 100644 --- a/modules/imgproc/src/moments.cpp +++ b/modules/imgproc/src/moments.cpp @@ -474,6 +474,7 @@ cv::Moments cv::moments( InputArray _src, bool binary ) // ippiMomentInitAlloc_64f, ippiMomentFree_64f are deprecated in 8.1, but there are not another way // to initialize IppiMomentState_64f. When GetStateSize and Init functions will appear we have to // change our code. + CV_SUPPRESS_DEPRECATED_START if (0 <= ippiMomentInitAlloc_64f(&moment, ippAlgHintAccurate)) { IppStatus sts = (IppStatus)(-1); @@ -518,6 +519,7 @@ cv::Moments cv::moments( InputArray _src, bool binary ) } ippiMomentFree_64f(moment); } + CV_SUPPRESS_DEPRECATED_END } #endif