2015年12月25日 星期五

opencv 學習筆記:keypoint 型態

opencv keyPoint 型態詳細說明

※ KeyPoint::KeyPoint Parameters : 

  1. pt.x、pt.y : x、y -coordinate of the keypoint
  2. size:keypoint diameter 此點直徑的大小( sift descriptor region size )
  3. octave:代表是從金字塔( Guass pyramid )哪一層提取得到的數據
  4. anglel:keypoint 方向
  5. class_id:分類圖片時,可利用class_id對keypoint做區分( object id )
  6. response:該點的強度大小,該點「角點」的程度


    

2015年12月8日 星期二

Opencv 學習筆記 ─ 找封閉區域

找封閉區域 ─ findContours 函式應用

   
void findContours(InputOutputArray image, OutputArrayOfArrays contours, 
                  int mode, int method, Point offset=Point());
   /*
    mode:
     CV_RETR_EXTERNAL:只取最外層的輪廓。
     CV_RETR_LIST:取得所有輪廓,不建立階層(hierarchy)。
     CV_RETR_CCOMP:取得所有輪廓,儲存成兩層的階層,首階層為物件外圍,
     第二階層為內部空心部分的輪廓,如果更內部有其餘物件,包含於首階層。
     //若要找封閉區域,需要用此mode來做contour間的階層
     CV_RETR_TREE:取得所有輪廓,以全階層的方式儲存。

    method:
     CV_CHAIN_APPROX_NONE:儲存所有輪廓點。
    CV_CHAIN_APPROX_SIMPLE:對水平、垂直、對角線留下頭尾點,所以假如輪廓為一
                            矩形,只儲存對角的四個頂點。
  */
使用範例://部分取自opencv doc 範例
stackoverflow Recognize open and closed shapes opencv

void contour( Mat image, Mat closeArea )
{
 
   vector[int] contours;
   vector[vec4i] hierarchy;
   findContours( image, contours, hierarchy,CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE , Point(0, 0));
   Mat drawing = Mat::zeros( image.size(), CV_8UC3 );
       
   for( int i = 0; i< contours.size(); i++ )
   {
     Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
     drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, Point() );
   }
   for( int i = 0; i< contours.size(); i=hierarchy[i][0] ) // iterate through each contour.
   {
     Rect r= boundingRect(contours[i]);
     if( hierarchy[i][2] >= 0)
     {
       rectangle( closeArea,Point(r.x-10,r.y-10), Point(r.x+r.width+10,r.y+r.height+10),
                Scalar(0,255,0),2,8,0); //closed contour
    } 
    imshow( "Contours", closeArea );
    imshow( "drawing", drawing );
      
}
int main( int argc, char** argv )
{
   // Load source image and convert it to gray
   Mat src = imread( argv[1], 0 );
   Mat thr = imread( argv[1], 1 );
   imshow("src", src); 
   threshold(src,src, 200, 255, THRESH_BINARY);
   imshow("binary", src);
   contour(src,thr);
   cvWaitKey(0);
   return(0);
}

原圖






找到封閉區域






畫出輪廓







心得:

 雖然用在這個例子上很好用, 但用在複雜的圖上,結果就有點糟糕了
findContours在這張圖上,變得像是在找connected component的感覺了
思考了一陣子,發現其實是因為物件的邊緣並無完全封閉
所以造成無法用封閉區域來找到物件位置



原圖








找封閉區域








畫出輪廓


2015年12月7日 星期一

Opencv 學習筆記 ─ IplImage* 與 Mat 的互換

IplImage* 與 Mat 的互換

//IplImage*  -> 轉換 Mat
    IplImage* img01 = cvLoadImage("apple.jpg",1);//用IplImage*讀取圖片
    Mat Mimg01(img01, 0);//丟給MAT
//Mat -> 轉換 IplImage*
     Mat Mimg02 = imread("lena.jpg", 1);//用Mat型別讀取圖片
     IplImage* img02 ;                  //先宣告 IplImage* 型別的img02
     img02 = &IplImage(Mimg02);         //Matimg的位置丟給img02
