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 }