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 // 源碼路徑:…\opencv\sources\modules\imgproc\include\opencv2\imgproc\imgproc.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; };


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM