CMake是一個比make更高級的編譯配置工具,它可以根據不同平台、不同的編譯器,生成相應的Makefile或者vcproj項目。通過編寫CMakeLists.txt,可以控制生成的Makefile,從而控制編譯過程。CMake自動生成的Makefile不僅可以通過make命令構建項目生成目標文件,還支持安裝(make install)、測試安裝的程序是否能正確執行(make test,或者ctest)、生成當前平台的安裝包(make package)、生成源碼包(make package_source)、產生Dashboard顯示數據並上傳等高級功能,只要在CMakeLists.txt中簡單配置,就可以完成很多復雜的功能,包括寫測試用例。
如果有嵌套目錄,子目錄下可以有自己的CMakeLists.txt。 總之,CMake是一個非常強大的編譯自動配置工具,支持各種平台,KDE也是用它編譯的 例如,cmake可以根據CMakeLists.txt這個配置文件,通過不同的編譯器選擇,來生成不同的解決方案,VisualStudio的編譯器對應的就生成Visual Studio版的sln解決方案。1.線性濾波:
這裡的線性濾波主要有:方框濾波,均值濾波,高斯濾波。
方框濾波:
void boxFilter(InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), bool normalize=true,
int borderType=BORDER_DEFAULT );
---------------------------------------------------------------------------------------
均值濾波:
void blur(InputArray src, OutputArraydst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT ) ;
----------------------------------------------------------------------------
高斯濾波:
void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, intborderType=BORDER_DEFAULT )
2.非線性濾波:
非線性濾波主要有:中值濾波,雙邊濾波。
中值濾波:
void medianBlur(InputArray src, OutputArray dst, int ksize);
--------------------------------------------------------------------------
雙邊濾波:
void bilateralFilter(InputArray src, OutputArraydst, int d, double sigmaColor, double 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() );
int g_nStructElementSize = 3; //結構元素(內核矩陣)的尺寸 //獲取自定義核 Mat element = getStructuringElement(MORPH_RECT, Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1), Point( g_nStructElementSize, g_nStructElementSize ));
其中,getStructuringElement函數的第一個參數表示內核的形狀,我們可以選擇如下三種形狀之一:
而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);
7.獲取當前軌跡條的位置:
int getTrackbarPos(conststring& trackbarname, conststring& 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 }