2013年3月3日 星期日

[EmguCV]計算直方圖-使用CvInvoke

前言

上一篇是使用DenseHistogram提供的方法快速完成計算的步驟,在此篇要來介紹如何使用CVInvoke包裝的openCV函式來完成計算,並放置DenseHistogram類別

使用CvInvoke方法

在這邊以Hsv色彩空間為例,計算出Hue色相值方圖
  • 初始化需要用到的相關類別變數
  • 由於CvInvoke中所有使用到的參數型態都以IntPtr為基礎,因此要先初始化會用到的IntPtr變數
    IntPtr srcImage; //來源影像
    //1.從檔案路徑初始化;srcFileName為字串
    srcImage = CvInvoke.cvLoadImage(srcFileName, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR);
    //2.從Emgu所使用的Image型態轉換至IntPtr
    Image image;
    srcImage = image.Ptr; //Image有提供取得IntPtr的屬性
    
    DenseHistogram histDense; //最後計算完存放回DenseHistogram類別
    //使用CvInvoke的cvCreateImage方法分別創建存放轉換至Hsv色彩空間的影像與分割取得Hue通道的影像
    IntPtr hsv = CvInvoke.cvCreateImage(CvInvoke.cvGetSize(srcImage), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 3);
    IntPtr h_plane = CvInvoke.cvCreateImage(CvInvoke.cvGetSize(srcImage), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
  • 轉換至Hsv空間
  • //輸入圖像並轉換至Hsv空間
    CvInvoke.cvCvtColor(srcImage, hsv, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_BGR2HSV); //hsv是目的地影像
    CvInvoke.cvSplit(hsv, h_plane, IntPtr.Zero, IntPtr.Zero, System.IntPtr.Zero); //影像通道分離,依序是h,s,v(s與v未用到所以填為IntPtr.Zero)
       
  • 計算Hue色相值方圖
  • int h_bins = 32;
    RangeF hRange = new RangeF(0f, 180); //H色調分量的變化範圍
    histDense = new DenseHistogram(h_bins, hRange);
    //雖然填寫的參數型態是IntPtr,而DenseHistogram類別有繼承自UnmanagedObject,因此具備轉換成IntPtr可作為填入參數
    CvInvoke.cvCalcHist(new IntPtr[] { h_plane }, histDense, true, System.IntPtr.Zero); 

    H-S值方圖範例

    //1.初始化
    DenseHistogram histDense;
    int[] hist_size = new int[2] { h_bins, s_bins };
    IntPtr hsv = CvInvoke.cvCreateImage(CvInvoke.cvGetSize(srcImage), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 3);
    IntPtr h_plane = CvInvoke.cvCreateImage(CvInvoke.cvGetSize(srcImage), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
    IntPtr s_plane = CvInvoke.cvCreateImage(CvInvoke.cvGetSize(srcImage), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
    
    //2.輸入圖像並轉換至Hsv空間
    CvInvoke.cvCvtColor(srcImage, hsv, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_BGR2HSV);
    CvInvoke.cvSplit(hsv, h_plane, s_plane, System.IntPtr.Zero, System.IntPtr.Zero); // 分离的单通道数组d
    
    //3.創建直方圖
    RangeF hRange = new RangeF(0f, 180);       //H色調的變化範圍
    RangeF sRange = new RangeF(0f, 255);       //S飽和度的變化範圍
    histDense = new DenseHistogram(hist_size, new RangeF[] { hRange, sRange });
    CvInvoke.cvCalcHist(new IntPtr[] { h_plane, s_plane }, histDense, false, System.IntPtr.Zero);

    參考資料

    1 則留言:

    1. Playcasino in Iowa: Now Open! | Jtm Hub
      A full 동두천 출장마사지 list 여수 출장마사지 of online 밀양 출장마사지 casinos is available today, 시흥 출장안마 including top-rated Casinos, and the latest promotions! Get details 제주도 출장안마 on the bonus codes & promotions.

      回覆刪除