CMake是一個比make更高級的編譯配置工具,它可以根據不同平台、不同的編譯器,生成相應的Makefile或者vcproj項目。通過編寫CMakeLists.txt,可以控制生成的Makefile,從而控制編譯過程。CMake自動生成的Makefile不僅可以通過make命令構建項目生成目標文件,還支持安裝(make install)、測試安裝的程序是否能正確執行(make test,或者ctest)、生成當前平台的安裝包(make package)、生成源碼包(make package_source)、產生Dashboard顯示數據並上傳等高級功能,只要在CMakeLists.txt中簡單配置,就可以完成很多復雜的功能,包括寫測試用例。
1.線性濾波:
這里的線性濾波主要有:方框濾波,均值濾波,高斯濾波。
方框濾波:
void boxFilter(InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), bool normalize=true,
int borderType=BORDER_DEFAULT );
- 第一個參數,InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象即可。該函數對通道是獨立處理的,且可以處理任意通道數的圖片,但需要注意,待處理的圖片深度應該為CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
- 第二個參數,OutputArray類型的dst,即目標圖像,需要和源圖片有一樣的尺寸和類型。
- 第三個參數,int類型的ddepth,輸出圖像的深度,-1代表使用原圖深度,即src.depth()。
- 第四個參數,Size類型(對Size類型稍后有講解)的ksize,內核的大小。一般這樣寫Size( w,h )來表示內核的大小( 其中,w 為像素寬度, h為像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
- 第五個參數,Point類型的anchor,表示錨點(即被平滑的那個點),注意他有默認值Point(-1,-1)。如果這個點坐標是負值的話,就表示取核的中心為錨點,所以默認值Point(-1,-1)表示這個錨點在核的中心。
- 第六個參數,bool類型的normalize,默認值為true,一個標識符,表示內核是否被其區域歸一化(normalized)了。
- 第七個參數,int類型的borderType,用於推斷圖像外部像素的某種邊界模式。有默認值BORDER_DEFAULT,我們一般不去管它。
---------------------------------------------------------------------------------------
均值濾波:
void blur(InputArray src, OutputArraydst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT ) ;
- 第一個參數,InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象即可。該函數對通道是獨立處理的,且可以處理任意通道數的圖片,但需要注意,待處理的圖片深度應該為CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
- 第二個參數,OutputArray類型的dst,即目標圖像,需要和源圖片有一樣的尺寸和類型。比如可以用Mat::Clone,以源圖片為模板,來初始化得到如假包換的目標圖。
- 第三個參數,Size類型(對Size類型稍后有講解)的ksize,內核的大小。一般這樣寫Size( w,h )來表示內核的大小( 其中,w 為像素寬度, h為像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
- 第四個參數,Point類型的anchor,表示錨點(即被平滑的那個點),注意他有默認值Point(-1,-1)。如果這個點坐標是負值的話,就表示取核的中心為錨點,所以默認值Point(-1,-1)表示這個錨點在核的中心。
- 第五個參數,int類型的borderType,用於推斷圖像外部像素的某種邊界模式。有默認值BORDER_DEFAULT,我們一般不去管它。
----------------------------------------------------------------------------
高斯濾波:
void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, intborderType=BORDER_DEFAULT )
- 第一個參數,InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象即可。它可以是單獨的任意通道數的圖片,但需要注意,圖片深度應該為CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
- 第二個參數,OutputArray類型的dst,即目標圖像,需要和源圖片有一樣的尺寸和類型。比如可以用Mat::Clone,以源圖片為模板,來初始化得到如假包換的目標圖。
- 第三個參數,Size類型的ksize高斯內核的大小。其中ksize.width和ksize.height可以不同,但他們都必須為正數和奇數。或者,它們可以是零的,它們都是由sigma計算而來。
- 第四個參數,double類型的sigmaX,表示高斯核函數在X方向的的標准偏差。
- 第五個參數,double類型的sigmaY,表示高斯核函數在Y方向的的標准偏差。若sigmaY為零,就將它設為sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height計算出來。
- 為了結果的正確性着想,最好是把第三個參數Size,第四個參數sigmaX和第五個參數sigmaY全部指定到。
- 第六個參數,int類型的borderType,用於推斷圖像外部像素的某種邊界模式。有默認值BORDER_DEFAULT,我們一般不去管它。
2.非線性濾波:
非線性濾波主要有:中值濾波,雙邊濾波。
中值濾波:
void medianBlur(InputArray src, OutputArray dst, int ksize);
- 第一個參數,InputArray類型的src,函數的輸入參數,填1、3或者4通道的Mat類型的圖像;當ksize為3或者5的時候,圖像深度需為CV_8U,CV_16U,或CV_32F其中之一,而對於較大孔徑尺寸的圖片,它只能是CV_8U。
- 第二個參數,OutputArray類型的dst,即目標圖像,函數的輸出參數,需要和源圖片有一樣的尺寸和類型。我們可以用Mat::Clone,以源圖片為模板,來初始化得到如假包換的目標圖。
- 第三個參數,int類型的ksize,孔徑的線性尺寸(aperture linear size),注意這個參數必須是大於1的奇數,比如:3,5,7,9 ...
--------------------------------------------------------------------------
雙邊濾波:
void bilateralFilter(InputArray src, OutputArraydst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT);
- 第一個參數,InputArray類型的src,輸入圖像,即源圖像,需要為8位或者浮點型單通道、三通道的圖像。
- 第二個參數,OutputArray類型的dst,即目標圖像,需要和源圖片有一樣的尺寸和類型。
- 第三個參數,int類型的d,表示在過濾過程中每個像素鄰域的直徑。如果這個值我們設其為非正數,那么OpenCV會從第五個參數sigmaSpace來計算出它來。
- 第四個參數,double類型的sigmaColor,顏色空間濾波器的sigma值。這個參數的值越大,就表明該像素鄰域內有更寬廣的顏色會被混合到一起,產生較大的半相等顏色區域。
- 第五個參數,double類型的sigmaSpace坐標空間中濾波器的sigma值,坐標空間的標注方差。他的數值越大,意味着越遠的像素會相互影響,從而使更大的區域足夠相似的顏色獲取相同的顏色。當d>0,d指定了鄰域大小且與sigmaSpace無關。否則,d正比於sigmaSpace。
- 第六個參數,int類型的borderType,用於推斷圖像外部像素的某種邊界模式。注意它有默認值BORDER_DEFAULT。
3.數學形態學的基本定義:
數學形態學(Mathematical morphology) 是一門建立在格論和拓撲學基礎之上的圖像分析學科,是數學形態學圖像處理的基本理論。其基本的運算包括:二值腐蝕和膨脹、二值開閉運算、骨架抽取、極限腐蝕、擊中擊不中變換、形態學梯度、Top-hat變換、顆粒分析、流域變換、灰值腐蝕和膨脹、灰值開閉運算、灰值形態學梯度等。
4.膨脹:
void dilate(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() );
- 第一個參數,InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象即可。圖像通道的數量可以是任意的,但圖像深度應為CV_8U,CV_16U,CV_16S,CV_32F或 CV_64F其中之一。
- 第二個參數,OutputArray類型的dst,即目標圖像,需要和源圖片有一樣的尺寸和類型。
- 第三個參數,InputArray類型的kernel,膨脹操作的核。若為NULL時,表示的是使用參考點位於中心3x3的核。
- 我們一般使用函數 getStructuringElement配合這個參數的使用。getStructuringElement函數會返回指定形狀和尺寸的結構元素
int g_nStructElementSize = 3; //結構元素(內核矩陣)的尺寸 //獲取自定義核 Mat element = getStructuringElement(MORPH_RECT, Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1), Point( g_nStructElementSize, g_nStructElementSize ));
其中,getStructuringElement函數的第一個參數表示內核的形狀,我們可以選擇如下三種形狀之一:
- 矩形: MORPH_RECT
- 交叉形: MORPH_CROSS
- 橢圓形:MORPH_ELLIPSE
而getStructuringElement函數的第二和第三個參數分別是內核的尺寸以及錨點的位置。對於錨點的位置,有默認值Point(-1,-1),表示錨點位於中心。且需要注意,交叉形的element形狀唯一依賴於錨點的位置。而在其他情況下,錨點只是影響了形態學運算結果的偏移。
應用實例:
//載入原圖 Mat image = imread("1.jpg"); //獲取自定義核 Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); Mat out; //進行膨脹操作 dilate(image, out, element);
5.腐蝕:
void erode(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() );
使用方式和膨脹一樣,同樣需要配合getStructuringElement來使用。
6.軌跡條:
int createTrackbar(conststring& trackbarname, conststring& winname, int* value, int count, TrackbarCallback onChange=0, void* userdata=0);
- 第一個參數,const string&類型的trackbarname,表示軌跡條的名字,用來代表我們創建的軌跡條。
- 第二個參數,const string&類型的winname,填窗口的名字,表示這個軌跡條會依附到哪個窗口上,即對應namedWindow()創建窗口時填的某一個窗口名。
- 第三個參數,int* 類型的value,一個指向整型的指針,表示滑塊的位置。並且在創建時,滑塊的初始位置就是該變量當前的值。
- 第四個參數,int類型的count,表示滑塊可以達到的最大位置的值。PS:滑塊最小的位置的值始終為0。
- 第五個參數,TrackbarCallback類型的onChange,首先注意他有默認值0。這是一個指向回調函數的指針,每次滑塊位置改變時,這個函數都會進行回調。並且這個函數的原型必須為void XXXX(int,void*);其中第一個參數是軌跡條的位置,第二個參數是用戶數據(看下面的第六個參數)。如果回調是NULL指針,表示沒有回調函數的調用,僅第三個參數value有變化。
- 第六個參數,void*類型的userdata,他也有默認值0。這個參數是用戶傳給回調函數的數據,用來處理軌跡條事件。如果使用的第三個參數value實參是全局變量的話,完全可以不去管這個userdata參數。
7.獲取當前軌跡條的位置:
int getTrackbarPos(conststring& trackbarname, conststring& winname);
- 第一個參數,const string&類型的trackbarname,表示軌跡條的名字。
- 第二個參數,const string&類型的winname,表示軌跡條的父窗口的名稱。
//創建軌跡條 createTrackbar("對比度:", "【效果圖窗口】",&g_nContrastValue, 300,ContrastAndBright ); // g_nContrastValue為全局的整型變量,ContrastAndBright為回調函數的函數名(即指向函數地址的指針)
1 //-----------------------------------【頭文件包含部分】--------------------------------------- 2 // 描述:包含程序所依賴的頭文件 3 //---------------------------------------------------------------------------------------------- 4 #include "opencv2/imgproc/imgproc.hpp" 5 #include "opencv2/highgui/highgui.hpp" 6 #include <iostream> 7 8 //-----------------------------------【命名空間聲明部分】--------------------------------------- 9 // 描述:包含程序所使用的命名空間 10 //----------------------------------------------------------------------------------------------- 11 using namespace cv; 12 using namespace std; 13 14 //-----------------------------------【全局函數聲明部分】-------------------------------------- 15 // 描述:全局函數聲明 16 //----------------------------------------------------------------------------------------------- 17 Mat img; 18 int threshval = 160; //軌跡條滑塊對應的值,給初值160 19 20 //-----------------------------【on_trackbar( )函數】------------------------------------ 21 // 描述:軌跡條的回調函數 22 //----------------------------------------------------------------------------------------------- 23 static void on_trackbar(int, void*) 24 { 25 Mat bw = threshval < 128 ? (img < threshval) : (img > threshval); 26 27 //定義點和向量 28 vector<vector<Point> > contours; 29 vector<Vec4i> hierarchy; 30 31 //查找輪廓 32 findContours( bw, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE ); 33 //初始化dst 34 Mat dst = Mat::zeros(img.size(), CV_8UC3); 35 //開始處理 36 if( !contours.empty() && !hierarchy.empty() ) 37 { 38 //遍歷所有頂層輪廓,隨機生成顏色值繪制給各連接組成部分 39 int idx = 0; 40 for( ; idx >= 0; idx = hierarchy[idx][0] ) 41 { 42 Scalar color( (rand()&255), (rand()&255), (rand()&255) ); 43 //繪制填充輪廓 44 drawContours( dst, contours, idx, color, CV_FILLED, 8, hierarchy ); 45 } 46 } 47 //顯示窗口 48 imshow( "Connected Components", dst ); 49 } 50 51 52 //-----------------------------------【main( )函數】-------------------------------------------- 53 // 描述:控制台應用程序的入口函數,我們的程序從這里開始 54 //----------------------------------------------------------------------------------------------- 55 int main( ) 56 { 57 system("color 5F"); 58 //載入圖片 59 img = imread("1.jpg", 0); 60 if( !img.data ) { printf("Oh,no,讀取img圖片文件錯誤~! \n"); return -1; } 61 62 //顯示原圖 63 namedWindow( "Image", 1 ); 64 imshow( "Image", img ); 65 66 //創建處理窗口 67 namedWindow( "Connected Components", 1 ); 68 //創建軌跡條 69 createTrackbar( "Threshold", "Connected Components", &threshval, 255, on_trackbar ); 70 on_trackbar(threshval, 0);//軌跡條回調函數 71 72 waitKey(0); 73 return 0; 74 }