( 來源:http://tim12332013.blogspot.tw/2013/10/opencviplimage-to-matmat-to-iplimage.html)

研究筆記 ─ CIE LUV 色彩空間

※LUV色彩空間

  • 全稱CIE 1976(L*,u*,v*)(也作CIELUV)色彩空間
  • L*表示物體亮度,u*v*是色度。
  • 1976年由國際照明委員會(International Commission on Illumination)提出。
  • CIE XYZ色彩空間經簡單變換得到,具視覺統一性。
  • CIE LAB色彩空間類似
  • 對於一般的圖像,u*v*的取值範圍為-100+100,亮度為0100
  • 色度圖( 以 u' 、 v' 為座標軸)
※CIE XYZ色彩空間

  • 是其中一個最先採用數學方式來定義的色彩空間,它由國際照明委員會(CIE)于1931年創立。
  • 人類眼睛有對於短(S)、中(M)和長(L)波長光的感受器(叫做視錐細胞),只要三個參數便可描述顏色感覺。
  • 在三色加色法模型中,如果某一種顏色和另一種混合了不同份量的三種原色的顏色,均使人類看上去是相同的話,我們把這三種原色的份量稱作該顏色的三色刺激值。
  • CIE 1931 色彩空間通常會給出顏色的三色刺激值,並以XYZ來表示。
  • RGB 轉 CIE XYZ

※RGB 轉 CIE LUV
  1. 先由 RGB 轉 CIE XYZ
  2. 再由 CIE XYZ 轉 CIE LUV



2015年11月30日 星期一

論文筆記 ─ 隨機森林

隨機森林(Random Forest):

※特點:
  1. 用隨機的方式建立一個森林
  2. 森林由很多的決策樹組成
  3. 決策樹之間是沒有關聯的
  4. 類似分類演算法
  5. 在得到森林之後,當有一個新的輸入樣本進入的時候,就讓森林中的每一棵決策樹分別進行一下判斷,看看這個樣本應該屬於哪一類,然後看看哪一類被選擇最多,就預測這個樣本為那一類。
※建樹:

    在建立每一棵決策樹的過程中,有兩點需要注意 - 採樣與完全分裂。
    首先是兩個隨機採樣的過程,random forest對輸入的資料要進行行、列的採樣。對於行採樣,採用有放回的方式,也就是在採樣得到的樣本集合中,可能有重複的樣本。假設輸入樣本為N個,那麼採樣的樣本也為N個。這樣使得在訓練的時候,每一棵樹的輸入樣本都不是全部的樣本,使得相對不容易出現over-fitting
     然後進行列採樣,從Mfeature中,選擇m(m << M)。之後就是對採樣之後的資料使用完全分裂的方式建立出決策樹,這樣決策樹的某一個葉子節點要麼是無法繼續分裂的,要麼裡面的所有樣本的都是指向的同一個分類。
一般很多的決策樹演算法都一個重要的步驟 - 剪枝,但是這裡不這樣幹,由於之前的兩個隨機採樣的過程保證了隨機性,所以就算不剪枝,也不會出現over-fitting

1)隨機採樣

首先是兩個隨機採樣的過程,random forest對輸入的資料要進行行、列的採樣。

對於行採樣,採用有放回的方式,也就是在採樣得到的樣本集合中,可能有重複的樣本。假設輸入樣本為N個,那麼採樣的樣本也為N個,這選擇好了的N個樣本用來訓練一個決策樹,作為決策樹根節點處的樣本,同時使得在訓練的時候,每一棵樹的輸入樣本都不是全部的樣本,使得相對不容易出現over-fitting

對於列採樣,從Mfeature中,選擇m(m << M),即:當每個樣本有M個屬性時,在決策樹的每個節點需要分裂時,隨機從這M個屬性中選取出m個屬性,滿足條件m << M

2)完全分裂

對採樣之後的資料使用完全分裂的方式建立出決策樹,這樣決策樹的某一個葉子節點要麼是無法繼續分裂的,要麼裡面的所有樣本的都是指向的同一個分類。分裂的辦法是:採用上面說的列採樣的過程從這m個屬性中採用某種策略(比如說資訊增益)來選擇1個屬性作為該節點的分裂屬性。


決策樹形成過程中每個節點都要按完全分裂的方式來分裂,一直到不能夠再分裂為止(如果下一次該節點選出來的那一個屬性是剛剛其父節點分裂時用過的屬性,則該節點已經達到了葉子節點,無須繼續分裂了)。



※優點:
  1.         在資料集上表現良好
  2.     在當前的很多資料集上,相對其他演算法有著很大的優勢
  3.     它能夠處理很高維度(feature很多)的資料,並且不用做特徵選擇
  4.     在訓練完後,它能夠給出哪些feature比較重要
  5.     在創建隨機森林的時候,對generlization error使用的是無偏估計
  6.     訓練速度快
  7.     在訓練過程中,能夠檢測到feature間的互相影響
  8.     容易做成並行化方法
  9.     實現比較簡單



(來源:http://www.cnblogs.com/LeftNotEasy/archive/2011/03/07/random-forest-and-gbdt.html)
random forst 講解影片:https://www.youtube.com/watch?v=NgYj_cSIJeA
decision tree :https://www.youtube.com/watch?v=-dCtJjlEEgM

影片How Random Forest algorithm workshttps://www.youtube.com/watch?v=loNcrMjYh64