Получение изображения с невидимого DC

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

Получение изображения с невидимого DC

Сообщение Mihail_ » 21.08.2008 (Чт) 13:43

Допустим у нас веб-камера, подсоединяемся к ней через виндоузовский wm_cap драйвер, получаем дескриптор окна, куда она выводит видеопоток, дальше нам нужно получить информацию о пикселах этого изображения (я использовал GetBitmapBits т.к. быстрая функция) и обработать ее. Но это все работает только пока окно видимое, а если его изначально делать невидимым, то получить с него информацию таким способом не получается.
Пока читал доки по работе с веб-камерами нашел, что с помощью WM сообщения можно получить отдельный кадр с этой камеры, а потом либо сохранить его на диск в формате BMP, либо копировать в буфер обмена. Жесткий диск мне жалко, поэтому я пытался копировать в буфер, получалось 3-5fps, но это когда камера одна, а когда несколько - такой способ не годится.
Ищу новые способы получения видеопотока с камеры и пришел к выводу что снимать изображение с DC - наверное один из самых быстрых, но когда DC не видно, возникают проблемы.

Все это нужно для домашней системы видеонаблюдения, конкретно вышеописанное действие с обработкой скриншотов нужно в качестве детектора движения.
Дополнительную информацию по камерам см. здесь

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Получение изображения с невидимого DC

Сообщение Antonariy » 21.08.2008 (Чт) 14:16

Советую забить на веб-камеру и заюзать IP-камеру. Дороже, но качественней, и программирования минимум. Можно даже вообще ничего не кодить.
Сам работал с продукцией AXIS, в комплектации камер есть ActiveX, который делает всю грязную работу. А еще на их сайте есть драйвер видеоустройства, который можно использовать с Windows Media Encoder. Отработал такую схему: камера по сети + микрофон на компе (иначе не добиться синхронности звука и картинки) -> захват в WME через драйвер -> push на локальный сервер с WMS -> ретрансляция на интернет-сервер с WMS -> просмотр клиентами.
Лучший способ понять что-то самому — объяснить это другому.

Mihail_
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 31.03.2008 (Пн) 20:57

Re: Получение изображения с невидимого DC

Сообщение Mihail_ » 22.08.2008 (Пт) 13:57

спасибо, я учту, но пока занимаюсь более бюджетным вариантом для дачи.

p.s. тема актуальна - как получить изображение с невидимого DC

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Получение изображения с невидимого DC

Сообщение Antonariy » 22.08.2008 (Пт) 14:22

Тогда попробуй натравить WME на вебкамеру, он ее должен похватить. WME можно сделать mms-сервером, и подключаться к камере из медиаплеера по протоколу mms://твойкомп/что-то-там-еще-WME-подскажет.
Кстати, ip-камера бюджетней, чем комп + веб-камера.
а если его изначально делать невидимым
А если делать видимым, но позиционировать за пределами экрана?
Лучший способ понять что-то самому — объяснить это другому.

Mihail_
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 31.03.2008 (Пн) 20:57

Re: Получение изображения с невидимого DC

Сообщение Mihail_ » 22.08.2008 (Пт) 16:35

я делаю все-таки неполноценную систему видеонаблюдения - пока что без видеосервера т.к. повторяюсь что для дачи, а стоймость интернета в области таких вольностей пока не позволяет, вот оповещение по СМС и загрузка jpeg картинок на ФТП по требованию - другое дело. Но сейчас не об этом.

Как я получаю информацию об изображении с камеры можно посмотреть в прикрепленном примере, если вкратце, то для видеозахвата ипользуется avicap32.dll с ее макросами capCreateCaptureWindow, она создает новое окно и в него получает изображения с камеры с заданной частотой fps, потом оттуда преобразуем изображение и копируем его в созданный точеченый рисунок (CreateCompatibleBitmap) с помощью BitBlt, а из рисунка уже копирует биты (GetBitmapBits) и т.д. - вот "виновата" как раз функция BitBlt - она не умеет получать данные с невидимого DC. Если DC находится за пределами формы - то в качестве изображения идет то, что находится "под" ним, если поверх нашего DC что-нибудь находится - то идет то что поверх..
Нужен какой-то другой способ, но что-то у меня не получается(
Вложения
cap_bitblt.rar
(2.35 Кб) Скачиваний: 51

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

Re: Получение изображения с невидимого DC

Сообщение Хакер » 22.08.2008 (Пт) 17:18

У тебя неверное представление о DC. По твоему, видимо, DC — это графический контейнер. Это заблуждение.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mihail_
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 31.03.2008 (Пн) 20:57

Re: Получение изображения с невидимого DC

Сообщение Mihail_ » 22.08.2008 (Пт) 18:01

нет я понимаю, мы в качестве контейнера создаем CompatibleDC и переносим из него изображение в CompatibleBitmap используя функция BitBlt которая берет битовые блоки цвета (?)из памяти, тоесть DC это насколько я понимаю область в памяти? но если бы все было так, то мы бы получали изображение из окна, независимо видимо оно или нет.. где-то я опять ошибаюсь..

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

Re: Получение изображения с невидимого DC

Сообщение Хакер » 22.08.2008 (Пт) 18:08

Нет.

Очень грубо говоря, DC это некая абстрактная (для тебя) сущность, выступающая посредником при рисовании на Device. Есть Device (это может быть дислпей, а может быть принтер). На Device можно рисовать разными цветами, разной толщиной, печатать текст разными шрифтами.

Чтобы было проще работать с Device создали такую штуку как DeviceContext (DC). Это просто абстрактный объект, для которого задана своя система координат, свой цвет, свой стиль рисования шрифт, вобщем, ряд своих GDI-объектов.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mihail_
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 31.03.2008 (Пн) 20:57

Re: Получение изображения с невидимого DC

Сообщение Mihail_ » 22.08.2008 (Пт) 18:15

тоесть в моем случае, если окно получается невидимым, то функции работающие с получением изображения с DC нам не помогут?

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

Re: Получение изображения с невидимого DC

Сообщение Хакер » 22.08.2008 (Пт) 18:26

А ты думаешь, графика, выводимая за рамки экранного пространства где-то хранится? Т.е. по твоему, если мне вдруг вздумается с помощью LineTo нарисовать линию от (0; 0) до (10000; 100000), то экранный буфер расширится, чтобы вместить в себя матрицу размером 10000x100000 ?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mihail_
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 31.03.2008 (Пн) 20:57

Re: Получение изображения с невидимого DC

Сообщение Mihail_ » 23.08.2008 (Сб) 15:07

ну она же должна где-то храниться когда окно свернуто (невидимо) - в любую секунду оно может стать видимым и в него надо будет загружать изображение?

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

Re: Получение изображения с невидимого DC

Сообщение Хакер » 23.08.2008 (Сб) 15:18

Нет, она нигде не хранится.

В любую минуту окно может быть развёрнуто. При этом, система отправит окну сообщение WM_PAINT, чем заставит окно перерисовать себя заново.

Оно может, конечно, использовать SaveDC/RestoreDC — но это уже логика приложения, которая закладывается разработчиком приложения.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mihail_
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 31.03.2008 (Пн) 20:57

Re: Получение изображения с невидимого DC

Сообщение Mihail_ » 24.08.2008 (Вс) 15:54

хорошо, значит при создании невидимого окна с видеопотоком с камеры мне изображение видеопотока никак получить не получится?

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

Re: Получение изображения с невидимого DC

Сообщение Хакер » 24.08.2008 (Вс) 15:58

Можно, но не на том уровне. Где-нибудь раньше.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


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

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

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 12

    TopList