2010-12-16 19 views
0

私は、IメソッドがIIより遅いことを経験しました。私のアプリケーションはリアルタイムの画像処理を行います。私はC#がこの目的には理想的ではないことを知っていますが、パフォーマンスの重要なことを分けて、C++で作ることができます。私はなぜC#で単純なビットマップの描画を計算せずに遅く思っています。私の質問:C#で高速メソッドがありますか?C#ピクチャボックス描画速度

I. C#: 

void DrawImg(Bitmap b) 
{ 
    pictureBox1.Image = b; 
    pictureBox1.Invalidate(); 
} 

II. C# + C++ + OpenCV 

C# side: 
[DllImport("MyWrapper.dll")] 
static extern void showimg(IntPtr p, int x, int y); 

void DrawImg(Bitmap b) 
{ 
     BitmapData d = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); 
     showimg(d.Scan0, d.Width, d.Height); 
     b.UnlockBits(d); 
} 

C++ side: 
extern "C" void __stdcall showimg(uchar* p, int x, int y) 
{ 
    Mat img; // OpenCV's Mat class 
    img.create(y, x, CV_8UC3); 
    img.data = p; 
    imshow("Window1", img); 
} 

答えて

4

画像のPixelFormatは重要です。今日の大多数のマシンは、ビデオアダプタを32bppモードで実行しています。これにより、Format32bppPArgbは32bppArgbや24bppRgbを含む他のどのフォーマットよりも10倍以上速くなります。その形式でイメージを作成し、必要に応じて変換してください。

また、非常に重要なことは、元のサイズで画像を描画することです。ネイティブコードではそうしますが、必ずしもピクチャボックスではありません。イメージのサイズを変更する必要がある場合は、イメージ上で高品質の補間を使用します。それには時間がかかる。

+0

返信ありがとうございます。私のコードは、(ビットマップを画面にコピーするだけで、画像のサイズを変更したり、スマイリングなどを変換しません。これがデフォルトであるため、ビットマップの形式は32bppArgbです。 – bsebi

+1

PictureBoxは、あなたのスニペットが使用すると言います。ポイントは*ビットマップ形式を変更する*でした、デフォルトを使用しないでください。 –

+0

pictureBox1.SizeMode ==通常のので、サイズ変更はありません。今は別のピクセル形式を試しましたが、それほど大きな違いはありませんでした。 – bsebi

2

私はあなたが何を求めているのか分かりません。なぜC#で描画するのがC++で描画するよりも遅いのですか?主に、.NET Frameworkによって提供される標準のGraphicsクラスは、C/C++で使用されるGDI関数よりもはるかに遅いGDI +描画メソッドを使用するためです。

スピードアップ C#で描画する方法が不思議ですか?遅すぎると感じるコードの関連するセクションを投稿すると最も効果的です。 Graphicsライブラリを使用しているのは確かにいくつかの選択肢よりも遅いですが、大半の場合、パフォーマンスは重要な要素ではありません。タイトなループでたくさんのグラフィックスを描かない限り、何の問題も起こらないようにしてください。もしあなたがそうであれば、あなたのコードはに完全に置き換えられるのではなく、最適化される可能性が高いでしょう。 (もちろん、C#はリアルタイムグラフィックスを実際に探しているときに使いたいものではありません。質問には十分な詳細情報がありません)。

また、GDIをP/Invokeすることもできますベースの描画関数を使用したり、ビットマップを直接操作するためにC#アプリケーションでunsafeコードを使用することを検討してください。同じルーチンを使用しているので、これはあなたの質問で言及したC++ DLLの描画コードと非常に匹敵するパフォーマンスを与えるはずです。しかし、より具体的で役立つアドバイスを提供することがあれば、もう一度、あなたの質問に詳細を記入する必要があります。

+0

返信いただきありがとうございます、私は私の質問を変更しました。 – bsebi

0

PictureBoxは、画像を描くだけではなく、もう少し背景的なことがあります。

paintイベントのコントロール/ウィンドウに直接描画を試みてください。

Graphics.DrawImageUnscaled(...)はおそらく最速のFrameworkメソッドになります。

もっと速くしたい場合は、DirectXまたはOpenGLを見て、専用ハードウェアに図面をオフロードする必要があります。

+0

私はDrawImageUnscaledとOpenGL(OpenTK)を試しました。それでもOpenCVコードが最高です。私の問題は、OpenCVのウィンドウ(バグ)を埋め込むのが難しいことです。 – bsebi

関連する問題