영상처리

OpenCV filter2d Source Code (C++)

park__ 2024. 12. 13. 16:32

opencv version : 2.4

link : https://github.com/opencv/opencv/blob/2.4/modules/imgproc/src/filter.cpp

void cv::filter2D( InputArray _src, OutputArray _dst, int ddepth,
                   InputArray _kernel, Point anchor,
                   double delta, int borderType )
{
    Mat src = _src.getMat(), kernel = _kernel.getMat();

    if( ddepth < 0 )
        ddepth = src.depth();

#if CV_SSE2
    int dft_filter_size = ((src.depth() == CV_8U && (ddepth == CV_8U || ddepth == CV_16S)) ||
        (src.depth() == CV_32F && ddepth == CV_32F)) && checkHardwareSupport(CV_CPU_SSE3)? 130 : 50;
#else
    int dft_filter_size = 50;
#endif

    _dst.create( src.size(), CV_MAKETYPE(ddepth, src.channels()) );
    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;
        if( src.data != dst.data )
            temp = dst;
        else
            temp.create(dst.size(), dst.type());
        crossCorr( src, kernel, temp, src.size(),
                   CV_MAKETYPE(ddepth, src.channels()),
                   anchor, delta, borderType );
        if( temp.data != dst.data )
            temp.copyTo(dst);
        return;
    }

    Ptr<FilterEngine> f = createLinearFilter(src.type(), dst.type(), kernel,
                                             anchor, delta, borderType & ~BORDER_ISOLATED );
    f->apply(src, dst, Rect(0,0,-1,-1), Point(), (borderType & BORDER_ISOLATED) != 0 );
}