zoukankan      html  css  js  c++  java
  • FilterEngine 类解析——OpenCV图像滤波核心引擎(zz)

    <2>FilterEngine 类解析——OpenCV图像滤波核心引擎   

    FilterEngine类是OpenCV关于图像滤波的主力军类,OpenCV图像滤波功能的核心引擎。各种滤波函数比如blur, GaussianBlur,到头来其实是就是在函数末尾处定义了一个Ptr<FilterEngine>类型的f,然后f->apply( src, dst )了一下而已。

    这个类可以把几乎是所有的滤波操作施加到图像上。它包含了所有必要的中间缓存器。有很多和滤波相关的create系函数的返回值直接就是Ptr<FilterEngine>。比如cv::createSeparableLinearFilter(),

    cv::createLinearFilter(),cv::createGaussianFilter(), cv::createDerivFilter(),

    cv::createBoxFilter() 和cv::createMorphologyFilter().,这里给出其中一个函数的原型吧:

    Ptr<FilterEngine>createLinearFilter(int srcType, int dstType, InputArray kernel, Point_anchor=Point(-1,-1), double delta=0, int rowBorderType=BORDER_DEFAULT, intcolumnBorderType=-1, const Scalar& borderValue=Scalar() )

    上面我们提到过了,其中的Ptr是用来动态分配的对象的智能指针模板类,而上面的尖括号里面的模板参数就是FilterEngine。

    使用FilterEngine类可以分块处理大量的图像,构建复杂的管线,其中就包含一些进行滤波阶段。如果我们需要使用预先定义好的的滤波操作,cv::filter2D(), cv::erode(),以及cv::dilate(),可以选择,他们不依赖于FilterEngine,自立自强,在自己函数体内部就实现了FilterEngine提供的功能。不像其他的诸如我们今天讲的blur系列函数,依赖于FilterEngine引擎。

    我们看下其类声明经过浅墨详细注释的源码:

    //-----------------------------------【FilterEngine类中文注释版源代码】----------------------------
    //     代码作用:FilterEngine类,OpenCV图像滤波功能的核心引擎
    //     说明:以下代码为来自于计算机开源视觉库OpenCV的官方源代码
    //     OpenCV源代码版本:2.4.8
    //     源码路径:…opencvsourcesmodulesimgprocincludeopencv2imgprocimgproc.hpp
    //     源文件中如下代码的起始行数:222行
    //     中文注释by浅墨
    //--------------------------------------------------------------------------------------------------------
     
    class CV_EXPORTS FilterEngine
    {
    public:
       //默认构造函数
       FilterEngine();
       //完整的构造函数。 _filter2D 、_rowFilter 和 _columnFilter之一,必须为非空
       FilterEngine(const Ptr<BaseFilter>& _filter2D,
                     constPtr<BaseRowFilter>& _rowFilter,
                    constPtr<BaseColumnFilter>& _columnFilter,
                     int srcType, int dstType, intbufType,
                     int_rowBorderType=BORDER_REPLICATE,
                     int _columnBorderType=-1,
                     const Scalar&_borderValue=Scalar());
       //默认析构函数
       virtual ~FilterEngine();
       //重新初始化引擎。释放之前滤波器申请的内存。
       void init(const Ptr<BaseFilter>& _filter2D,
                  constPtr<BaseRowFilter>& _rowFilter,
                  constPtr<BaseColumnFilter>& _columnFilter,
                  int srcType, int dstType, intbufType,
                  int_rowBorderType=BORDER_REPLICATE, int _columnBorderType=-1,
                  const Scalar&_borderValue=Scalar());
       //开始对指定了ROI区域和尺寸的图片进行滤波操作
       virtual int start(Size wholeSize, Rect roi, int maxBufRows=-1);
        //开始对指定了ROI区域的图片进行滤波操作
       virtual int start(const Mat& src, const Rect&srcRoi=Rect(0,0,-1,-1),
                          bool isolated=false, intmaxBufRows=-1);
       //处理图像的下一个srcCount行(函数的第三个参数)
       virtual int proceed(const uchar* src, int srcStep, int srcCount,
                            uchar* dst, intdstStep);
       //对图像指定的ROI区域进行滤波操作,若srcRoi=(0,0,-1,-1),则对整个图像进行滤波操作
       virtual void apply( const Mat& src, Mat& dst,
                            const Rect&srcRoi=Rect(0,0,-1,-1),
                            Point dstOfs=Point(0,0),
                            bool isolated=false);
     
       //如果滤波器可分离,则返回true
    boolisSeparable() const { return (const BaseFilter*)filter2D == 0; }
     
       //返回输入和输出行数
       int remainingInputRows() const;
    intremainingOutputRows() const;
     
       //一些成员参数定义
       int srcType, dstType, bufType;
       Size ksize;
       Point anchor;
       int maxWidth;
       Size wholeSize;
       Rect roi;
       int dx1, dx2;
       int rowBorderType, columnBorderType;
       vector<int> borderTab;
       int borderElemSize;
       vector<uchar> ringBuf;
       vector<uchar> srcRow;
       vector<uchar> constBorderValue;
       vector<uchar> constBorderRow;
       int bufStep, startY, startY0, endY, rowCount, dstY;
       vector<uchar*> rows;
     
       Ptr<BaseFilter> filter2D;
       Ptr<BaseRowFilter> rowFilter;
       Ptr<BaseColumnFilter> columnFilter;
    };
  • 相关阅读:
    SAP 标准成本滚算小记
    记一次SAP新业务开发项目
    让人头疼的关键用户
    SAP GUI个性化设置
    惊心动魄的SAP S4客户额度调整运动
    最新.net和Java调用SAP RFC中间件下载
    那些年我遇到的ERP顾问
    【SAP业务模式】之STO(二):系统配置
    SAP S4系统创建Customer和Vendor的BAPI
    【SAP S/4 1511之变】:主数据之变
  • 原文地址:https://www.cnblogs.com/stevenxiu/p/5591423.html
Copyright © 2011-2022 走看看