1. 程式人生 > >影象處理_常用函式_OpenCV

影象處理_常用函式_OpenCV

1.cvFindContours

         函式cvFindContours從二值影象中檢索輪廓,並返回檢測到的輪廓的個數。first_contour的值由函式填充返回,它的值將為第一個外輪廓的指標,當沒有輪廓被檢測到時為NULL。其它輪廓可以使用h_next和v_next連線,從first_contour到達。

int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour,
                    int header_size=sizeof(CvContour), int mode=CV_RETR_LIST,
                    int method=CV_CHAIN_APPROX_SIMPLE, CvPoint offset=cvPoint(0,0) );
       image:8位元單通道的源二值影象。非零畫素作為1處理,0畫素儲存不變。從一個灰度影象得到二值影象的函式有:cvThreshold,cvAdaptiveThreshold和cvCanny。
       storage:返回輪廓的容器。
       first_contour:輸出引數,用於儲存指向第一個外接輪廓。
       header_size:header序列的尺寸.如果選擇method = CV_CHAIN_CODE, 則header_size >= sizeof(CvChain);其他,則header_size >= sizeof(CvContour)。
       mode:檢索模式,可取值如下:
          (1)CV_RETR_EXTERNAL:只檢索最外面的輪廓;
          (2)CV_RETR_LIST:檢索所有的輪廓,並將其放入list中;
          (3)CV_RETR_CCOMP:檢索所有的輪廓,並將他們組織為兩層:頂層是各部分的外部邊界,第二層是空洞的邊界;
          (4)CV_RETR_TREE:檢索所有的輪廓,並重構巢狀輪廓的整個層次。

                                    


                                          藍色表示v_next,綠色表示h_next

       method:邊緣近似方法(除了CV_RETR_RUNS使用內建的近似,其他模式均使用此設定的近似演算法)。可取值如下:
          (1)CV_CHAIN_CODE:以Freeman鏈碼的方式輸出輪廓,所有其他方法輸出多邊形(頂點的序列)。
          (2)CV_CHAIN_APPROX_NONE:將所有的連碼點,轉換成點。
          (3)CV_CHAIN_APPROX_SIMPLE:壓縮水平的、垂直的和斜的部分,也就是,函式只保留他們的終點部分。
          (4)CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用the flavors of Teh-Chin chain近似演算法的一種。
          (5)CV_LINK_RUNS:通過連線水平段的1,使用完全不同的邊緣提取演算法。使用CV_RETR_LIST檢索模式能使用此方法。

       offset:偏移量,用於移動所有輪廓點。當輪廓是從影象的ROI提取的,並且需要在整個影象中分析時,這個引數將很有用。

2. cvMoveWindow

        該函式為開放計算機視覺(OpenCV)庫庫函式,設定視窗的位置。
  定義:  

void cvMoveWindow( constchar* name, int x, int y );
  引數:
  name 將被設定的視窗的名字。 
  x 視窗左上角的x座標。 
  y 視窗左上角的y座標。 
     函式cvMoveWindow改變視窗的位置。

3.cvResizeWindow

  該函式為開放計算機視覺(OpenCV)庫庫函式,設定視窗大小。
  定義:

voidcvResizeWindow( const char* name, int width, int height );
  引數:
   name 將被設定視窗的名字。 
   width 新的視窗寬度。 
   height 新的視窗高度。

4.void cvSmooth

void cvSmooth( const CvArr* src,CvArr* dst,int smoothtype=CV_GAUSSIAN,
               int param1=3, int param2=0, doubleparam3=0 ,double param4=0);

        src:輸入影象.
        dst:輸出影象.
        smoothtype:平滑方法
        平滑方法
             (1)CV_BLUR_NO_SCALE (簡單不帶尺度變換的模糊)- 對每個象素的 param1×param2 領域求和。如果鄰域大小是變化的,可以事先利用函式 cvIntegral 計算積分影象。
             (2)CV_BLUR (simple blur) - 對每個象素param1×param2鄰域 求和並做尺度變換1/(param1.param2).
             (3)CV_GAUSSIAN (gaussian blur) - 對影象進行核大小為param1×param2 的高斯卷積
             (4)CV_MEDIAN (median blur) - 對影象進行核大小為param1×param1 的中值濾波(i.e. 鄰域是方的).
             (5)CV_BILATERAL (雙向濾波) - 應用雙向 3x3 濾波,彩色sigma=param1,空間sigma=param2. 平滑操作的第一個引數.
        param2:平滑操作的第二個引數. 對於簡單/非尺度變換的高斯模糊的情況,如果param2的值為零,則表示其被設定為param1。
        param3:對應高斯引數的 Gaussian sigma (標準差). 如果為零,則標準差由下面的核尺寸計算:
        sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 對應水平核,n=param2 對應垂直核.
        對小的卷積核 (3×3 to 7×7) 使用如上公式所示的標準 sigma 速度會快。如果 param3 不為零,而 param1 和 param2 為零,則核大小有 sigma 計算 (以保證足夠精確的操作).函式 cvSmooth 可使用上面任何一種方法平滑影象。每一種方法都有自己的特點以及侷限。沒有縮放的影象平滑僅支援單通道影象,並且支援8位到16位的轉換(與cvSobel和cvLaplace相似)和32位浮點數到32位浮點數的變換格式。簡單模糊和高斯模糊支援 1- 或 3-通道, 8-位元和 32-位元浮點影象。這兩種方法可以(in-place)方式處理影象。中值和雙向濾波工作於 1- 或 3-通道, 8-點陣圖像,但是不能以 in-place 方式處理影象.
 
