Методы отрисовки видеопотока в WPF - PullRequest
0 голосов
/ 19 июля 2011

Прежде всего, я хочу сказать привет сообществу. Я долго скрывался и ценил это место.

А теперь я работаю над персональной программой обнаружения движения, которая включает в себя библиотеки Aforge и основана на учебнике Эндрю Кириллова, расположенном здесь: http://www.codeproject.com/KB/audio-video/Motion_Detection.aspx?fid=177045&fr=26#xx0xx. Который, кстати, я НАСТОЯТЕЛЬНО рекомендую всем это имеет интерес к теме. Теперь к делу. Этот проект построен с использованием Winforms, я воссоздаю свою собственную версию (кусочки, кусочки и дополнения) с использованием WPF, и я столкнулся с проблемой. Есть раздел, в котором Эндрю использует функцию 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 - это растровое изображение.

Проведя некоторые исследования, я обнаружил, что есть доступная функция onrender, но, похоже, никто не заботится о ней из-за эффективности. Я также рассмотрел возможность назначения создания изображения и назначения растрового изображения в качестве источника, но это не сработало для меня. Любой совет будет принят во внимание. Также, если вам нужна дополнительная информация / код, пожалуйста, дайте мне знать. Спасибо!

Daniel

1 Ответ

0 голосов
/ 19 июля 2011

Вы можете использовать контекст рендеринга WPF в DrawingVisual, чтобы рисовать точно так, как вы показали для Winforms.Основное различие заключается в том, что в WPF он все еще не является режимом рисования в режиме реального времени.Рисование всего контекста рендеринга записывается так же, как и все другие операции WPF, и отображается по расписанию.В моих целях это работало нормально, но я не уверен, что вы увидите хорошую производительность для видео.

Вы также можете назначить растровое изображение, как вы упомянули.Я не уверен, почему это не работает для вас.Возможно, вам нужны некоторые вызовы UpdateLayout для принудительного отображения обновления?

Другой метод заключается в использовании WriteableBitmap, но, опять же, это не рисование в непосредственном режиме, так как в WPF нет немедленного рисования в режиме.Хотя я получаю довольно хорошую производительность, включая анимацию.

Наконец, вы можете использовать WPF для всего, кроме вашей видео поверхности, и использовать хост Winforms для размещения вашей видео панели.Большинство функций WPF прекрасно работают с хостом Winforms, основным исключением является flyover.

...