Статьи

К списку статей

Вопросы программного обеспечения систем видеонаблюдения.

Начало статьи "Вопросы программного обеспечения систем видеонаблюдения" Часть 1 .

Разработка программного кода процедур

В окне программного кода формы UserForm1, ниже уже введенного кода, с новой строки:

Private Sub UserForm_Initialize()
TCap = False
TCap1 = False
mCapHwnd = capCreateCaptureWindow _
("VideoCapture", 0, 0, 0, 320, 240, _
Application.hWnd, 0)
mCapHwnd1 = capCreateCaptureWindow _
("VideoCapture2", 0, 0, 0, 320, 240, _
Application.hWnd, 0)
End Sub

Стандартная процедура инициализации формы. То есть форма загружается в память, но еще не выводится на экран. Убеждаемся, что драйверы видеоустройств отключены, создаем в главном окне Excel два невидимых окна видеозахвата с названиями «VideoCapture» и «VideoCapture2» размером 320х240 пикселей. Функция Application.hWnd возвращает идентификатор главного (родительского) окна Excel.
Присваиваем переменным mCapHwnd и mCapHwnd1 значения идентификаторов созданных окон видеозахвата.

Private Sub CommandButton1_Click()
SendMessageAsLong mCapWnd, _
WM_CAP_DLG_VIDEOFORMAT, 0, 0
End Sub
Private Sub CommandButton5_Click()
SendMessageAsLong mCapWnd1, _
WM_CAP_DLG_VIDEOFORMAT, 0, 0
End Sub

Процедура обработки событий нажатия кнопок «Формат1» и «Формат2», соответственно.
Если драйверы видеоустройств подключены, показывают диалоговое окно настройки формата видеозахвата, если отключены, ничего не происходит.

Private Sub CommandButton2_Click()
SendMessageAsLong mCapWnd, _
WM_CAP_DLG_VIDEOSOURCE, 0, 0
End Sub
Private Sub CommandButton6_Click()
SendMessageAsLong mCapWnd1, _
WM_CAP_DLG_VIDEOSOURCE, 0, 0
End Sub

Процедура обработки событий нажатия кнопок «Камера1» и «Камера2».
Если драйверы видеоустройств подключены, показывают диалоговое окно настройки параметров видеоустройства, если отключены, ничего не происходит.

Private Sub CommandButton4_Click()
TCap = False
SendMessageAsLong mCapHwnd, _
WM_CAP_DRIVER_DISCONNECT, 0, 0
End Sub
Private Sub CommandButton8_Click()
TCap1 = False
SendMessageAsLong mCapHwnd1, _
WM_CAP_DRIVER_DISCONNECT, 0, 0
End Sub

Процедура обработки событий нажатия кнопок «Стоп1» и «Стоп2».
Устанавливаем значения переменной TCap или TCap1 в False (драйвер отключен), после чего посылаем окну видеозахвата системное сообщение с командой отключить драйвер.
Наконец, главная процедура, ради которой и затевался этот проект. Обработка события нажатия кнопки «Старт1»:

Private Sub CommandButton3_Click()
TCap = True
SendMessageAsLong mCapHwnd, _
WM_CAP_DRIVER_CONNECT, 0, 0
Do While TCap = True
For I = 1 To 1000
DoEvents
If I = 1000 Then
SendMessageAsLong mCapHwnd, _
WM_CAP_GRAB_FRAME, 0, 0
SendMessageAsString mCapHwnd, _
WM_CAP_FILE_SAVEDIB, 0, ThisWorkbook.Path & _
"\VIDEO.BMP"
Image1.Picture = LoadPicture _
(ThisWorkbook.Path & "\VIDEO.BMP")
If TCap1 = True Then
SendMessageAsLong mCapHwnd1, _
WM_CAP_GRAB_FRAME, 0, 0
SendMessageAsString mCapHwnd1, _
WM_CAP_FILE_SAVEDIB, 0, ThisWorkbook.Path & _
"\VIDEO1.BMP"
Image2.Picture = LoadPicture _
(ThisWorkbook.Path & "\VIDEO1.BMP")
Else
Image2.Picture = LoadPicture("")
End If
End If
Next
Loop
Image1.Picture = LoadPicture("")
End Sub

Вначале все просто: устанавливаем значения переменной TCap в True (драйвер подлючен) и системным сообщением подключаем драйвер. Дальше начинаются сложности. Дело в том, что в VBA не предусмотрен стандартный компонент Timer, позволяющий генерировать событие через заданные интервалы времени (за что Биллу Гейтсу наш большой «решпект»). Поэтому приходится выкручиваться подручными средствами. Поскольку код процедуры достаточно сложен для непрограммиста, распишем его построчно.
Do While TCap = True - запускаем бесконечный цикл, который будет продолжаться, пока не будет нажата кнопка «Стоп1» (TCap = False). Нижняя граница цикла определена оператором Loop.
For I = 1 To 1000 - внутри цикла запускаем еще один цикл, который перебирает значения от 1 до 1000, каждый раз прибавляя 1. Нижняя граница цикла определена оператором Next.
DoEvents - оператор, жизненно необходимый в нашем проекте. После каждой итерации цикла (прибавления единицы) передает управление другим процессам в приложении (и системе). Нам этот оператор нужен, чтобы периодически передавать управление от одного окна видеозахвата к другому.
If I = 1 Then 1000 - условие. Если итерация в цикле достигла 1000, выполнить нижеследующие процедуры. Нижняя граница условия определена оператором End If.

SendMessageAsLong mCapHwnd, WM_CAP_GRAB_FRAME, 0, 0
SendMessageAsString mCapHwnd, WM_CAP_FILE_SAVEDIB, 0, ThisWorkbook.Path & _
«\VIDEO.BMP»

Посылаем окну видеозахвата команду захватить один кадр из видеопотока и далее - команду сохранить захваченный кадр в файле VIDEO.BMP в каталоге, в котором находится наше приложение (ThisWorkbook.Path).
Image1.Picture = LoadPicture(ThisWorkbook.Path & «\VIDEO.BMP») - загружаем в контейнер изображения Image1 картинку из сохраненного ранее файла.
If TCap1 = True Then - еще одно условие внутри первого условия. Если ко второму окну видеозахвата подключен драйвер, тогда:

SendMessageAsLong mCapHwnd1, WM_CAP_GRAB_FRAME, 0, 0
SendMessageAsString mCapHwnd1, WM_CAP_FILE_SAVEDIB, 0, ThisWorkbook.Path & _
«\VIDEO1.BMP»
Image2.Picture = LoadPicture(ThisWorkbook.Path & «\VIDEO1.BMP»)

Во втором окне захватываем кадр, сохраняем его в файл VIDEO1.BMP и загружаем сохраненный файл в контейнер Image2.
Else - иначе (если драйвер второго окна отключен).
Image2.Picture = LoadPicture(«») - загружаем в контейнер Image2 пустую строку, т.е. очищаем контейнер от изображения.

End If
End If
Next
Loop
Image1.Picture = LoadPicture(«»)
End Sub

Если драйвер первого окна отключен (цикл Do While … Loop закончился и TCap = False), очищаем контейнер Image1 и завершаем процедуру.
Следующая процедура - обработка события нажатия кнопки «Старт2» - полностью аналогична предыдущей процедуре, с той разницей, что привязана ко второму окну видеозахвата и названия переменных изменены на аналогичные, но для другого окна. Комментировать еще раз нет смысла.

Private Sub CommandButton7_Click()
TCap1 = True
SendMessageAsLong mCapHwnd1, _
WM_CAP_DRIVER_CONNECT, 0, 0
Do While TCap1 = True
For I = 1 To 1000
DoEvents
If I = 1000 Then
SendMessageAsLong mCapHwnd1, _
WM_CAP_GRAB_FRAME, 0, 0
SendMessageAsString mCapHwnd1, _
WM_CAP_FILE_SAVEDIB, 0, ThisWorkbook.Path & _
"\VIDEO1.BMP"
Image2.Picture = LoadPicture _
(ThisWorkbook.Path & "\VIDEO1.BMP")
If TCap = True Then
SendMessageAsLong mCapHwnd, _
WM_CAP_GRAB_FRAME, 0, 0
SendMessageAsString mCapHwnd, _
WM_CAP_FILE_SAVEDIB, 0, ThisWorkbook.Path & _
"\VIDEO.BMP"
Image1.Picture = LoadPicture _
(ThisWorkbook.Path & "\VIDEO.BMP")
Else
Image1.Picture = LoadPicture("")
End If
End If
Next
Loop
Image2.Picture = LoadPicture("")
End Sub

Дело в том, что мы не знаем заранее, какое из окон будет запущено или остановлено первым, поэтому в этих двух процедурах мы применяем перекрестный вызов событий. Из процедуры обработки события одного окна вызываем событие второго и наоборот.
Наконец, последняя процедура нашего приложения:

Private Sub UserForm_Terminate()
TCap = False
TCap1 = False
SendMessageAsLong mCapHwnd, _
WM_CAP_DRIVER_DISCONNECT, 0, 0
SendMessageAsLong mCapHwnd1, _
WM_CAP_DRIVER_DISCONNECT, 0, 0
DestroyWindow mCapHwnd
DestroyWindow mCapHwnd1
Unload UserForm1
End Sub

Это стандартная процедура, вызываемая при закрытии окна. Отключаем драйверы, разрушаем оба окна видеозахвата, закрываем форму и выгружаем ее из памяти.
Все. Остались мелочи: в меню нажимаем «Debug» - «Compile VBAProject» и если проект скомпилирован без ошибок, сохраняемся и запускаем приложение.
Работает? А вы не верили!

Заключение

Мы представляем себе, с каким зубовным скрежетом читали эту статью те, кто близко знаком с языками программирования.
Братья! Программисты! Откроем вам страшную тайну: там, во внешнем мире, тоже есть люди! Правда, эти люди - как дети: всему надо учить, все разъяснять на пальцах. Но они тоже хотят знать, почему!
Ну, и для тех самых людей, которые во внешнем мире. Формат журнальной статьи не позволяет рассказать обо всех тонкостях работы с функциями видеозахвата. Мы выбрали только самое основное и все равно переживаем, что безжалостная рука редактора вырежет половину.
А рассказать хотелось бы многое. Например, как изменять формат окна видеозахвата программно, а не из диалогового окна настроек. Как отобразить в контейнере реальное видео, а не сохраненный файл. Как загрузить файл в буфер обмена, а потом вставить его в контейнер, не сохраняя на диск. Не расстраивайтесь, все это будет в следующей статье нашего цикла, помимо детектора движения и записи видео в AVI-файл.
Естественно, если у кого-то что-то не получается или лень перепечатывать букву за буквой, пишите нам письма: antufjev@yandex.ru . Поможем или пришлем готовый файл приложения, благо, что он размером всего 47 Kb, а в архиве и того меньше - 15 Kb. До встречи в следующем номере!

В. Антуфьев, О. Соловей

"Алгоритм Безопасности" № 4, 2006 год.
"


Видеонаблюдение

Внешний вид AN5-21B3.6I Внешний вид AN5-21B3.6I
AN5-21B3.6I
1 947

Производитель Axycam
Внешний вид AD4-P37B3.6I-MG Внешний вид AD4-P37B3.6I-MG
AD4-P37B3.6I-MG
Доступно: 58 шт.
1 250

Производитель Axycam
Внешний вид AN4-37B3.6I-MG white Внешний вид AN4-37B3.6I-MG white
AN4-37B3.6I-MG white
Доступно: 197 шт.
1 350

Производитель Axycam
Внешний вид AD-P31B3.6I-AHD Внешний вид AD-P31B3.6I-AHD
  • - 1/4" 1Мр Omnivision
  • - 720p ( 30 к/с)
  • - 3.6mm
  • - подсветка - 20м
1 233

Производитель Axycam
Внешний вид AD-P31B2.8I-AHD Внешний вид AD-P31B2.8I-AHD
AD-P31B2.8I-AHD
1 363

Производитель Axycam
Внешний вид AN5-31B3.6I-AHD white/dark grey Внешний вид AN5-31B3.6I-AHD white/dark grey
AN5-31B3.6I-AHD white/dark grey
2 402

Производитель Axycam
Внешний вид AD-31B3.6I-AHD Внешний вид AD-31B3.6I-AHD
  • - 1/4" 1Мр Omnivision
  • - 720p ( 30 к/с)
  • - 3.6mm
  • - подсветка - 25м
2 012

Производитель Axycam
Внешний вид AD7-31V12I-AHD Внешний вид AD7-31V12I-AHD
  • - 1/4" 1Мр Omnivision
  • - 720p ( 30 к/с)
  • - 2.8-12mm
  • - подсветка - 25м
3 310

Производитель Axycam
Внешний вид AD-P33B3.6NIL Внешний вид AD-P33B3.6NIL
AD-P33B3.6NIL
Доступно: 3 шт.
4 024

Производитель Axycam
Внешний вид AN4-37V12I-MG Внешний вид AN4-37V12I-MG
  • - 1/4" 1Мр H42
  • - 720p ( 30 к/с)
  • - 2.8-12mm
  • - подсветка - 40м
4 219

Производитель Axycam
Найдено товаров: 1802
1 2 3 4 5

Возврат к списку

Создание проекта системы видеонаблюдения всего за несколько минут;
Все РЕАЛЬНО: в т.ч. сектора наблюдения, параметры кабельных трасс;
Загрузка готовых планов и их масштабирование;
Спецификация обрудования и смета создается автоматически;
Дружелюбный интерфейс;
Индивидуальные настройки программы и оборудования.
Техподдержка встроена непосредственно в программу.
Регистрация занимает одну минуту.

ОТ ЗАПРОСА ДО ОФОРМЛЕННОГО ПРЕДЛОЖЕНИЯ - 15 МИНУТ