SR2D и веб-камера (VB6). Удалось!

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

С.Т.
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 10.03.2010 (Ср) 19:49

SR2D и веб-камера (VB6). Удалось!

Сообщение С.Т. » 26.04.2025 (Сб) 11:39

В приложении - тестовый проект, который передаёт видео-поток с Веб-камеры на SR2D-спрайт для дальнейших преобразований. Может, кому-то будет полезно.
Камера воплощена через некое TesoSeeu.ocx, это единственный движок камеры, который у меня заработал сразу и со всеми камерами и без малейших недостатков (хотя к VB6 он не приспособлен и лёг на неё чисто случайно). Но он рисует изображение только на себе и не умеет выводить картинку, а может лишь фотографировать в сырой буфер памяти. Процедуру вывода изображения из буфера я переводил с языка AHK и допиливал сам методом тыка; наверняка код требует поправок, которые приветствуются (например, две CopyMemory излишни), но так хотя бы работает!

В остальных случаях, насколько мне удавалось изучить, веб-камера с VB6 плохо дружит.
Было два варианта подключения:
1) старый - capCreateCaptureWindow (ненадёжный, зачастую выдаёт пустой экран вместо камеры, а если и включается - всегда тянет, изображение меняется ступенчато; к тому же, при каждом подключении выдаёт неубиваемое окно выбора камеры, которое захлопнуть мне удалось только сторонне запущенным скриптом AHK, т.к. программка VB с WM_CLOSE или SendKeys закрывает его как-то не так, как нужно для корректной работы камеры, а WM_QUIT закрывает вместе с окном самой программы) -
2) и новый, DirectShow (но он плохо совместим c VB6 и сложный, все "готовые" разработки в сети я проверил, и они не работают, к тому же там ручной выбор камеры, среди камер много мусора и т.д.).

Были в интернете и различные вебкамерные OCX специально для VB6 с готовыми проектами, но у меня хорошо не заработал НИ ОДИН из них (кроме WebCamX, но тот вообще не имеет вывода кроме как в файл).
А этот работает чётко, см. вложение.

(ПРАВКА: Последняя версия здесь
Вложение устарело.)
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось С.Т. 25.06.2025 (Ср) 17:29, всего редактировалось 3 раз(а).

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4160
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: SR2D и веб-камера (VB6). Удалось!

Сообщение Mikle » 26.04.2025 (Сб) 18:59

Круто! Работает.

С.Т.
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 10.03.2010 (Ср) 19:49

Re: SR2D и веб-камера (VB6). Удалось!

Сообщение С.Т. » 18.06.2025 (Ср) 19:37

А гораздо лучше работает новый вариант - с двумя потоками (через vbCreateThread от TheTrick).

Ибо пока он читал новый кадр из камеры (а в темноте у неё выдержка до полусекунды!), программа торчала на месте.
А теперь - смотрите: кадр висит один и тот же (пока-а-а он там новый кадр назначит), а главный поток занимается вращением спрайта, за счёт чего вращение происходит более гладко. А когда я и масштабирование спрайта перенёс туда же в поток, где считывание кадра, а главному потоку осталось лишь наложить два готовых спрайта с вращением, он стал крутиться вообще гладко-гладко и на мышь откликаться мгновенно:

Веб-камера в отдельном потоке.zip


При запуске выбираем вариант: полноценные ДВА потока либо ОДИН (по Таймеру с формы). Разница ошеломительна! (200 FPS против 20 в нормальных условиях, в темноте ещё разительней.)

Кстати, тут двухпоточность реализована без маршалинга, а с ручным экранированием общих Public-переменных от одновременного обращения из двух потоков. Мне даже кажется это допустимым для элементарных задач (в моём случае в отдельном потоке всегда будет только один цикл на несколько строчек, сколь бы ни усложнялся основной проект). Знаю, что это наивная глупость, но ведь работает быстро и вроде стабильно...

Воплощено это так. Пока побочный поток пишет новый спрайт, главный поток считывает его прошлую версию. Для этого общий спрайт реализован в виде не просто переменной, а Public-массива с двумя индексами: -1 и 0, и индивидуального номера рабочего индекса. Пока читаем Sprite(nSprite), пишем в Sprite(Not nSprite), а по окончании записи переключаем рабочий номер: nSprite = Not nSprite, и вот уже читать в главном потоке будем обновлённый спрайт, пока побочный поток пишет в нерабочий спрайт. Вот так, меняя их местами, мы обеспечиваем изоляцию элементов массива от чтения из другого потока. При том что сам массив для обоих потоков общий, видимый отовсюду, и к тому же второй поток обращается напрямую к Webcam-контролу вызвавшей его формы из первого потока (!) и ко всем глобальным переменным, но поскольку явных обращений к Webcam-контролу из главного потока не происходит НИКОГДА и одновременного обращения к Public-переменным не происходит НИКОГДА (гарантированно), слётов и глюков пока не наблюдается. А если и слетит один раз из тысячи, это всё равно лучше, чем пихать обработку кадров с камеры в общий поток и ВСЕГДА наблюдать пьяную ступенчатую картинку.

