Зачем надо?
В чистом .Net нет поддержки работы с web камерами. Попробовав несколько библиотек, я остановился на Aforge.net. Aforge.net — это фреймворк для решения разнообразных задач, подробнее о которых можно узнать на оригинальном сайте AForge.NET. От туда необходимо скачать фреймворк и установить его. Либо скачать только библиотеки. Лично я предпочитаю скачивать установочный файл.
Для начала нам понадобятся следующие библиотеки:
- AForge.dll
- AForge.Controls.dll – библиотека с элементами управления
- AForge.Imaging.dll – библиотека для обработки изображений
- AForge.Math.dll
- AForge.Video.dll – библиотека для захвата и воспроизведения видео
- AForge.Video.DirectShow.dll – библиотека для захвата и воспроизведения видео средствами DirectShow
1. Подготовка проекта и формы
Создайте новый проект типа Windows Forms и добавьте в него ссылки на библиотеки AForge.Video.dll, AForge.Video.DirectShow.dll. На панель Toolbox добавьте контроллы из библиотеки AForge.Video.Controls.dll. На форму добавьте контроллы: (ComboBox) cmbCameras, (Button) butRefresh, butStart, butStop. Добавьте контролл из библиотеки AForge.Controls.dll (AForge.Controls.VideoSoursePlayer) Player.
2. Поиск устройств видеозахвата
Процедура обработки события нажатия кнопки Refresh:
Public Class frmMain
' Коллекция устройств видеозахвата
Private VideoDevices As AForge.Video.DirectShow.FilterInfoCollection
' Создание коллекции устройств видеозахвата
Private Sub butRefresh_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles butRefresh.Click
VideoDevices = New AForge.Video.DirectShow.FilterInfoCollection
(AForge.Video.DirectShow.FilterCategory.VideoInputDevice)
' Очистка списка устройств
cmbCameras.Items.Clear()
' Если устройства не найдены
If VideoDevices.Count = 0 Then
cmbCameras.Text = "Not found"
Else
' Если устройства найдены, добавить их имена в список
For Each Device As AForge.Video.DirectShow.FilterInfo In VideoDevices
cmbCameras.Items.Add(Device.Name)
Next
' Выбрать первое устройство из списка
cmbCameras.SelectedIndex = 0
End If
End Sub
End Class
Запустите проект, нажмите кнопку Refresh. В комбобоксе появятся все видеокамеры, подключенные к компьютеру.
3. Захват видео
Процедура обработки события нажатия кнопки Start:
' Захват видео
Private Sub butStart_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles butStart.Click
' Выбор источника видеозахвата из комбобокса и передача ссылки на него в проигрыватель
Player.VideoSource = New AForge.Video.DirectShow.VideoCaptureDevice
(VideoDevices(cmbCameras.SelectedIndex).MonikerString)
' Запуск захвата видео
Player.Start()
End Sub
4. Остановка захвата видео
Процедура обработки события нажатия кнопки Stop:
' Остановка захвата видео
Private Sub butStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butStop.Click
Player.WaitForStop()
End Sub
5. Многопоточность
Т.к. захват видеопотока библиотекой AForge производится в отдельном потоке, то при закрытии окна процесс все равно останется запущенным. Для этого необходимо принудительно завершать видеозахват во время закрытия окна.
' Закрытие формы
Private Sub frmMain_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
Player.WaitForStop()
End Sub
6. Простейшая обработка кадра
Библиотека AForge содержит огромное количество обработчиков кадра. В данном примере они не будут рассматриваться, однако, необходимо знать как получить и изменить полученный от камеры кадр. Для примера добавим в кадр текущее время и, например, прицел.
Процедура обработки события получения нового кадра:
' Обработчик события получения нового кадра
Private Sub Player_NewFrame(ByVal sender As Object, ByRef image As System.Drawing.Bitmap) Handles Player.NewFrame
' Создание GDI+ "холста для рисования"
Dim G As Graphics = Graphics.FromImage(image)
' Создание шрифта для отрисовки текста (можно объявить в переменных класса)
Dim fntTime As New Font("Arial", 14)
' Точка центра изображения
Dim pntCenter As New Point(image.Width \ 2, image.Height \ 2)
' Отрисовка текста
G.DrawString(Now.ToString, fntTime, Brushes.Yellow, 10, 10)
' Отрисовка перекрестия по центру изображения
G.DrawLine(Pens.White, pntCenter.X, pntCenter.Y - 15, pntCenter.X, pntCenter.Y + 15)
G.DrawLine(Pens.White, pntCenter.X - 15, pntCenter.Y, pntCenter.X + 15, pntCenter.Y)
' Высвобождение памяти
fntTime.Dispose()
G.Dispose()
End Sub
Код класса полностью
#visualbasic #aforge