前言
 在上一篇是使用DenseHistogram提供的方法快速完成計算的步驟,在此篇要來介紹如何使用CVInvoke包裝的openCV函式來完成計算,並放置DenseHistogram類別
 
 使用CvInvoke方法
  在這邊以Hsv色彩空間為例,計算出Hue色相值方圖
  初始化需要用到的相關類別變數 
  由於CvInvoke中所有使用到的參數型態都以IntPtr為基礎,因此要先初始化會用到的IntPtr變數
   轉換至Hsv空間 
   計算Hue色相值方圖 
   
 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空間 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)
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);
 
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.