Прочитав дискуссию Хакера с The Trick в теме "Многопоточность - часть 4", я подумал: раз уж по-настоящему великие программисты не находят идеального подхода для StandardExe, то бог с ним, работает ведь - и ладно. Все API побочного потока объявлены локально в его модуле (интуиции кажется это более безопасным), встроенная функция Timer вставлена в поток лишь для пробы, она не нужна. Всё, что должен делать поток - снять карточку, обработать и выдать спрайт. И сколь бы ни усложнялся основной проект, отдельного потока это почти не коснётся, и свято блюсти его изоляцию не представляет труда. Вероятно, хитрости с подменой заголовка и т.д. в modMultiThreading действительно делают такой наивный подход возможным!
У вас нет доступа для просмотра вложений в этом сообщении.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 391
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: SR2D и веб-камера (VB6). Удалось!

Сообщение Vova_2581 » 21.06.2025 (Сб) 18:01

По web-камере когда-то давно делал, есть тут на форуме и такого...
1) старый - capCreateCaptureWindow (ненадёжный, зачастую выдаёт пустой экран вместо камеры, а если и включается - всегда тянет, изображение меняется ступенчато; к тому же, при каждом подключении выдаёт неубиваемое окно выбора камеры, которое захлопнуть мне удалось только сторонне запущенным скриптом AHK, т.к. программка VB с WM_CLOSE или SendKeys закрывает его как-то не так, как нужно для корректной работы камеры, а WM_QUIT закрывает вместе с окном самой программы)

Не наблюдается так чтобы ну совсем всё плохо. Там и отдельные потоки и закрывается все нормально и вопрос с "пустым экраном" тоже решен. Я и сам до сих пор пользуюсь этой прогой на работе для проверки работы разных камер на 7 и 10 win всё нормально работает и во многом зависит от настроек. Разве что со "ступенчатым изображением" может быть да... есть немного. Ну это мелочи.

С.Т.
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 10.03.2010 (Ср) 19:49

Re: SR2D и веб-камера (VB6). Удалось!

Сообщение С.Т. » 22.06.2025 (Вс) 4:47

...
Последний раз редактировалось С.Т. 25.06.2025 (Ср) 16:17, всего редактировалось 1 раз.

С.Т.
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 10.03.2010 (Ср) 19:49

Re: SR2D и веб-камера (VB6). Удалось!

Сообщение С.Т. » 22.06.2025 (Вс) 4:48

...
Последний раз редактировалось С.Т. 25.06.2025 (Ср) 16:18, всего редактировалось 1 раз.

С.Т.
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 10.03.2010 (Ср) 19:49

Re: SR2D и веб-камера (VB6). Удалось!

Сообщение С.Т. » 22.06.2025 (Вс) 9:47

...
Последний раз редактировалось С.Т. 25.06.2025 (Ср) 16:19, всего редактировалось 1 раз.

С.Т.
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 10.03.2010 (Ср) 19:49

Re: SR2D и веб-камера (VB6). Удалось!

Сообщение С.Т. » 22.06.2025 (Вс) 9:50

...
Последний раз редактировалось С.Т. 25.06.2025 (Ср) 16:18, всего редактировалось 1 раз.

С.Т.
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 10.03.2010 (Ср) 19:49

Re: SR2D и веб-камера (VB6). Удалось!

Сообщение С.Т. » 22.06.2025 (Вс) 10:04

...
Последний раз редактировалось С.Т. 25.06.2025 (Ср) 16:18, всего редактировалось 1 раз.

С.Т.
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 10.03.2010 (Ср) 19:49

Re: SR2D и веб-камера (VB6). Удалось!

Сообщение С.Т. » 22.06.2025 (Вс) 19:41

Если речь про это, то разумеется я опробовал еще много лет назад. У меня не работает, как и ни один на основе capCreateCaptureWindow. Windows запрашивает камеру, это окно надо как-то убить, тогда раз через раз какая-то камера включается, на втором запуске всегда стабильно чёрный экран...

А TesoSeeu работает всегда и на любых компьютерах, сам выбираешь камеру, изображение отличное.
Но я его недооценил! Я снимал изображение через Cam.SnapOne, а оно тормозит программу на выдержку камеры.
НО У НЕГО ЕСТЬ EVENT на форму!
А включается он, если при OpenCapDev указать вторым параметром 1.

