星期一, 3月 16, 2009

Week 5: 將影像讀入陣列之中

本週要請同學思考的問題是如何將存於影像物件之中的色彩值, 讀入到陣列變數之中, 以供程式處理之用。

目前, 大部分同學已經會從顯示在螢幕上的視訊, 擷取一個畫面到影像物件之中, 為了提升對影像內容的分析效能, 有必要進一步影像元件中的色彩內容放到陣列中, 讓程式可以直接分析。

第一個方法是使用 Canvas 元件的 Pixels Property (TCanvas::Pixels), Pixels 的資料型態為 TColor datatype, 因此, 可以用如下的程式碼, 將色彩值讀入到陣列 tcColorMatrix 之中。

 for (i=0;i<iImageHeight;i++)
  for (j=0;j<iImageWidth;j++) 
   tcColorMatrix1[i][j] = Image1->Canvas->Pixels[j][i];
 
第二個方法是透過 Bitmap 元件的 ScanLine Property 來取得存放每一列色彩值的起始指標, 再透過該指標依序取得每一個像素的色彩值。

 Byte *ptr; // 宣告指標變數;

 for (i=0;i<iImageHeight;i++)
  {
  ptr = (BYTE *) Image1->Picture->Bitmap->ScanLine[i];
  k = 0;
  for (j=0;j<iImageWidth;j++)
   { 
   tcColorMatrix1[i][j] = (TColor) RGB(ptr[k+2],ptr[k+1],ptr[k]);
   k = k + 3;
   }
 
接下來, 同學可以將之前所寫的程式, 改寫成使用 Scanline Property 的方式, 以加快程式的執行效能。
範例程式 SampleProgram5.txt
 

沒有留言: