kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
Pepin  z Hané
Pepin z Hané
Вопрос

Получить изображение из видео

Я пытаюсь написать приложение, которое может получить доступ к камерам, подключенным к ПК, записать видео и получить изображение из видео. Для доступа к камерам я использую библиотеки AForge.NET: http://www.aforgenet.com/framework/

Я не знаю, как работает событие AForge.Video.NewFrameEventHandler. В этом коде событие возвращает null в битмап вместо нового кадра из видео или событие не вызывается. Я хочу получать кадры из видео в picture box каждый таймфрейм, чтобы сделать что-то вроде видео потока и после нажатия на кнопку stop я хочу, чтобы последнее изображение оставалось отображенным в picture box. Кто-нибудь знает, как это сделать? И почему мой код не работает?

Код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AForge.Video.DirectShow;
using System.Drawing;
using AForge.Video;

namespace CameraDevice
{
    public class CameraImaging
    {
        // enumerate video devices
        public FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice );
        //camera
        public VideoCaptureDevice videoSource;
        //screen shot
        public Bitmap bitmap;
        public CameraImaging()
        {
            // create video source
            VideoCaptureDevice videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString );
            // set NewFrame event handler
            videoSource.NewFrame += new NewFrameEventHandler( video_NewFrame );
        }
        public void StartVideo(VideoCaptureDevice videoSource)
        {
            // start the video source
            videoSource.Start();
            // ...
        }
        public void StopVideo(VideoCaptureDevice videoSource)
        {
            // stop the video source
            videoSource.Stop();
            // ...
        }
        private void video_NewFrame( object sender, NewFrameEventArgs eventArgs )
        {
            // get new frame
            bitmap = eventArgs.Frame;
            // process the frame
        }
    }
}

Похожий код находится здесь: http://www.aforgenet.com/framework/features/directshow_video.html[^]

В Windows Forms я запускаю это видео в потоке, который выполняет этот метод:

private void VideoRecording()
    {
        camImg.videoSource.Start();

        while (!StopVideo)
        {
            pictureBox1.Image = camImg.bitmap;
            pictureBox1.Invalidate();
        }
        camImg.videoSource.Stop();

    }
10 2012-10-22T18:22:39+00:00 3
Программирование
.net
c#
video-processing
aforge
 A.J.Bauer
A.J.Bauer
12-го июня 2013 в 9:32
2013-06-12T09:32:35+00:00
Дополнительно
Источник
Редактировать
#17528500

Если я правильно помню, битмап нужно копировать сразу, так как он перезаписывается после события. Использование ссылки здесь не подходит. Попробуйте что-нибудь вроде:

private void video_NewFrame( object sender, NewFrameEventArgs eventArgs )
{
    // copy the new frame
    bitmap = new Bitmap(eventArgs.Frame);
    // process the frame
}

или

private void video_NewFrame( object sender, NewFrameEventArgs eventArgs )
{
   // clone new frame
   bitmap = eventArgs.Frame.Clone();
   // process the frame
}

Также не стоит использовать дополнительный поток для этого, AForge уже делает это.

  1. Вызовите Start (например, в событии загрузки или после нажатия кнопки).

  2. Обработать события кадра

    private void VideoStream_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs) { Bitmap newFrame = new Bitmap(eventArgs.Frame); pictureBox1.Image = newFrame; }

  3. Вызов остановки (событие закрытия или кнопка)

Если у вас возникли проблемы с элементами управления WinForm, например, с меткой, вам нужно знать, что эти элементы управления были созданы в другом потоке, и вам нужно использовать Invoke. Например:

label_ms.Invoke((MethodInvoker)(() => label_ms.Text = msTimeSpan.TotalMilliseconds.ToString()));

Лучше всего посмотреть этот пример AForge, который поставляется вместе с фреймворком: http://aforge.googlecode.com/svn/trunk/Samples/Video/Player/

 A.J.Bauer
A.J.Bauer
Редактировал ответ 12-го июня 2013 в 9:54
3
0
Niels Schmidt
Niels Schmidt
20-го октября 2013 в 5:59
2013-10-20T05:59:47+00:00
Дополнительно
Источник
Редактировать
#17528501

Я использую библиотеку видео Aforge с моими камерами Foscams, и она работает очень хорошо. Вот мой код для обработчика события.

private void Video_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
    {
        //Create Bitmap from frame
        Bitmap FrameData = new Bitmap(eventArgs.Frame);
        //Add to PictureBox
        PictureBox.Image = FrameData;
    }
1
0
Ben Lesh
Ben Lesh
22-го октября 2012 в 6:27
2012-10-22T18:27:59+00:00
Дополнительно
Источник
Редактировать
#17528499

Один из способов - получить или написать обертку вокруг FFMPEG, которая может сделать за вас работу по извлечению изображений из вашего видео. Я'работал над двумя проектами, в которых использовался этот способ получения миниатюр и/или снимков из загруженных видео. Это будет немного халтурно, но должно сработать.

 Community
Community
Редактировал ответ 23-го мая 2017 в 12:34
0
0
Похожие сообщества 16
DotNetRuChat
DotNetRuChat
6 630 пользователей
Чат русскоязычного .NET сообщества http://dotnet.ru/ Правила: https://t.me/DotNetRuChat/704399 Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @AvaloniaRU, @xamarin_russia, @DotNetRuJobs, @uwp_ru Флуд в @dotnettalks
Открыть telegram
Вакансии .NET
Вакансии .NET
3 530 пользователей
Правила: https://t.me/DotNetRuJobs/123 Канал с вакансиями - https://t.me/DotNetRuJobsFeed Вам могут быть интересны: @dotnetruchat, @cilchat, @fsharp_chat, @pro_net, @AvaloniaRU, @xamarin_russia Флуд в @dotnettalks
Открыть telegram
Microsoft Stack Jobs
Microsoft Stack Jobs
2 408 пользователей
Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks
Открыть telegram
С#
С#
2 330 пользователей
Стараемся не флудить. Пишем по делу. Правила: https://t.me/professorweb/430450 Для флуда @svoboda_obsh
Открыть telegram
pro.net
pro.net
1 820 пользователей
Обсуждение .NET и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). https://t.me/pro_net/34653 Флудилка: @dotnettalks
Открыть telegram
CODE BLOG / C#
CODE BLOG / C#
1 763 пользователей
Чат для .NET разработчиков и C# программистов. По всем вопросам: @shwanoff Youtube-канал: https://youtube.com/codeblog Основной канал: @codeblog Вконтакте: https://vk.com/codeblog Правила: https://t.me/codeblog_csharp/246972 Вакансии по тегу #work
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Денис Васьков
Зарегистрирован 15 часов назад
2
Dima Patrushev
Зарегистрирован 2 дня назад
3
sirojidddin otaboyev
Зарегистрирован 1 неделю назад
4
Елена Гайдамамакинат
Зарегистрирован 1 неделю назад
5
Иван Степанюк
Зарегистрирован 1 неделю назад
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией