程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> opencv的學習筆記3,opencv學習筆記3

opencv的學習筆記3,opencv學習筆記3

編輯:C++入門知識

opencv的學習筆記3,opencv學習筆記3


  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 );  

  • 第一個參數,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 } 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved