Взять картинку с WEB камеры в невидимом режиме.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Взять картинку с WEB камеры в невидимом режиме.

Сообщение ALX_2002 » 14.10.2007 (Вс) 20:52

Доброго времени суток товарищи. Никак не получается сделать снимок если форма для вывода не видна. :(

Делаю через SendMessage

Соединяюсь с устройством

и по таймеру делаю

Код: Выделить всё


Clipboard.Clear
       
SendMessage me.hwnd, WM_CAP_EDIT_COPY, 0, 0
       
SavePicture Clipboard.GetData(2), "C: \1.bmp"


Всё работает до тех пор пока форма видна. Если её скрыть то картинка не обновляется.

Кто сталкивался - помогите плз.

P.S Если нужен весь код - с радостью выложу. Не хотел захламлять форум. :)

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 14.10.2007 (Вс) 23:02

поиграйся со свойством autorefresh или ламерский вариант - помести форму за границу экрана
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 14.10.2007 (Вс) 23:41

Ну или продолжая тему Дениса сделай форму полностью прозрачной :)
Подпись проходит рефакторинг

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 15.10.2007 (Пн) 9:25

2 Денис:
1) Наверное всё таки AutoRedraw, а не AutoRefresh ? :roll:
2) КАК РАЗ ИМЕННО ТАМ И НЕ ОТРИСОВЫВАЕТСЯ. И логику этой НЕОТРИСОВКИ в принципе понять можно - "Зачем рисовать, если всё равно не видать ?" )))

2) Lumen - Не пробывал, а мысль... Хрен его знает как регионы отрабатываются в этой штуке :roll: Сёдня вечерком надо буит потетить.
[/b]

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 15.10.2007 (Пн) 15:35

AutoRefresh :yes:
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 16.10.2007 (Вт) 12:53

2 Денис: Хм.... Еже ли всё таки AutoRefresh - мона по подробнее - где его искать ? :roll:

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 16.10.2007 (Вт) 16:19

Хм, я когда-то делал маленький CGI который создавал jpeg файл с картинкой с веб-камеры. Если найду отпишу.
[added]
Уже нашел. Я вот так делал:
call SendMessage(hwdc, WM_CAP_GRAB_FRAME, 0, 0)
call SendMessage(hwdc, WM_CAP_FILE_SAVEDIBW, 0, StrPtr(filename))
الفيجوال بيسك الرابح

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 16.10.2007 (Вт) 19:23

2 GM: Пасип :) Как раз сегодня это и сделал.

2 all: Отцы. Сварганил DLL-ку вот такую. Однакось после закрытия выпадет скотинко. Научите пожалуйста, что не так делаю :oops:

Ниже код 2-ух проектов: DLL-ка и форма.

Код DLL-ки

Код: Выделить всё

Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" Alias "capCreateCaptureWindowA" (ByVal lpszWindowName As String, ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hwndParent As Long, ByVal nID As Long) As Long

Private CaptureWindowHandle As Long

Const WM_USER = &H400
Const WM_CAP_START = WM_USER
Const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10
Const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11
Const WM_CAP_GRAB_FRAME = WM_CAP_START + 60
Const WM_CAP_EDIT_COPY = WM_CAP_START + 30

'Private Const Connect As Long = 1034
'Private Const Disconnect As Long = 1035
'Private Const GET_FRAME As Long = 1084
'Private Const COPY As Long = 1054

Dim Connected As Boolean

Public Sub Connect()
    On Error GoTo ErrorHandler
    CaptureWindowHandle = capCreateCaptureWindow("WebcamCapture", 0, 0, 0, 640, 480, 0, 0)
    DoEvents
    Connected = SendMessage(CaptureWindowHandle, WM_CAP_DRIVER_CONNECT, 0, 0)
ErrorHandler:
End Sub

Function GetPicture() As IPictureDisp
    On Error GoTo ErrorHandler
    If Connected Then
        Clipboard.Clear
        SendMessage CaptureWindowHandle, WM_CAP_GRAB_FRAME, 0, 0
        SendMessage CaptureWindowHandle, WM_CAP_EDIT_COPY, 0, 0
        Set GetPicture = Clipboard.GetData(2)
    End If
