8

OpenNI を使用して深度処理 (Xbox Kinect、Asus Xtion など) アプリケーションを開発しています。

新しい深度データがセンサー (解像度に応じて 30 または 60 fps) から利用可能になったときに、Windows フォームに描画するための非常にシンプルで高速な方法が必要です。

現在、データが利用可能になったときに別のスレッドからダブルバッファリングされたパネルを無効にしてから、パネルのペイントメソッドでビットマップのピクセルを設定すると、予想通りひどい5fpsが発生します。

System.Drawing.Graphics には、他の方法で指示できない限り、個々のピクセルをすばやく設定する方法がないようです。

文字通りピクセルの色を設定する必要があるだけなので、サードパーティの高速レンダリング API をできるだけ使用しないようにし、できるだけネイティブなものを使用するのが理想的です。

誰か提案はありますか?

4

3 に答える 3

7

ビットマップを使用している場合は、LockBits と UnlockBits を使用してメモリ内のデータに直接アクセスする必要があります。C# では、安全でないコード ブロックとポインターを使用することで、パフォーマンスを向上させることができます。

詳細については、次のリンクを参照してください: http://web.archive.org/web/20150227183132/http://bobpowell.net/lockingbits.aspx

于 2012-06-14T15:44:15.663 に答える
4

image.SetPixel()フレームごとに多くのピクセルを置き換えており、1 秒あたり多くのフレームが必要な場合、非常に遅くなります。

WriteableBitmapを使用してCopyPixelsを呼び出すと、はるかに高速になります

このようにして、複数のスレッドを使用して配列にピクセル データを入力し、1 回の呼び出しで配列を画像に単純にブリットできます。

編集

WriteableBitmap は WPF クラスであることに注意してください。WinForms にバインドされている場合は、独自の実装を作成する必要がある場合があります。WPF/WinForms/GDI相互運用:WriteableBitmapをSystem.Drawing.Imageに変換しますか?

于 2012-06-14T10:27:41.083 に答える
0

私のLINQ画像処理ライブラリを試して、「バッファビットマップ」を操作できます。非常にアクセスしやすい構文を使用しますが、大きなビットマップに対して非常にパフォーマンスが高くなります。これは、プロジェクトに含まれる単一のファイルとしてNugetで利用できます。

それが役立つことを願っています!

于 2012-06-14T16:30:05.057 に答える