2012-05-02 3 views
1

Webカメラからスクリーンショットを4回キャプチャしたXNAアプリケーションを作成しています。次に、ピクセルカラーの赤が特定のしきい値を下回ったときにブール値配列に変換しようとします。 Texture2Dに変換すると遅くなることはありませんが、個々のピクセルを取得しようとすると、Webカメラの解像度が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

ハンスアンパッサンによって提供される回答が正しいか、それはLockBitsを使用して、すべてのデータを一度に処理する方が良いです。

また、データをスレッショルドするシェーダーを作成し、GPUのパワーを利用して、入力イメージストリームをずっと高速に並列処理することもできます。

関連する問題