From d0981a628a6c7bd54359b89c9101f3d100e79b70 Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Mon, 23 Jan 2012 09:16:07 +0000 Subject: [PATCH] Tegra optimization for image filtering --- modules/imgproc/perf/perf_filter2d.cpp | 45 ++++++++++++++++++++++++++ modules/imgproc/src/filter.cpp | 5 +++ modules/imgproc/src/smooth.cpp | 6 ++++ 3 files changed, 56 insertions(+) create mode 100644 modules/imgproc/perf/perf_filter2d.cpp diff --git a/modules/imgproc/perf/perf_filter2d.cpp b/modules/imgproc/perf/perf_filter2d.cpp new file mode 100644 index 0000000000..c87f31c8de --- /dev/null +++ b/modules/imgproc/perf/perf_filter2d.cpp @@ -0,0 +1,45 @@ +#include "perf_precomp.hpp" + +using namespace std; +using namespace cv; +using namespace perf; +using namespace testing; +using std::tr1::make_tuple; +using std::tr1::get; + + +CV_ENUM(BorderMode, BORDER_CONSTANT, BORDER_REPLICATE, BORDER_REFLECT_101); + +typedef TestBaseWithParam< tr1::tuple > TestFilter2d; + + +PERF_TEST_P( TestFilter2d, Filter2d, + Combine( + Values( Size(320, 240), szVGA, sz720p, sz1080p ), + Values( 3, 5 ), + ValuesIn( BorderMode::all() ) + ) +) +{ + Size sz; + int borderMode, kSize; + sz = get<0>(GetParam()); + kSize = get<1>(GetParam()); + borderMode = get<2>(GetParam()); + + Mat src(sz, CV_8UC4); + Mat dst(sz, CV_8UC4); + + Mat kernel(kSize, kSize, CV_32FC1); + randu(kernel, -3, 10); + float s = fabs( sum(kernel)[0] ); + if(s > 1e-3) kernel /= s; + + declare.in(src, WARMUP_RNG).out(dst).time(20); + + TEST_CYCLE() filter2D(src, dst, CV_8UC4, kernel, Point(1, 1), 0., borderMode); + + SANITY_CHECK(dst); +} + + diff --git a/modules/imgproc/src/filter.cpp b/modules/imgproc/src/filter.cpp index 772048db85..0bb577beaf 100644 --- a/modules/imgproc/src/filter.cpp +++ b/modules/imgproc/src/filter.cpp @@ -3010,6 +3010,11 @@ void cv::filter2D( InputArray _src, OutputArray _dst, int ddepth, Mat dst = _dst.getMat(); anchor = normalizeAnchor(anchor, kernel.size()); +#ifdef HAVE_TEGRA_OPTIMIZATION + if( tegra::filter2D(src, dst, kernel, anchor, delta, borderType) ) + return; +#endif + if( kernel.cols*kernel.rows >= dft_filter_size ) { Mat temp; diff --git a/modules/imgproc/src/smooth.cpp b/modules/imgproc/src/smooth.cpp index dec283607a..ce7288634d 100644 --- a/modules/imgproc/src/smooth.cpp +++ b/modules/imgproc/src/smooth.cpp @@ -311,6 +311,12 @@ void cv::boxFilter( InputArray _src, OutputArray _dst, int ddepth, if( src.cols == 1 ) ksize.width = 1; } + +#ifdef HAVE_TEGRA_OPTIMIZATION + if ( tegra::boxFilter(src, dst, ksize, anchor, normalize, borderType) ) + return; +#endif + Ptr f = createBoxFilter( src.type(), dst.type(), ksize, anchor, normalize, borderType ); f->apply( src, dst );