Тогда каждый кадр вызывает Cam_EventOfCamera АСИНХРОННО! Остальное время форма работает, и (условное) вращение будет происходить ПЛАВНО! И многопоточность НЕ НУЖНА!
Путём проб и ошибок нашёл, как выцепить изображение по указателю, который он присылает:

Код: Выделить всё
'Каждый новый кадр камеры вызывает:
    Private Sub Cam_EventOfCamera(ByVal pBmp As Long, ByVal nTyp As Long)
        size& = Cam.GetImgLen(1)
        hData& = GlobalAlloc(2&, size)
        pData& = GlobalLock(hData)
        CopyMemory ByVal pData, ByVal pBmp, size
        GlobalUnlock hData
        SprBack.LoadFromData hData ' Метод LoadFromData добавил на основе LoadFromBytes с форума Arthur02   http://bbs.vbstreets.ru/viewtopic.php?f=6&t=56557
        SprBack.PaintToDevice hDC
    End Sub


Обновил проект-болванку на чистовик, теперь на его основе можно писать программы для веб-камеры. В моём случае камера работает на 6 FPS, а форма – на 28 FPS (обрабатывая многократно один и тот же кадр камеры). Тестовые счётчики при отключённой камере НЕ МЕНЯЮТ СКОРОСТИ, т.е. работа камеры нисколько не нагружает форму (как видим, задержка возникает лишь в момент открытия камеры):
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось С.Т. 25.06.2025 (Ср) 17:22, всего редактировалось 1 раз.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 391
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: SR2D и веб-камера (VB6). Удалось!

Сообщение Vova_2581 » 24.06.2025 (Вт) 13:03

Ого! Зачем так много повторений? :shock:

Vova_2581
Постоялец
Постоялец
 
Сообщения: 391
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: SR2D и веб-камера (VB6). Удалось!

Сообщение Vova_2581 » 24.06.2025 (Вт) 14:13

Что-то не то вы делаете. Если в системе одна камера, то никакого запроса... не будет. "Черный экран" зависит от метода сжатия, оно меняется в настройках. Как я уже сказал: у меня с capCreateCaptureWindow нет никаких особых проблем, всё работает нормально, ну вы конечно в праве выбирать, что вам удобней то и используйте. :wink:

Vova_2581
Постоялец
Постоялец
 
Сообщения: 391
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: SR2D и веб-камера (VB6). Удалось!

Сообщение Vova_2581 » 24.06.2025 (Вт) 18:38

Посмотрел ваш проект по ссылке... ну или не ваш, но вами переделаный, не важно...
Что могу сказать: очень излишне сложно все закручено. Там и ActiveX... и dll дополнительно и классы в проекте - целая ГОРА(!) кода. Ахренеть!!! :shock: Зачем это все??? Так много лишнего... устал считать сколько там деклараций на 974 сбивался и снова считал, потом бросил, устал! Ну его... :cry:
С API capCreateCaptureWindow в 100 тыщ миллионов раз проще! Код простой и его немного совсем, для детей написанный. Может без спецэффектов... но по качеству картинки все тоже самое. Я, кстати, свой код на разных камерах пробовал на работе нет проблем все отлично работает! :D Все окна настроек с выбором камер (если их несколько) не нужно закрывать через "перезагрузку системы", ничего не зависает, все элементы управления окна доступны, если установить параметр fYield = true нет проблем! Темный экран... возможно, нужно просто изменить в "Формат видео" параметр "Глубина цвета (бит) и сжатие" с MJPEG (не все камеры поддерживают) на YUY2 и все работает! Ну, в общем, это ваше дело, конечно, что лучше лично для вас, но на мой личный взгяд: всегда лучше "гору" обойти, чем карабкаться на нее в поте лица своего. В прочем... как угодно, это ваше личное дело, вам и решать. Хорошего дня! :)

С.Т.
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 10.03.2010 (Ср) 19:49

Re: SR2D и веб-камера (VB6). Удалось!

Сообщение С.Т. » 25.06.2025 (Ср) 16:36

(Повторения убрал, извиняюсь, не отправлялось, потом через несколько дней сразу всё прилетело.)

Поясню насчёт моего сдвоенного проекта - он посвящен не камере, а движку SR2D от Mikle, который и занимает большую часть проекта, включая DLL. Задача проекта не отобразить картинку, а вывести её в движении на СПРАЙТ. Для чего? Для дальнейших преобразований картинки, когда они именно требуются, и внедрения "видеопотока" в основную 2D-программу. Так тема и называется: Вывод камеры на SR2D. В этом и были некоторые сложности, которые разрешены и проект готов к заполнению. Кстати, код только в форме (содержит тестовую часть, подлежащую удалению), всё остальное - движок.

