diff --git a/modules/imgproc/src/hal_replacement.hpp b/modules/imgproc/src/hal_replacement.hpp index be05644067..00e6a94543 100644 --- a/modules/imgproc/src/hal_replacement.hpp +++ b/modules/imgproc/src/hal_replacement.hpp @@ -664,6 +664,25 @@ inline int hal_ni_threshold(const uchar* src_data, size_t src_step, uchar* dst_d #define cv_hal_threshold hal_ni_threshold //! @endcond +/** + @brief Calculate box filter + @param src_depth, dst_depth Depths of source and destination image + @param src_data, src_step Source image + @param dst_data, dst_step Destination image + @param ksize Size of kernel + @param anchor Anchor point + @param normalize If true then result is normalized + @param border_type Border type + @param margins Margins for source image + @param width, height Source image dimensions + @param cn Number of channels +*/ +inline int hal_ni_boxFilter(int src_depth, int dst_depth, const uchar* src_data, size_t src_step, uchar* dst_data, size_t dst_step, CvSize ksize, CvPoint anchor, bool normalize, int border_type, CvRect margins, int width, int height, int cn) { return CV_HAL_ERROR_NOT_IMPLEMENTED; } + +//! @cond IGNORED +#define cv_hal_boxFilter hal_ni_boxFilter +//! @endcond + //! @} #if defined __GNUC__ diff --git a/modules/imgproc/src/smooth.cpp b/modules/imgproc/src/smooth.cpp index 54c15e28ca..45ec278257 100644 --- a/modules/imgproc/src/smooth.cpp +++ b/modules/imgproc/src/smooth.cpp @@ -1552,12 +1552,6 @@ void cv::boxFilter( InputArray _src, OutputArray _dst, int ddepth, if( src.cols == 1 ) ksize.width = 1; } -#ifdef HAVE_TEGRA_OPTIMIZATION - if ( tegra::useTegra() && tegra::box(src, dst, ksize, anchor, normalize, borderType) ) - return; -#endif - - CV_IPP_RUN_FAST(ipp_boxfilter(src, dst, ksize, anchor, normalize, borderType)); Point ofs; Size wsz(src.cols, src.rows); @@ -1565,6 +1559,18 @@ void cv::boxFilter( InputArray _src, OutputArray _dst, int ddepth, src.locateROI( wsz, ofs ); borderType = (borderType&~BORDER_ISOLATED); + CvRect margin = cvRect(ofs.x, ofs.y, wsz.width - src.cols - ofs.x, wsz.height - src.rows - ofs.y); + + CALL_HAL(boxFilter, cv_hal_boxFilter, sdepth, ddepth, src.ptr(), src.step, dst.ptr(), dst.step, + (CvSize)(ksize), (CvPoint)(anchor), normalize, borderType, margin, src.cols, src.rows, cn); + +#ifdef HAVE_TEGRA_OPTIMIZATION + if ( tegra::useTegra() && tegra::box(src, dst, ksize, anchor, normalize, borderType) ) + return; +#endif + + CV_IPP_RUN_FAST(ipp_boxfilter(src, dst, ksize, anchor, normalize, borderType)); + Ptr f = createBoxFilter( src.type(), dst.type(), ksize, anchor, normalize, borderType );