| 3287 | |
| 3288 | |
| 3289 | void cv::filter2D( InputArray _src, OutputArray _dst, int ddepth, |
| 3290 | InputArray _kernel, Point anchor, |
| 3291 | double delta, int borderType ) |
| 3292 | { |
| 3293 | Mat src = _src.getMat(), kernel = _kernel.getMat(); |
| 3294 | |
| 3295 | if( ddepth < 0 ) |
| 3296 | ddepth = src.depth(); |
| 3297 | |
| 3298 | #if CV_SSE2 |
| 3299 | int dft_filter_size = ((src.depth() == CV_8U && (ddepth == CV_8U || ddepth == CV_16S)) || |
| 3300 | (src.depth() == CV_32F && ddepth == CV_32F)) && checkHardwareSupport(CV_CPU_SSE3)? 130 : 50; |
| 3301 | #else |
| 3302 | int dft_filter_size = 50; |
| 3303 | #endif |
| 3304 | |
| 3305 | _dst.create( src.size(), CV_MAKETYPE(ddepth, src.channels()) ); |
| 3306 | Mat dst = _dst.getMat(); |
| 3307 | anchor = normalizeAnchor(anchor, kernel.size()); |
| 3308 | |
| 3309 | #ifdef HAVE_TEGRA_OPTIMIZATION |
| 3310 | if( tegra::filter2D(src, dst, kernel, anchor, delta, borderType) ) |
| 3311 | return; |
| 3312 | #endif |
| 3313 | |
| 3314 | if( kernel.cols*kernel.rows >= dft_filter_size ) |
| 3315 | { |
| 3316 | Mat temp; |
| 3317 | if( src.data != dst.data ) |
| 3318 | temp = dst; |
| 3319 | else |
| 3320 | temp.create(dst.size(), dst.type()); |
| 3321 | crossCorr( src, kernel, temp, src.size(), |
| 3322 | CV_MAKETYPE(ddepth, src.channels()), |
| 3323 | anchor, delta, borderType ); |
| 3324 | if( temp.data != dst.data ) |
| 3325 | temp.copyTo(dst); |
| 3326 | return; |
| 3327 | } |
| 3328 | |
| 3329 | Ptr<FilterEngine> f = createLinearFilter(src.type(), dst.type(), kernel, |
| 3330 | anchor, delta, borderType & ~BORDER_ISOLATED ); |
| 3331 | f->apply(src, dst, Rect(0,0,-1,-1), Point(), (borderType & BORDER_ISOLATED) != 0 ); |
| 3332 | } |
| 3333 | |
| 3334 | |
| 3335 | void cv::sepFilter2D( InputArray _src, OutputArray _dst, int ddepth, |
nothing calls this directly
no test coverage detected