filter2D関数(opencv)



Filter2d Function



void filter2D(int stype, int dtype, int kernel_type, uchar * src_data, size_t src_step, uchar * dst_data, size_t dst_step, int width, int height, int full_width, int full_height, int offset_x, int offset_y, uchar * kernel_data, size_t kernel_step, int kernel_width, int kernel_height, int anchor_x, int anchor_y, double delta, int borderType, bool isSubmatrix) The main function of the {// function is to control which implementation is operated. The replacementFilter2D indicates that the user customizes according to the requirements of opencv. / / Now, dftFilter2D represents the algorithm based on discrete Fourier, ocvFilter2D represents the ordinary algorithm, the general user defines his own / / Realize the algorithm, then calculate according to its own algorithm, then look, enter the Fourier algorithm, and finally to the ordinary algorithm used in peacetime bool res res = replacementFilter2D(stype, dtype, kernel_type, src_data, src_step, dst_data, dst_step, width, height, full_width, full_height, offset_x, offset_y, kernel_data, kernel_step, kernel_width, kernel_height, anchor_x, anchor_y, delta, borderType, isSubmatrix) if (res) return CV_IPP_RUN_FAST(ippFilter2D(stype, dtype, kernel_type, src_data, src_step, dst_data, dst_step, width, height, full_width, full_height, offset_x, offset_y, kernel_data, kernel_step, kernel_width, kernel_height, anchor_x, anchor_y, delta, borderType, isSubmatrix)) res = dftFilter2D(stype, dtype, kernel_type, src_data, src_step, dst_data, dst_step, full_width, full_height, offset_x, offset_y, kernel_data, kernel_step, kernel_width, kernel_height, anchor_x, anchor_y, delta, borderType) if (res) return ocvFilter2D(stype, dtype, kernel_type, src_data, src_step, dst_data, dst_step, width, height, full_width, full_height, offset_x, offset_y, kernel_data, kernel_step, kernel_width, kernel_height, anchor_x, anchor_y, delta, borderType) } static void ocvFilter2D(int stype, int dtype, int kernel_type, uchar * src_data, size_t src_step, uchar * dst_data, size_t dst_step, int width, int height, int full_width, int full_height, int offset_x, int offset_y, uchar * kernel_data, size_t kernel_step, int kernel_width, int kernel_height, int anchor_x, int anchor_y, double delta, int borderType) { Int borderTypeValue = borderType & ~BORDER_ISOLATED / / boundary type Mat kernel = Mat(Size(kernel_width, kernel_height), kernel_type, kernel_data, kernel_step) Ptr f = createLinearFilter(stype, dtype, kernel, Point(anchor_x, anchor_y), delta, borderTypeValue)//Create a linear filter and return the filter engine Mat src(Size(width, height), stype, src_data, src_step) Mat dst(Size(width, height), dtype, dst_data, dst_step) F->apply(src, dst, Size(full_width, full_height), Point(offset_x, offset_y))//call filter engine calls filter filtering }

ここに含まれるフィルターエンジン、参照: https://blog.csdn.net/u014676657/article/details/82970932

cv::Ptr cv::createLinearFilter( int _srcType, int _dstType, InputArray filter_kernel, Point _anchor, double _delta, int _rowBorderType, int _columnBorderType, const Scalar& _borderValue ) { Mat _kernel = filter_kernel.getMat() _srcType = CV_MAT_TYPE(_srcType) _dstType = CV_MAT_TYPE(_dstType) int cn = CV_MAT_CN(_srcType) CV_Assert( cn == CV_MAT_CN(_dstType) ) Mat kernel = _kernel int bits = 0 /*int sdepth = CV_MAT_DEPTH(_srcType), ddepth = CV_MAT_DEPTH(_dstType) int ktype = _kernel.depth() == CV_32S ? KERNEL_INTEGER : getKernelType(_kernel, _anchor) if( sdepth == CV_8U && (ddepth == CV_8U || ddepth == CV_16S) && _kernel.rows*_kernel.cols <= (1 << 10) ) { bits = (ktype & KERNEL_INTEGER) ? 0 : 11 _kernel.convertTo(kernel, CV_32S, 1 << bits) }*/ Ptr _filter2D = getLinearFilter(_srcType, _dstType, Kernel, _anchor, _delta, bits) //Get linear filter / / Initialize the filter engine and return return makePtr(_filter2D, Ptr(), Ptr(), _srcType, _dstType, _srcType, _rowBorderType, _columnBorderType, _borderValue ) }

以下で使用される線形フィルターリファレンス: https://blog.csdn.net/u014676657/article/details/83022756

cv::Ptr cv::getLinearFilter(int srcType, int dstType, InputArray filter_kernel, Point anchor, double delta, int bits) ddepth == CV_64F ? CV_64F : CV_32F Mat kernel if( _kernel.type() == kdepth ) kernel = _kernel else _kernel.convertTo(kernel, kdepth, _kernel.type() == CV_32S ? 1./(1 << bits) : 1.) if( sdepth == CV_8U && ddepth == CV_8U ) return makePtr > (kernel, anchor, delta, Cast(), FilterVec_8u(kernel, 0, delta)) if( sdepth == CV_8U && ddepth == CV_16U ) return makePtr >(kernel, anchor, delta) if( sdepth == CV_8U && ddepth == CV_16S ) return makePtr > (kernel, anchor, delta, Cast(), FilterVec_8u16s(kernel, 0, delta)) if( sdepth == CV_8U && ddepth == CV_32F ) return makePtr >(kernel, anchor, delta) if( sdepth == CV_8U && ddepth == CV_64F ) return makePtr >(kernel, anchor, delta) if( sdepth == CV_16U && ddepth == CV_16U ) return makePtr >(kernel, anchor, delta) if( sdepth == CV_16U && ddepth == CV_32F ) return makePtr >(kernel, anchor, delta) if( sdepth == CV_16U && ddepth == CV_64F ) return makePtr >(kernel, anchor, delta) if( sdepth == CV_16S && ddepth == CV_16S ) return makePtr >(kernel, anchor, delta) if( sdepth == CV_16S && ddepth == CV_32F ) return makePtr >(kernel, anchor, delta) if( sdepth == CV_16S && ddepth == CV_64F ) return makePtr >(kernel, anchor, delta) if( sdepth == CV_32F && ddepth == CV_32F ) return makePtr > (kernel, anchor, delta, Cast(), FilterVec_32f(kernel, 0, delta)) if( sdepth == CV_64F && ddepth == CV_64F ) return makePtr >(kernel, anchor, delta) CV_Error_( CV_StsNotImplemented, ('Unsupported combination of source format (=%d), and destination format (=%d)', srcType, dstType))