ActiveX компонента WebCamX для работы с веб-камерой!
Искал нормальную компоненту без .NET для работы с Web-камерой, нашел одну, но она платная.
Тогда я решил сделать свою ActiveX.
Моя компонента умеет:
1. - Получать изображение с камеры.
2. - Писать видео с камеры в файл, в формате (*.asf).
3. - Делать снимок с камеры и сохранять в файл, в форматах (*.bmp; *.jpg; *.png).
4.- Умеет проигрывать видео.
Для начало работы необходимо зарегистрировать компоненту в системе. Например:
regsvr32 "Полный путь к файлу WebCamX.ocx"
Так же имеется обработка пример для 1с8.2. В этой обработке показано как можно работать с этой компонентой.
Желаю удачи! Не забываем ставить плюсы и коментить :)
Это все работает только в usb камерами, а я хотел такое реализовать с ip камерами. в принципе удалось это сделать. использование программы devline эсли камера не выдает на сеть стандартный протокол видео, в принцыпе у них же есть и пример обработки для внедрения в 1с, если нету обращайтесь в компанию "КорневСофт"
В общем-то работа с ip-камерами вообще никаких проблем не представляет. Любая контора (а не только КорневСофт), которая выпускает ip-камеры, реализует сразу интерфейс для работы с ними через браузер. Видеопоток с камеры транслируется в окно браузера через их activex. Соответственно зная интерфейс управления этим activex (обычно это несколько простых методов и свойств которые можно узнать в любом вьюере объектов) можно вставить его в форму 1С через WebBrowser ActiveX, и иметь живой поток. Также IP-камеры по сравнению с usb-веб-камерами имеют намного более развитые интерфейсы для работы с ними по различным протоколам и могут по команде извне предоставлять скриншоты, куски видео, данные архива записей и т.д. Также функционал снятия скриншота может быть реализован как один из методов activex.
С usb-веб-камерами возникает уйма проблем, я это всё прочувствовал на собственной шкуре когда внедрял один крупный проект на них. Во-первых качество изображения этих камер ужасное даже в условиях нормальной освещенности, нет защиты от воды/жары/холода - так как камеры предназначаются для работы в помещениях. Очень малое расстояние от ПК до камеры, при котором они работают стабильно и работают вообще. Нет защиты от пересвета - это блики от снега/льда/луж, прямой солнечный свет - опять же следствие их предназначения для помещений. Нет нормальных интерфейсов для управления камерами. Нет сменных объективов, нормальной фокусировки, зума, поворота и т.д.
С IP-камерами намного лучше, есть много моделей предназначенных для работы в жестких уличных условиях, в дорогих модели этих камер устранены все вышеперечисленные недостатки. Витая пара (или WiFi) дает возможность отнести их на любое расстояние от ПК. Разрешение IP-камер на данный момент - до 5 мегапикселей при 15 кадрах в секунду (причем практически реальных что подтверждается образцами видео), а значит можно спокойно рассмотреть номера на авто, лица и т.д. Кроме всего прочего есть инфракрасная подсветка, защита от пересветов, морозо- и жароустойчивость, автономность. Но и как говорится - любой каприз за ваши деньги. Относительно приличные IP-камеры начинаются от 10 т.р., но ИМХО возможности и удобство работы с ними стоят того для ряда проектов.
По аналогии с IP-камерами, многое из того же возможно реализовать с помощью обычных аналоговых камер, так как даже аналоговая камера на порядок лучше usb-камеры. Но для этого необходимо реализовать сначала сервер видеозахвата (обычно они уже имеются в фирмах где реализовано видеонаблюдение), а затем интерфейс работы с этим сервером из 1С. Но тут уже по полной аналогии с IP-камерами, так как разработчики ПО для видеонаблюдения предоставляют те же средства и функционал что и разработчики IP-камер, то есть имеется как минимум activex для работы с потоком через браузер.
Очень важной деталью реализации проектов с использованием камер чаще всего также является реализация взаимодействия с другими внешними устройствами. Например открыть шлагбаум или турникет из 1С, прочесть штрихкод с удаленного устройства, включить/выключить двигатель ворот, управлять освещенностью и т.д. Здесь на помощь приходят ряд несложных устройств, с некоторыми из которых вы можете познакомиться по ссылкам ниже. Некоторые из этих устройств я уже использовал в своих проектах. Но это уже другая тема для разговора.
http://tibbo.com/soi/hardware.html http://usbsergdev.narod.ru/projects.html
&НаКлиенте
Процедура СписокDeviceПриИзменении(Элемент)
WebCam.SetDevice(СписокDevice);
Для Ч=0 по WebCam.GetCountVideoFormat()-1 Цикл
Элементы.СписокФорматов.СписокВыбора.Добавить(Ч,WebCam.GetNameVideoFormat(Ч));
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
WebCam = Новый COMОбъект("WebCamProj1.WebCamX");
Кол=WebCam.GetCountDivice();
Элементы.СписокDevice.СписокВыбора.Очистить();
Для Ч=0 по Кол-1 Цикл
Элементы.СписокDevice.СписокВыбора.Добавить(Ч,WebCam.GetNameDevice(Ч));
КонецЦикла;
КонецПроцедуры
Класс! то что нужно. Автор молодец! Начальству нужно будет показать как новую фичу! А если почитать еще и коменты то можно еще много полезного найти))!
Объект.Play();
{Документ.ХХХХ.Форма.Модуль(96)}: WebCamProj1.WebCamX: List index out of bounds (0)
Но путем анализа кода обработки для 8ки удалось догадаться, что в методе GetNameVideoFormat() есть какой-то побочный эффект, вызов которого до вызова Play() приводит к нормальной работе компоненты.
Поэтому вот такой код работает:
ВебКамера = СоздатьОбъект("АктивИкс");
ВебКамера.УстановитьАтрибут(Форма, "АктивИксФото");
Объект = ВебКамера.СоздатьЭУ("WebCamProj1.WebCamX");
ВебКамера.УстановитьФокус();
А = Объект.GetNameVideoFormat(0); // Магический вызов, который имеет полезный для нас побочный эффект.
Объект.SetDevice(0);
Объект.Play();
Показать
Все это актуально для компоненты из архива WebCamX2.rar (только она работает под Windows 7)
p.s.
Разработчик убил полдня, чтобы из трех методов компоненты составить работающую комбинацию :)
"Пишите свой код из предположения, что сопровождать его будет психопат-убийца, знающий, где вы живете." (с)
Как раз искал подобную обработку, нужно определиться как будет удобнее передавать информацию в 1с - через Web камеру либо сканер, кто пользовался Web камерой для сканирования документов поделитесь впечатлениями, достаточное ли получается качество изображения.
(119) или же задам вопрос иначе, если я сам пытаюсь создать форму на УФ, как мне реализовать элемент формы WebCam, как построить этот "черный квадрат Малевича"?)
(124) piton66, А в чем причина была, тоже не могу зарегистрировать компоненту по виндоус 8.1? пишет ошибку. Хотя под ХР, все работало прекрасно.
П.С. Помучился часок с регистрацией из командной строки, через права админа, все получилось, информации полно в гугле. Обработка работает отлично и под виндоус 8.1. Прикрутил ее к справочнику номенклатура в конфе УТ 10.3, для фотографирования прямо из списка товаров. Всем советую.
Компонента отличная. Но не хватает работы с разрешениями (даже во 2-й версии). По-умолчанию камера включается в 640х480, хотя камера поддерживает HD формат. Автоматический режим не решает вопроса и надо постоянно выбирать разрешение из списка (понимаю, что можно сохранить последнее значение). Очень сильно не хватает получения разрешения не ввиде текстового списка, который надо парсить, а в виде нескольких списков. Например: GetVerticalResolutions(), GetHorizontalResolutions(), GetBitRates(), GetMaxResolution(). Первые можно перегрузить, передавая параметрами второе значение разрешения. Например, получить вертикальные разрешения при таком то горизонтальном, или получить возможные битрейты при таком то разрешении (чтобы убрать возможность ошибки, когда передаются неподдерживаемые значения).
Если выложите свою разработку на Git, думаю найдутся волонтеры на доработку (я могу помочь).
Если менять разрешение на включенной камере, то при вызове метода GetCountVideoFormat() возвращает только одно единственное разрешение. И это именно то разрешение, которое было установлено. Установить другое разрешение выдаст ошибку.
Ладно, меняем разрешение, при этом остановив камеру. Тогда метод SetVideoFormat() вообще возвращает ошибку. Приходится заново устанавливать устройство методом SetDevice(N).
Как я "допилил" под себя.
1. Сохранение значений камеры и разрешения.
2. При открытии формы, если камера в системе одна, то автоматическое подключение к ней. Автоматический Play()
3. Определение максимального разрешения камеры и подключение с этим разрешением:
МаксимальныйФормат = 0;
МаксимальнаяВысота = 0;
МаксимальнаяШирина = 0;
МаксимальныйБитрейт = 0;
Попытка
Для Ч=0 по ЭлементыФормы.КомпонентаКамеры.GetCountVideoFormat()-1 Цикл
ДанныеФормата = ПолучитьДанныеИзСтроки(ЭлементыФормы.КомпонентаКамеры.GetNameVideoFormat(Ч));
Если ДанныеФормата.Ширина>МаксимальнаяШирина
Или ДанныеФормата.Высота>МаксимальнаяВысота Тогда
МаксимальныйФормат = Ч;
МаксимальнаяВысота = ДанныеФормата.Высота;
МаксимальнаяШирина = ДанныеФормата.Ширина;
МаксимальныйБитрейт = ДанныеФормата.Битрейт;
ИначеЕсли ДанныеФормата.Ширина=МаксимальнаяШирина
И ДанныеФормата.Высота=МаксимальнаяВысота
И ДанныеФормата.Битрейт > МаксимальныйБитрейт Тогда
МаксимальныйФормат = Ч;
МаксимальныйБитрейт = ДанныеФормата.Битрейт;
КонецЕсли;
ЭлементыФормы.СписокФорматов.СписокВыбора.Добавить(Ч,ЭлементыФормы.КомпонентаКамеры.GetNameVideoFormat(Ч));
КонецЦикла;
ЭлементыФормы.СписокФорматов.Значение = МаксимальныйФормат;
ОбработатьВыборФормата();
Исключение
Сообщить("Не удалось определить формат изображения автоматически. Установлен 640х480");
КонецПопытки;
Показать
3. Парсинг строки видеоформата (пока работает на всех моих камерах):
Функция ПолучитьДанныеИзСтроки(СтрокаФормат)
МассивФорматов = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтрокаФормат, " ");
// методом "научного тыка" выяснил, что разрешение хранится в 10-ом элементе массива. Битрейт в 11-ом
// но из строки разрешения надо еще отдельно выбрать высоту и ширину
МассивРазрешение = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтрЗаменить(МассивФорматов[10], ",", ""), "X");
ДанныеФормата = Новый Структура("Ширина, Высота, Битрейт");
ДанныеФормата.Ширина = Число(МассивРазрешение[0]);
ДанныеФормата.Высота = Число(МассивРазрешение[1]);
ДанныеФормата.Битрейт = Число(МассивФорматов[11]);
Возврат ДанныеФормата
КонецФункции
Показать
4. В обработке выбора формата прописано изменение размера окна компоненты (чтобы избежать растягиваний)
Процедура ОбработатьВыборФормата()
//Данные по-умолчанию, если определить не удастся
ШиринаИзображения = 640;
ВысотаИзображения = 480;
ЭлементыФормы.КомпонентаКамеры.SetVideoFormat(ЭлементыФормы.СписокФорматов.Значение);
ДанныеФормата = ПолучитьДанныеИзСтроки(ЭлементыФормы.КомпонентаКамеры.GetNameVideoFormat(ЭлементыФормы.СписокФорматов.Значение));
Если Не ДанныеФормата = Неопределено Тогда
ШиринаИзображения = ДанныеФормата.Ширина;
ВысотаИзображения = ДанныеФормата.Высота;
КонецЕсли;
//ЭлементыФормы.КомпонентаКамеры.Ширина = ШиринаИзображения;
ЭлементыФормы.КомпонентаКамеры.Высота = (512/ШиринаИзображения)*ВысотаИзображения; // 512 это ширина окна в конфигураторе
// ширина окна не меняется. Оперируем только высотой
МинимальнаяВысотаФормы = 370; // меньше этой высоты не ставлю т.к. там есть другие элементы
ВысотаСКомпонентой = ЭлементыФормы.КомпонентаКамеры.Высота + 36;
ЭтаФорма.Высота = ?(ВысотаСКомпонентой>МинимальнаяВысотаФормы, ВысотаСКомпонентой, МинимальнаяВысотаФормы);
КонецПроцедуры
Все хорошо, спасибо автору за труды, но есть одно но, при записи видео в файл, сохраняет очень плохое качество, несмотря на выбранное из списка поддерживаемых максимального. Проверялось на разных компьютерах, разных устройств. Очень хотелось бы, получить хорошее качество на выходе.
В тему поста хочу поделиться интересным решением – бесплатный модуль для 1С, позволяющий контролировать любое оперативное событие по видеоданным сразу из оболочки 1С. Сразу через интерфейс 1С можно получать видеозаписи по любым системным событиям, например - печать чека, складские операции (приемка, отгрузка), возвраты товара и т.д. Здесь больше данных: https://ru.ivideon.com/ivideon-1c-integration/