0

まず、コミュニティに挨拶したいと思います。私はこの場所の長い間潜んでいて、感謝しています。

今のところ、私はAforgeライブラリを組み込んだ個人の動き検出プログラムに取り組んでおり、ここにあるAndrew Kirillovのチュートリアル(http://www.codeproject.com/KB/audio-video/Motion_Detection.aspx? )に強く基づいています。 fid = 177045&fr = 26#xx0xx。ちなみに、このトピックに興味のある人には強くお勧めします。ここで要点を説明します。このプロジェクトはwinformsを使用して構築されており、WPFを使用して独自のバージョン(ビット、ピース、および追加)を再作成していますが、問題が発生しました。AndrewがOnPaint関数を利用するセクションがあり、私はwpfでの描画の処理方法に苦労しています。これが彼のコードです(マイナーな変更が必要です)

// Paint control
    protected override void OnPaint(PaintEventArgs pe)
    {

        // lock
        Monitor.Enter(this);

        var g = pe.Graphics;
        var rc = ClientRectangle;
        var pen = new Pen(m_RectColor, 1);

        // draw rectangle
        g.DrawRectangle(pen, rc.X, rc.Y, rc.Width - 1, rc.Height - 1);

        if (m_Camera != null)
        {
            try
            {
                m_Camera.Lock();

                // draw frame
                g.DrawImage(m_Camera.LastFrame, rc.X + 1, rc.Y + 1, rc.Width - 2, rc.Height - 2);
            }
            catch (Exception) { }
            finally
            {
                m_Camera.Unlock();
            }
        }
        pen.Dispose();

        // unlock
        Monitor.Exit(this);
        base.OnPaint(pe);
    }

もう少し洞察を提供するために、m_Camera.LastFrameはビットマップです。

調べてみると、レンダリング機能が利用できることがわかりましたが、効率の良さからあまり気にしないようです。また、イメージの確立とビットマップのソースとしての割り当ての可能性についても検討しましたが、それはうまくいきません。何かアドバイスをいただければ幸いです。また、より多くの情報/コードが必要な場合は、私に知らせてください。ありがとう!

ダニエル

4

1 に答える 1

0

DrawingVisualでWPFレンダリングコンテキストを使用して、Winformsで示したのとまったく同じ方法で描画できます。主な違いは、WPFではまだ即時モード描画ではないことです。すべてのレンダリングコンテキスト描画は、他のすべてのWPF操作と同じように記録され、スケジュールに従ってレンダリングされます。私の目的では問題なく動作しましたが、ビデオで良好なパフォーマンスが得られるかどうかはわかりません。

おっしゃるように、ビットマップを割り当てることもできます。なぜそれがうまくいかないのかわかりません。おそらく、更新を強制的に表示するために、いくつかのUpdateLayout呼び出しが必要ですか?

もう1つの方法は、WriteableBitmapを使用することですが、WPFには即時モードの描画がないため、これも即時モードの描画ではありません。アニメーションも含めて、かなり良いパフォーマンスが得られます。

最後に、ビデオサーフェスを除くすべてにWPFを使用し、Winformsホストを使用してビデオパネルをホストできます。ほとんどのWPF機能は、Winformsホストで問題なく機能しますが、主な例外はフライオーバーです。

于 2011-07-18T21:58:33.417 に答える