Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.12.2015, 02:47   #1
Viktor_Ptica
Пользователь
 
Регистрация: 23.12.2015
Сообщений: 22
Вопрос Выгрузка изображения с веб-камеры в TBitmap (Delphi 7)

Всем доброго времени суток. У меня проблема. С помощью Процедуры capCreateCaptureWindowA пытаюсь вывести изображение с веб камеры в программно созданный BitMap.
Код:
 var 
hWndC : THandle;
btha : TBitmap;
...
  btha:=TBiTmap.Create;
  btha.Width:=640;
  btha.Height:=480;
  btha.PixelFormat:=pf24bit;
...
hWndC := capCreateCaptureWindowA('My Own Capture Window',
WS_CHILD or WS_VISIBLE ,
0,
0,
btha.Width,
btha.Height,
btha.Canvas.Handle,
0);
После загрузки btha в Image получаю белый экран.
Код:
SendMessage(hWndC, WM_CAP_GRAB_FRAME, 0, 0);
...
dc := getdc(btha.canvas.Handle);
bitblt(btha.canvas.handle, 0, 0, btha.width, btha.height, dc, 0, 0, SRCCOPY);
Image1.Picture.Bitmap.Assign(btha);
Подскажите в чем проблема и/или как получить изображение? Согласен на почитать статьи
Если задача кажется легкой - то решать её придется очень долго.
Viktor_Ptica вне форума Ответить с цитированием
Старый 30.12.2015, 10:09   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Чтиво, эт можно: http://www.programmersclub.ru/Получе...-с-веб-камеры/
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.12.2015, 10:10   #3
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Вас интересует готовый код или вы хотите разобраться в вопросе?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 30.12.2015, 11:21   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

С новым годом!

Данным давно, когда процессоры были медленными, а программисты носили бороды, родилась технология оверлеев. Было это эдак в конце 80-тых, начале 90-тых годов н.э.
В те далёкие годы операция умножение занимала более 10 тактов. А алгоритм конвертирования YUV в RGB более 100 тактов. И встал вопрос как быть американские телевизоры и камеры работали в стандарте YUV. А компьютерные мониторы в стандарте RGB. Если прикинуть, то для картинке 640х480 требовалось более 30 МГц.
А для картинке 320х240 в 4 раза меньше 7,5 Мгц. А Это всего один кадр в секунду! В ту пору скорость центрального процессора была всего несколько десятков МГц (15-60 МГц). Получалось что в таком случае процессор будет всё время занят. Он будет всё время конвертировать картинку для вывода и у него не останется ни на что более времени. Ни на перетаскивания окна, ни на ввод символов. Инженеры подумали и решили возложить эту функцию на видеокарту.

Оверлей - это аппаратная функция видеокарты, позволяющая накладывать изображения "поверх" основного экрана (первичной поверхности) без копирования видеопамяти. Что значительно ускоряет вывод изображения.
Изначально такое наложение добивались кабелем вида "штаны". Затем перешли на цифровой аналоговый преобразователь(ЦАП). Цифроаналоговом преобразователе видеокарты (RAMDAC) в процессе формирования отправляемого на монитор видеосигнала построчно сканирует первичную поверхность, и когда доходит до изображения-оверлея, переключается на него. Микрософт в DX SDK для иллюстрации этого приводит следующую картинку:



Применительно к DirectX7 оверлей - это поверхность DirectDraw, для вывода которой, в отличие от обычных поверхностей, не нужно выполнять блиттинг или перенос данных непосредственным доступом. Достаточно просто указать положение на экране и размеры оверлея, и он будет постоянно "висеть" перед первичной поверхностью, добавляясь к каждому кадру по описанному принципу (своего рода дополнительная первичная поверхность произвольного размера и положения). Т.к. добавление происходит непосредственно в RAMDAC, оверлей не изменяет содержимое первичной поверхности (не "портит" фон), и если убрать его - изображение восстановится само собой.

В DX SDK оверлеи сравниваются с "листом прозрачной плёнки, который накладывается на экран". Не очень-то прозрачный, добавлю я от себя. Но общий принцип именно такой - можно накладывать этот лист на экран, потом убирать, и это нисколько не повлияет на содержимое экрана. Можете лично проверить и убедиться .

С развитием техники функция оверлей перешла от ЦАП на графический процессор. Где добавилось возможность создавать несколько оверлеев, а также смешивать, комбинировать цвета. Что нашло применение в DirectX9

Также легко догадаться и логически убедиться натурально в невозможности получить скриншот этого "листа" (скриншот - это копия памяти первичной поверхности, а оверлей в память не копируется). Многие сталкиваются с этим при написании "грабилок" экрана или просто при попытке получить кадр любимого фильма. Единственное, что здесь можно посоветовать - отключить (попросить отключить пользователя) использование оверлеев в медиаплеере.

Когда вы работаете с камерой через VFW, то там тоже самое изображение сформированное для предпросмотра выводится на оверлей. Задать режим работы можно при помощи функции
Код:
capOverlay(WindowHandle, False);
При отключённым оверлеи картинка будет копироваться в видеобуфер(первичную поверхность в терминологии DX).
Не рекомендуется копировать видео поток из окна предпросмотра. Во-первых это медленная операция. Так как требуется переслать данные из видеопамяти в системную память. А во-вторых картинка может быть растянута или же пройти через ряд фильтров которые снизят качество видеоматериала.

А отключить или включить режим предпросмотра можно следующей функцией.
Код:
capPreview(WindowHandle, False);
Если отключить предпросмотр, то вы сможете захватывать ваше изображения без вывода на форму. Более детально как это сделать расскажу отдельно.

При подготовки использовались следующие ссылки:
1) http://www.delphimaster.ru/articles/directx/
2) https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 30.12.2015 в 15:22.
Pavia вне форума Ответить с цитированием
Старый 30.12.2015, 11:29   #5
Viktor_Ptica
Пользователь
 
Регистрация: 23.12.2015
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
спасибо за статью, буду пробовать.

Цитата:
Сообщение от Pavia Посмотреть сообщение
Вас интересует готовый код или вы хотите разобраться в вопросе?
Я хотел бы разобраться в вопросе для дальнейшего использования знаний в своем проекте. Задача весьма специфична (хоть и для себя). Если у Вас есть готовый код (не обязательно готовый проект, копипаст не использую, пока не пойму как работает код) - буду очень признателен.
Если задача кажется легкой - то решать её придется очень долго.
Viktor_Ptica вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Невизуальная передача изображения с веб-камеры Viktor_Ptica Мультимедиа в Delphi 2 26.12.2015 20:47
aBitmap : TBitmap; размер изображения Downloads Общие вопросы Delphi 15 12.08.2013 17:22
TBitmap. Ошибка при загрузке изображения 640х480 xrob Мультимедиа в Delphi 6 09.04.2013 20:54
Видео и Изображения из Камеры(тв-тюнера) 100GRamm Компьютерное железо 2 09.10.2011 20:17
Delphi. Считывание данных с веб-камеры AlessOn Помощь студентам 2 09.10.2010 00:04