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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2012, 15:00   #1
Aleksandr_59
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 77
По умолчанию Управление веб-камерой

В процедуре отдельного модуля в цикле осуществляется покадровая обработка картинок, снятых с веб-камерыЖ

Код:
var
  hWndC : HWND;
  hWndDC: HDC;
  PWidth: integer;
  PHeight: integer;
  PHandle: HWND;
  Bt : BITMAPINFO;
  bSkan: boolean;
  cp1: TComportDriverThread;
const strWeb: string='Веб-камера недоступна';

implementation

procedure CamCreate;
var
  strMess: string;
  ICamWidth, ICamHeight, ICamTop, ICamLeft: integer;
  dHW: double;
begin
   //создаем область для вывода получаемых в будущем картинок =)
  hWndC := capCreateCaptureWindowA('My Own Capture Window',
    WS_CHILD or WS_VISIBLE, 0, 0, PWidth, PHeight, PHandle, 0);

if hWndC <> 0 then
  hWndDC:=GetDC(hWndC);
  if SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0) <> 0 then
    begin
    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));
    SendMessage(hWndC, WM_CAP_SET_CALLBACK_FRAME, 0, Integer(@FrameCallback));
    SendMessage(hWndC, WM_CAP_GET_VIDEOFORMAT, SizeOf(Bt), LongInt(@Bt));
    end;
end;

procedure Snimok;
var
  strRez, sTemp: string;
  //xt, yl, xw, yh, intF: integer;
begin
  CamCreate;
  if hWndC=0 then Exit;
  while bSkan do
    begin
    Application.ProcessMessages;
    SendMessage(hWndC, WM_CAP_GRAB_FRAME, 0, 0);
    UnitCam.FormCam.ICam.Refresh;
    strRez:=UnitSc.Threshold(UnitCam.FormCam.ICam.Picture.Bitmap);
    if strRez<>'' then
      begin
      if strRez<>sTemp then begin beep; bSkan:=false;
        Widget.Form1.LabelNom.Caption:=strRez; end;
    end;
  CanClose;
end;

procedure CanClose;
begin
  if hWndC <> 0 then
  begin
    SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);  //"отключаемся" от веб-камеры
    hWndC := 0;
  end;
end;

function FrameCallback(hWnd: HWND; lpVHdr: PVIDEOHDR): DWORD; stdcall;
begin
  Result := 0;
// информация о изображении
  SendMessage(hWndC, WM_CAP_GET_STATUS, SizeOf(status), Integer(@status));
// вывод результата в окно
  ... здесь происходит обработка картинки
  end;
Основная процедура - это Snimok. Выход из цикла - по флагу bSkan. Насколько я понял, в ряде случаев не срабатывает процедура CanClose (освобождение камеры). Есть предположение, что это происходит, когда посылается сообщение SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0), а функция обратного вызова занята обработкой.
Собственно вопрос: как определить, обработала камера сообщение или нет? И как дальше всё же отключиться от камеры? Периодически в цикле или по таймеру, как то коряво.
Aleksandr_59 вне форума Ответить с цитированием
Старый 17.04.2012, 15:25   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...а что вы имеете против мультимедийного таймера?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 17.04.2012, 16:25   #3
Aleksandr_59
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 77
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
...а что вы имеете против мультимедийного таймера?
Да вообщем ничего, только как реализовать гарантированное отключение веб-камеры? Если сообщение послано, а она не отключилась, то при следующем запросе возникает ошибка.
Aleksandr_59 вне форума Ответить с цитированием
Старый 17.04.2012, 16:53   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...у вас проблема в построении самого бесконечного вызова while bSkan do ...как думаете с какой скоростью у вас происходит вызов граба ? И сколько таких запросов становится в очередь в зависимости от мощности процессора и загруженности машины? И выделяет ли она в итоге после всего этого время на ваш запрос? Кулер не шумит во время запуска?

Ставьте мультимедийный таймер и не вызывайте чаще, чем дает FPS сама WEB-ка. Да и чаще смысла нет.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 17.04.2012 в 16:55.
raxp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Видеонаблюдение с веб-камерой Delphin00b Помощь студентам 0 28.02.2012 18:13
Работа с веб камерой Abbath1349 Общие вопросы .NET 1 05.07.2011 17:15
упровление веб камерой kuno_sd Общие вопросы C/C++ 4 16.10.2010 13:30