Захват кадров с веб-камеры с помощью DirectShow.NET - PullRequest
6 голосов
/ 13 октября 2011

Я новичок в DirectShow, поэтому некоторые части этой библиотеки я не очень хорошо понимаю.Я уже вижу пример DxSnap, но мне нужно захватывать кадры без предварительного просмотра , для дальнейшей обработки.Как я могу это сделать?

Ответы [ 3 ]

11 голосов
/ 13 октября 2011

Если ваша основная задача - «получить доступ к веб-камере», а не «получить доступ к веб-камере с помощью DirectShow», то я бы взглянул на AForge.NET-Framework . Я попробовал это с DirectShow один раз, чтобы выяснить, что я могу сделать то же самое с несколькими источниками видео за меньшее время с меньшим количеством кода.

Вот пример кода: Доступ к USB-камерам и видеофайлам с помощью DirectShow

4 голосов
/ 14 октября 2011

вы могли бы построить его самостоятельно.Если вы загляните в папки windows sdk 7.0 ~, вы можете перейти к сэмплам> multimedia> directshow>, и там должна быть папка filters, которая показывает вам, как создавать универсальные фильтры и делать их с

0 голосов
/ 23 января 2019

Вот пример.Создайте форму Windows, как показано на рисунке.

Нажмите эту ссылку, чтобы увидеть, как выглядит WinForm

  • Сама WinForm имеет имя Form1
  • "Запись... "названа метка lblRecording
  • ComboBox названа cbCameraDevices
  • Имя кнопки" Стоп "равно button1
  • Имя кнопки «Копировать» равно button2
  • Имя кнопки «Пуск» равно btnStartVideo
  • Существует также PictureBox с именем pictureBox1 , в котором будет отображаться видеоизображение.

Эти имена позволяют нам связывать обработчики событий (код ниже) с соответствующим элементом управления.

Если программа успешно собрана и запущена, используйте выпадающий список , чтобы выбрать доступный источник.Нажмите « Start », чтобы увидеть видео.Нажмите « Copy », чтобы клонировать изображение в буфер обмена.Нажмите « Stop », чтобы закрыть канал изображения.

Код был протестирован с использованием Microsoft:

  • Windows 10 - X64 (машина Intel)
  • Сообщество Visual Studio 2017
  • .NET Framework 4.5,

Чтобы построить код, проект, содержащий этот код, должен иметь эти Ссылки :

  • AForge.Video.DirectShow
  • AForge.Video
  • AForge

Пакеты могут быть добавлены в проект NuGet.В Visual Studio IDE:

  1. Инструменты ->
  2. Диспетчер пакетов NuGet ->
  3. Управление пакетом NuGet для решения ...

Найдите «AForge» и установите соответствующие пакеты.

Код:

using System;
using System.Drawing;
using System.Windows.Forms;
using CameraDevice;
using AForge.Video.DirectShow;
using System.Threading;

namespace CameraCaptureTest3
{
    public partial class Form1 : Form
    {
        CameraImaging camImg;
        bool StopVideo = true;
        Thread thrVideo;
        object mImageLock;
        FilterInfoCollection videoDevices;

        public Form1()
        {
            InitializeComponent();
            camImg = new CameraImaging();
            mImageLock = new object();
            // enumerate video devices
            videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            cbCameraDevices.Items.Clear();
            foreach(FilterInfo i in videoDevices) cbCameraDevices.Items.Add(i.Name);
        }

        //---------------------------------------------------------
        // VideoRecordin() is meant to be run on a separate thread
        //---------------------------------------------------------            private void VideoRecording()
        {
            camImg.videoSource.Start();

            while (!StopVideo)
            {
                lock (mImageLock)
                {
                    Bitmap tmp = (Bitmap)camImg.bitmap.Clone();

                    if (InvokeRequired)
                    {
                        BeginInvoke(new MethodInvoker(() =>
                        {
                            pictureBox1.Image = tmp;
                            pictureBox1.Invalidate();
                        }));
                    }
                    else
                    {
                        pictureBox1.Image = tmp;
                        pictureBox1.Invalidate();
                    }
                }
                Thread.Sleep(33);
            }
            camImg.videoSource.Stop();
        }

        private void btnStartVideo_Click(object sender, EventArgs e)
        {
            StopVideo = false;
            try
            {
                camImg.videoSource = new VideoCaptureDevice(camImg.videoDevices[cbCameraDevices.SelectedIndex].MonikerString);
                thrVideo = new Thread(VideoRecording);
                thrVideo.Start();
                Thread.Sleep(1000);
                lblRecording.Visible = true;
            }
            catch (Exception)
            {
                MessageBox.Show("No camera is chosen.", "Exception", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            StopVideo = true;
            if (thrVideo != null) thrVideo.Join();
            lblRecording.Visible = false;
            Application.DoEvents();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            StopVideo = true;
            if (thrVideo != null)
                while (thrVideo.ThreadState == ThreadState.Running)
                    Application.DoEvents();
            pictureBox1.Image = null;
            lblRecording.Visible = false;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Clipboard.SetImage(pictureBox1.Image);
        }
    }
}
...