2012-05-02 74 views
1

我正在製作一個XNA應用程序,我從網絡攝像頭每秒捕獲4次屏幕截圖,然後嘗試在像素顏色紅色低於特定閾值時將其轉換爲布爾數組。當我將它轉換爲Texture2D時,它不會滯後,但是當我嘗試獲取單個像素時,它確實會滯後,即使網絡攝像頭分辨率爲176x144。在C#中將位圖轉換爲布爾型數組的快速方法?

這是搶位圖的代碼:

public Bitmap getBitmap() 
    { 
     if (!panelVideoPreview.IsDisposed) 
     { 
      Bitmap b = new Bitmap(panelVideoPreview.Width, panelVideoPreview.Height, PixelFormat.Format32bppRgb); 
      using (Graphics g = Graphics.FromImage(b)) 
      { 
       Rectangle rectanglePanelVideoPreview = panelVideoPreview.Bounds; 
       Point sourcePoints = panelVideoPreview.PointToScreen(new Point(panelVideoPreview.ClientRectangle.X, panelVideoPreview.ClientRectangle.Y)); 
       g.CopyFromScreen(sourcePoints, Point.Empty, rectanglePanelVideoPreview.Size); 
      } 

      return b; 
     } 
     else 
     { 
      Bitmap b = new Bitmap(panelVideoPreview.Width, panelVideoPreview.Height); 
      return b; 
     } 
    } 

這是將位圖轉換爲布爾數組的代碼:

public bool[,] getBoolBitmap(uint treshold) 
    { 
     Bitmap b = getBitmap(); 

     bool[,] ar = new bool[b.Width, b.Height]; 

     for (int y = 0; y < b.Height; y++) 
     { 
      for (int x = 0; x < b.Width; x++) 
      { 
       if (b.GetPixel(x, y).R < treshold) 
       { 
        ar[x, y] = false; 
       } 
       else 
       { 
        ar[x, y] = true; 
       } 
      } 
     } 

     return ar; 
    } 
+10

GetPixel()非常慢,它必須鎖定每個像素的位圖數據。改用Bitmap.LockBits()。當你把它放在搜索框中時有很多點擊。 –

回答

2

由Hans帕桑特提供的答案是正確的,它最好使用LockBits並一次處理所有數據。

您也可以嘗試編寫一個可對數據進行閾值限制的着色器,從而利用GPU的能力以更快的速度並行處理輸入圖像流。

相關問題