2

いくつかのカメラ (RAW データの配列) からデータをキャプチャしています。

次に、このデータをカラー パレットに従って RGB 値にマッピングします。

できるだけ早くマップする必要があるため、BitmapDdataポインターを使用して安全でないコードでピクセルを使用および編集します。

public void dataAcquired(int[] data)
{
    Bitmap bmp = new Bitmap(width, height); 
    BitmapData data = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

    for (int i = 0; i < data.Length; i++)
    {
        int x = i % bmp.Width;
        int y = i / bmp.Width;
        Rgb rgb = mapColors[data[i]];

        unsafe
        {
            byte* ptr = (byte*)data.Scan0;
            ptr[(x * 3) + y * data.Stride] = rgb.b;
            ptr[(x * 3) + y * data.Stride + 1] = rgb.g;
            ptr[(x * 3) + y * data.Stride + 2] = rgb.r;
        }
    }
    bmp.UnlockBits(data);
}

そして、私はすべての受信フレームに対してこれを行っています。正常に動作しますが、320x240 ピクセルのフレームごとに 30 ミリ秒程度かかります。

さらに高速化することは可能ですか?メモリ内のデータを一度だけロック/ロック解除できたかもしれませんが、これについてはわかりません。

4

2 に答える 2

6

各ピクセルの x と y を計算する代わりに、次のようにループ カウンターを作成できます。

for( y = 0;  y < bmp.Height;  y++ )
    for( x = 0;  x < bmp.Width;  x++ )

さらに良いことに、ピクセルごとptrに 3 回ポインタからオフセットを再計算する代わりに、x と y を完全に捨てて、ポインタをインクリメントし続けます。ptr

これを試してください(警告:チェックしていません。)

public void dataAcquired()
{
    Bitmap bmp = new Bitmap(width, height); 
    BitmapData data = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
    unsafe
    {
        int i = 0;
        byte* ptr = (byte*)data.Scan0;
        for( int y = 0;  y < bmp.Height;  y++ )
        {
            byte* ptr2 = ptr;
            for( int x = 0;  x < bmp.Width;  x++ )
            {
                Rgb rgb = mapColors[data[i++]];
                *(ptr2++) = rgb.b;
                *(ptr2++) = rgb.g;
                *(ptr2++) = rgb.r;
            }
            ptr += data.Stride;
        }
    }
    bmp.UnlockBits(data);
}
于 2015-02-04T14:17:14.753 に答える
2

コードを並行して実行してみてください:変更

for (int i = 0; i < data.Length; i++) {
  ...
}

の中へ

  Parallel.For(0, data.Length, (i) => {
    int x = i % bmp.Width;
    int y = i / bmp.Width;
    Rgb rgb = mapColors[data[i]];

    unsafe {
      byte* ptr = (byte*) data.Scan0;
      ptr[(x * 3) + y * data.Stride] = rgb.b;
      ptr[(x * 3) + y * data.Stride + 1] = rgb.g;
      ptr[(x * 3) + y * data.Stride + 2] = rgb.r;
    }
  });
于 2015-02-04T14:16:39.143 に答える