ErrorHandler:
End Function

Function SavePictureToDisk(Path As String)
    On Error GoTo ErrorHandler
    SavePicture GetPicture, Path
ErrorHandler:
End Function

Public Sub Disconnect()
    On Error GoTo ErrorHandler
    SendMessage CaptureWindowHandle, WM_CAP_DRIVER_DISCONNECT, 0, 0
ErrorHandler:
End Sub

Private Sub Class_Terminate()
    Disconnect
End Sub



Код формы

Код: Выделить всё

Dim WebCam As New WebCam.Class
Private Sub Form_Load()
    WebCam.Connect
    Timer1.Enabled = True
    Timer1.Interval = 100
End Sub

Private Sub Form_Unload(Cancel As Integer)
    WebCam.Disconnect
End Sub

Private Sub Timer1_Timer()
    Me.Picture = WebCam.GetPicture
End Sub

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 16.10.2007 (Вт) 21:52

самое просто поставь везде
Код: Выделить всё
On error Resume next

и ничего не выпадет - если это еррор ... или тебя что-то иное выпадает?

С Уважением,
Сергей
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 17.10.2007 (Ср) 10:09

Прошу прощения :) Моя корявая способность объяснять опять ввела в всех в заблуждение :)

2 SSecurity:

К сожалению выпадает не сама программа. А среда Visual Basic после закрытия проекта. Т.е когда запускаю и выгружаю саму программу - всё отлично, но стоит закрыть VB-ник тут же вылезает ошибка типа Приложение Visual Basic вызвало ошибку и т.д и т.п и предложение отправить отчёт в мелкомяких :)

Проблему вроде как понял.

В этой строке предпоследний параметр это родительский HWND окна - куда будет отображаться окно видеозахвата. А я подсовывал туда 0 вместо реального HWND. Это и сваливало проект после его выгрузки.
Код: Выделить всё
CaptureWindowHandle = capCreateCaptureWindow("WebcamCapture", 0, 0, 0, 640, 480, 0, 0)


P.S Полной причины не знаю, что там у функции внутри зашито, но методом тыка выяснил ))

AD'onis
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 05.10.2006 (Чт) 20:19
Откуда: не секрет, я б сказал, но забаннят

Сообщение AD'onis » 02.04.2008 (Ср) 21:44

Доброго времени суток.
Повторил данный проектик, но винда выпадает в экран смерти. Почему такое может произойти? При первом запуске все нормально, отрабатывает, закрываю прогу, все нормально, делаю повторный запуск, винда валится.
Что самое интересное - когда резетишь после этого машину, то сидюк не определяется (меня это смутило, вырвал его шлейф нафих). Причину такого поведения выяснить не смог. После отключения сидюка ошибка не исчезла (не удивительно).
Камера работает нормально. Моделька NB300 от Genius, собрана на CIF Single Chip, все проги с камерой работают замечательно, т.е. к дровам претензий нет.
Насколько я понял данная прога ловит хендл камеры и создает окно на основе его. Т.е. к дровам здесь напрямую мы не обращаемся, винда это делает сама. Я прав? Если у кого-нибудь есть разумное объяснение такому поведению проги, помогите, плз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 02.04.2008 (Ср) 23:51

STOP-код в студию.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 03.04.2008 (Чт) 8:21

А у меня работает,
Единственное что смущает - это конечно копирование через клипбоард. Представляю как будет рад пользователь, когда скопировав в Ворде например слово "единообразный", в ответ он получит собственную фотку с камеры :)

Можно например,так
- буффер в переменную,
- отчистка
- потом копи_буффер
- снова в переменную
- опять отчистка
- восстановление буффера из переменной

по поводу работы "СиДи-Рома!" :)
не плохо бы на разном оборудовании проверить ... так что поддерживаю Хакера, код давай :)

и у меня почему-то не катит сохранение через
Код: Выделить всё
call SendMessage(hwdc, WM_CAP_FILE_SAVEDIBW, 0, StrPtr(filename))


