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