А если нужен ПРОСТО вывод картинки с вебкамеры на экран, то проект занимает 14 строк кода:
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось С.Т. 25.06.2025 (Ср) 17:31, всего редактировалось 5 раз(а).

С.Т.
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 10.03.2010 (Ср) 19:49

Re: SR2D и веб-камера (VB6). Удалось!

Сообщение С.Т. » 25.06.2025 (Ср) 16:48

Эти 14 строк посвящены выбору действующей камеры из списка подключённых камер, но даже они не обязательны. Достаточно такого кода:
Код: Выделить всё
Private Sub Form_Load()
    Cam.OpenCapDev 0, 0
End Sub

И присоединить OCX, даже не подлежащий регистрации. Программа откроет камеру, если она есть, и выведет изображение на экран.

Но бывают случаи, когда с изображением с камеры нужно что-то делать. Не просто эффекты, не просто замена фона, сдвижение и т.д., а ещё и участие картинки в сути самой программы, и это не обязательно изображение лица. В моем случае камера должна считывать движения рук, в другом случае РАСПОЗНАВАТЬ клавиши, схваченные камерой, белый цвет класть на фон цветовых линий и т.д. - всё это довольно сложный проект на стыке психологии, педагогики и музыки. Есть и другие случаи. Схваченное таким образом изображение можно даже РАСПОЗНАВАТЬ путём проверки пикселей (в SR2D команда GetPixel), и компьютер может на ходу определять, ЧТО он видит и ГДЕ, на ходу менять масштаб и положение камеры программно для отображения картинки на тех объектах, которые задуманы, и т.д. Всё это делается довольно легко на основе проекта из этой темы (не из последнего поста, разумеется).

А просто отобразить картинку на форме или записать в файл - такой задачи передо мной не стояло... Но найдя, как надёжно и МАКСИМАЛЬНО просто подружить камеру именно с ДВИЖКОМ SR2D (на котором основан остальной мой проект), я выложил это решение для тех, кто может использовать это по-своему.
Последний раз редактировалось С.Т. 25.06.2025 (Ср) 17:16, всего редактировалось 2 раз(а).

С.Т.
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 10.03.2010 (Ср) 19:49

Re: SR2D и веб-камера (VB6). Удалось!

Сообщение С.Т. » 25.06.2025 (Ср) 17:04

Раз уж на то пошло:
Vova_2581 писал(а):Что-то не то вы делаете. Если в системе одна камера, то никакого запроса... не будет. "Черный экран" зависит от метода сжатия, оно меняется в настройках.

У меня одна камера (встроенная на ноутбуке), но при запуске Web-camera monitor (версия 1.1.14) сперва появляется штатный виндоусный диалог выбора камеры, затем (независимо от выбора) появляется окно с чёрным экраном, на кнопку "Выбрать видеоустройство" не реагирует, "Установить формат" не реагирует, "Выбрать формат" показывает 5 вариантов (а откуда я знаю, какой формат у моей камеры?) и при выборе любого из них пишет "Видеоустройство не поддерживает выбранное разрешение!". Дальше разбираться не стал. Подключение USB-камеры ничего не меняет. Windows 7 x64, запуск как из IDE, так и скомпилированного файла. Несколько лет назад в этой проге удавалось как-то через раз получить картинку, сейчас ни разу.
Поэтому я продолжил поиски и нашёл через тонны материала на каком-то заброшенном китайском иероглифическом сайте OCX, который вдруг чудесным образом заработал на VB6 и работает с одной строчки! Удалось (не без ухищрений с оперативкой) и положить её живую картинку на 2D-графику для обработки, что в моём случае критически важно. Вот этой последней находкой я и решил поделиться.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 391
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: SR2D и веб-камера (VB6). Удалось!

Сообщение Vova_2581 » 25.06.2025 (Ср) 17:30

Ок. SR2D это ваша специфика, понятно.
Насчёт последнего поста... Странно... Мне уже и самому интересно... Давайте немного позже вам напишу, по свободе один вариант попробуем, если вы не против.

С.Т.
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 10.03.2010 (Ср) 19:49

Re: SR2D и веб-камера (VB6). Удалось!

Сообщение С.Т. » 25.06.2025 (Ср) 17:34

Хорошо. Но лучше не здесь, а в вашей теме, ладно?

Vova_2581
Постоялец
Постоялец
 
Сообщения: 391
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: SR2D и веб-камера (VB6). Удалось!

Сообщение Vova_2581 » 25.06.2025 (Ср) 21:04

Да, хорошо, без проблем.


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList  
cron