и вопрос номер 2 - попутно:
картинку сохраняю в BMP ... в принципе цветное изображение мне не особо важно, поэтому наверно можно раза в 3 сократить саму картинку
(8 битовое изображение сделать) ...

Хоть картинка и станет не 230кБ а 80... всеравно много :) ...
Как бы её заархивировать?:) Алгоритмы есть, но не все позволяют быстро такие операции проводить.
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

AD'onis
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 05.10.2006 (Чт) 20:19
Откуда: не секрет, я б сказал, но забаннят

Сообщение AD'onis » 03.04.2008 (Чт) 16:42

Спасибо за ответы
Ошибка при падении проги, да и винды в общем:
DRIVER_CORRUPTED_mmpool
STOP: 0x000000D0 (0x00000001, 0x00000002, 0x00000001, 0x80549988)
Прилепил еще фотку экрана, но вроде все правильно написал :)
[added]
Проверить на разных машинах возможности сейчас нет, а вот на разных виндах попробовал (обе XP SP2, но разные сборки), валится также.
Вложения
130.JPG
Скрин ошибки
130.JPG (71.87 Кб) Просмотров: 1402

AD'onis
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 05.10.2006 (Чт) 20:19
Откуда: не секрет, я б сказал, но забаннят

Сообщение AD'onis » 04.04.2008 (Пт) 21:11

Добрый вечер всем.
Сегодня взял камеру у знакомого, другой производитель, но на том же чипе, дрова поновее. Вылетать стала пореже (любая из камер), но все равно бывает (один из 10 запусков точно будет провальным). Но если после закрытия программы дать компу сек. 10-15, то вероятность удачного запуска увеличивается в несколько раз. Напрашивается вывод, что машина просто может не успевать закрыть соединение. Что само по себе немного странно, ну да ладно, еще есть время и возможность повозиться.
Вопрос другой:
А как можно выбирать одну из нескольких веб-камер, чтобы можно было снимать кадры именно с нее. В идеале - переключение между камерами во время работы программы.
У кого какие есть соображения?

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 04.04.2008 (Пт) 21:23

абажаю компутеры со встроенными веб-камерами ... :)
дал челу программу свою ... настроил ... и всегда можно по сети узнать что там чел делает :)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

AD'onis
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 05.10.2006 (Чт) 20:19
Откуда: не секрет, я б сказал, но забаннят

Сообщение AD'onis » 04.04.2008 (Пт) 21:41

SSecurity
Не, мне не для этого, просто разные ракурсы надо мониторить, типа по дому натыканы камеры, и можно их всех мониторить, со своего же машина :). В общем долгая история. :) Но службе безопасности беспокоиться не о чем :)

AD'onis
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 05.10.2006 (Чт) 20:19
Откуда: не секрет, я б сказал, но забаннят

Сообщение AD'onis » 05.04.2008 (Сб) 20:56

Сейчас методом научного тыка (как говорит математик у нас в универе "Ответ на задачу, найденный методом тыка тоже является решением" :)) выяснил, что если константу WM_USER установить в значение 1023, то при такой последовательности нажатия на клавиши:
* Пуск
* Стоп
* Пуск
* Стоп
После последнего нажатия выскакивает окно с выбором камеры источника, после этого прога (я так понял что-то типа драйвера винды) даже после перезапуска все равно будет считывать с установленной камеры. Не выход, а просто интересная информация.

А вопрос все таки стоит: Как можно переключать камеру-источник во время работы программы и без участия юзера (т.е. поочереди)?

[ADDED]
еще немного потыкал, вот результаты:

SendMessage(hwdc, WM_USER + 10, 0&, 0&)'Окно выбора устройства (как бы устройство хотя бы тут автоматически выбрать?)
SendMessage(hwdc, WM_USER + 11, 0&, 0&)'Стоп
SendMessage(hwdc, WM_USER + 41, 0&, 0&)'Разрешение видео
SendMessage(hwdc, WM_USER + 42, 0&, 0&)'Общие настройки от дров производителя
SendMessage(hwdc, WM_USER + 46, 0&, 0&)'Сжатие видео


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: AhrefsBot, SemrushBot и гости: 59

    TopList