|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
23.03.2012, 09:57 | #11 |
Пользователь
Регистрация: 14.10.2011
Сообщений: 77
|
Частично решил задачу через сообщение вебке
SendMessage(hWndC, WM_CAP_SET_CALLBACK_FRAME, 0, Integer(@FrameCallback)); но операция StretchDIBits(DC, 0, 0, 640, 480, 0, 0, status.uiImageWidth, status.uiImageHeight, lpVHdr.lpData, bt, 0, SRCCOPY); в функции обратного вызова не работает. Насколько я понял, проблема в формате данных, передаваемых функции через параметр lpVHdr.lpData. Объём данных изображения в структуре соответствует 16 битам на пиксел, хотя сообщение SendMessage(hWndC, WM_CAP_GET_STATUS, SizeOf(status), Integer(@status)); переданное веб-камере возвращает 24 бита на пиксель. И окно настроек свойств в системе даёт нормальную картинку. Заморачиваться особенно не буду, преобразую как нибуди неполноценно цветную картинку в серый цвет и обработаю. Не художественная фотография. |
23.03.2012, 10:05 | #12 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
23.03.2012, 10:06 | #13 |
Пользователь
Регистрация: 14.10.2011
Сообщений: 77
|
И ещё. Настройка разрешения веб-камеры через сообщение
SendMessage(hWndC, WM_CAP_GET_VIDEOFORMAT, SizeOf(Bt), LongInt(@Bt)); Bt.bmiHeader.biWidth := 640; // ваши ...поддерживаемые камерой Bt.bmiHeader.biHeight := 480; Bt.bmiHeader.biSize := SizeOf(Bt.bmiHeader); Bt.bmiHeader.biPlanes := 1; Bt.bmiHeader.biBitCount := 24; SendMessage(hWndC, WM_CAP_SET_VIDEOFORMAT, SizeOf(Bt), LongInt(@Bt)); не даёт эффекта ни в большую, ни в меньшую сторону. И в настройках в системе нет параметра "разрешение". Надо полагать камера не поддерживает другие разрешения, хотя по логике в меньшую сторону должна. Камера "Panda", полного названия нет, взял что было, при установке она сама что-то нашла в инете и установила. |
23.03.2012, 10:10 | #14 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
23.03.2012, 10:11 | #15 |
Пользователь
Регистрация: 14.10.2011
Сообщений: 77
|
Согласен, но размер массива данных, переданный через параметр lpVHdr в функции обратного вызова показывает разрешение только в 16 бит. При попытке считывать по 24 бита даёт ошибку при выходе за пределы размера. Я побитно считываю данные и передаю в Bitmap. Ничего другого не придумал.
|
23.03.2012, 12:01 | #16 | |
Старожил
Регистрация: 29.09.2009
Сообщений: 9,713
|
Цитата:
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation |
|
23.03.2012, 17:44 | #17 |
Пользователь
Регистрация: 14.10.2011
Сообщений: 77
|
В общем всё получилось и даже заработало, но опять с некоторыми ограничениями.
Изначально создавал форму во весь экран. Информацио с веб-камеры отправлял на другую скрытую форму через сообщение SendMessage(hWndC, WM_CAP_GRAB_FRAME, 0, 0); А на в Image1.Picture.Bitmap первой формы сливал данные через указатель в структуре PVIDEOHDR, передаваемый драйвером веб-камеры в функцию обратного вызова function FrameCallback(hWnd: HWND; lpVHdr: PVIDEOHDR): DWORD; stdcall; Теперь, если свернуть главное окно (изображение с камеры передаётся через Handle скрытой формы на её Canvas) пропадает изображение и уже не восстанавливается. В принципе некритично, форма будет работать на весь экран, но хотелось бы знать, почему так происходит и как побороться. Кто подскажет? |
23.03.2012, 17:56 | #18 |
Пользователь
Регистрация: 14.10.2011
Сообщений: 77
|
И ещё.
Что за набор данных, передаваемый через указатель в структуре TVIDEOHDR. Картинка, которую я беру с этого указателя имеет размер 2 байта на пиксел (640*420*2). Долго ломал голову, потом махнул рукой и первыми байтами заполнил все три цвета на Bitmape рисунка на форме. Получилась вполне сносная чёрно-белая картинка. Для определения штрих-кода достаточно, но сомнения гложат. Что, если я изменю разрешение и всё пойдёт наперекосяк. Пробовал навскидку проанализировать биты в этих двух байтах и сравнить с RGB. Сложилось ощущение, что это два противоположных (негативных) цвета, а может и яркостная составляющая. Кто знает? |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Изображение из веб-камеры в файл. | OmgA | Помощь студентам | 2 | 21.03.2012 17:10 |
Выбор веб камеры | kazzz | Компьютерное железо | 0 | 26.12.2011 00:16 |
Выбор веб-камеры | Hudishka | Компьютерное железо | 7 | 13.01.2011 10:25 |
Трансляция веб-камеры | LevonNikox | JavaScript, Ajax | 2 | 29.10.2010 12:58 |