註解:
     (1)可能大家對CvArr的理解不是很深刻,可以將其看做C++中的基類,當然也包括IplImage
     (2)smooth支援的型別:
             CV_BLUR簡單模糊 對每個畫素param1,param2求和,並縮放1/(param1*param2),亦即求簡單平均值
             CV_BLUR_NO_SCALE簡單無縮放變化的模糊 對每個畫素param1,param2求和 特別說明的是輸入影象和結果影象必須有不同的數值精度,以保證不會發生溢位,如果源影象是8u,則結果影象必須是16s或者32s
             CV_MEDIAN中值模糊 取中心畫素的正方形領域類的每個畫素的值用中間值代替
             CV_GAUSSIAN高斯模糊 param3為零時,高斯卷積核sigma通過以下公式計算
             sigma(x)= (n(x)/2-1)*0.30+0.80,n(x)=param1
             sigma(y)= (n(y)/2-1)*0.30+0.80,n(y)=param2
       如果第四個引數指定,則第三個和第四個引數分別表示sigma的水平方向和垂直方向的值;如果第三個,第四個引數已經指定,而前兩個引數為0,那麼視窗的尺寸由sigma確定
             CV_BILATERAL雙向濾波 因為高斯模糊是在影象在空間內的畫素是緩慢變化的,但隨機的兩個點可能形成很大的畫素差,高斯濾波在保留訊號的條件下減少噪聲,但在接近邊緣的地方無效,雙向濾波可以解決這個問題,但需要更多的時間代價,其需要兩個引數,param1表示空域中所使用的高斯核的寬度,param2表示顏色域高斯核的高度。


5.cvPyrDown
     功能:
              函式cvPyrDown使用Gaussian金字塔分解對輸入影象向下取樣。
     格式:

voidcvPyrDown(const CvArr*src,CvArr*dst,int filter=CV_GAUSSIAN_5x5);
     引數:
             src 輸入影象。
             dst 輸出影象,其寬度和高度應是輸入影象的一半。
             filter 卷積濾波器型別,目前僅支援CV_GAUSSIAN_5x5。

6.cvPyrUp

         opencv庫中函式用於影象的上取樣

void cvPyrUp( const CvArr* src, CvArr* dst, intfilter=CV_GAUSSIAN_5x5 );
         src 輸入影象
         dst 
輸出影象,寬度和高度應是輸入影象的2
         filter 
卷積濾波器的型別,目前僅支援CV_GAUSSIAN_5x5       函式 cvPyrUp使用Gaussian金字塔分解對輸入影象向上取樣。首先通過在影象中插入偶數行和偶數列,然後對得到的影象用指定的濾波器進行高斯卷積,其中濾波器乘以4做插值。所以輸出影象是輸入影象的 4倍大小。

7.cvRunningAvg

       作用:用來更新移動平均。

       函式形式:

void cvRunningAvg(const CvArr * image, CvArr* acc, double alpha,const CvArr* mask=NULL)

       引數說明:
             image:輸入影象,1或3通道,8位元或32位元的float型
             acc:累加器,和image一樣大小
             alpha:更新時,image所佔的權重
             mask:操作符掩碼
                           if mask(x,y)!= 0(1-alpha)*acc(x,y)+alpha*image(x,y) =>acc(x,y)
8.Flip
         垂直,水平或即垂直又水平翻轉二維陣列

void cvFlip(const CvArr* src, CvArr* dst=NULL, int flip_mode=0);
         src原陣列.
         dst目標責任制陣列.如果 dst = NULL 翻轉是在內部替換.
         flip_mode指定怎樣去翻轉陣列。
         flip_mode = 0 沿X-軸翻轉, flip_mode >0 (如 1) 沿Y-軸翻轉, flip_mode < 0 (如 -1) 沿X-軸和Y-軸翻轉.