Przechwytywanie ramek z kamery internetowej przy użyciu DirectShow.NET


Jestem nowy w DirectShow, więc nie rozumiem zbyt dobrze niektórych części tej biblioteki.
Widzę już przykład DxSnap, ale potrzebuję

pobierz materiał bez podglądu
, do dalszego przetwarzania. W jaki sposób mogę to zrobić?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli Twoim głównym zmartwieniem jest „dostęp do kamery internetowej”, a nie „dostęp do kamery internetowej z DirectShow”, to przyjrzę się

AForge.NET-Framework
http://www.aforgenet.com/framework/... Kiedyś wypróbowałem to z DirectShow tylko po to, aby dowiedzieć się, że mogę zrobić to samo z wieloma źródłami wideo w krótszym czasie i przy mniejszej ilości kodu.
Oto przykładowy kod:

dostęp do kamer USB i plików wideo za pomocą DirectShow
http://www.aforgenet.com/frame ... .html
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

mógłbyś sam to zbudować. Jeśli zajrzysz do folderów systemu Windows sdk 7.0 ~, możesz przejść do sekcji samples & > multimedia & > directshow & > i powinien istnieć folder filtrów, który pokaże Ci, jak tworzyć ogólne filtry i robić, co chcesz
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Oto przykład. Zbuduj formę okien, jak pokazano na rysunku.
Kliknij ten link, aby zobaczyć, jak to wygląda
https://i.stack.imgur.com/GWHBP.png
WinForm
  • Sam WinForm nazywa się Form1
  • Nosi nazwę „Recording ...” lblRecording
  • Nazywa się ComboBox cbCameraDevices
  • Nazwa przycisku „Stop” to przycisk button1
  • Nazwa przycisku „Kopiuj” button2
  • "Rozpocznij" nazwę przycisku btnStartVideo
  • Istnieje również pictureBox o nazwie pictureBox1 , który pokaże obraz wideo.

Nazwy te umożliwiają skojarzenie programów obsługi zdarzeń (kod poniżej) z odpowiednią kontrolką.
Jeśli program buduje się i działa pomyślnie, użyj

combobox

aby wybrać dostępne źródło. Kliknij "

Początek

", aby wyświetlić strumień wideo. Kliknij przycisk"

Kopiuj

", aby sklonować obraz do schowka. Kliknij przycisk"

Zatrzymać

"aby zamknąć kanał.
Kod został przetestowany z Microsoft:
  • Windows 10-X64 (komputer Intel)
  • Społeczność programu Visual Studio 2017
  • .NET Framework 4.5.

Aby skompilować kod, projekt zawierający ten kod musi mieć następujące elementy

spinki do mankietów

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

Pakiety można pobrać do projektu NuGet. W środowisku Visual Studio IDE:
  • Narzędzia - & >
  • Menedżer pakietów NuGet - & >
  • Zarządzanie pakietami NuGet dla rozwiązania ...

Wyszukaj „AForge” i zainstaluj odpowiednie pakiety.
Kod:
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);
}
}
}

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się