Usb-webcam, Delphi

  • Автор темы vouk03
  • Дата начала
Статус
Закрыто для дальнейших ответов.
V

vouk03

Хочу из программы на Delphi управлять USB веб-камерой: делать снимки по событию и иметь результат, как переменную. Есть ли такой компонент или как иначе это сделать?
 
V

vouk03

Масса народу смотрела - никто не отозвался. Неужели никто ничего не знает? Или это неинтересно? Объясняю. В поле зрения камеры находится, к примеру, 10 объектов. Время от времени с ними что-то происходит. Нужно отреагировать. Есть масса применений, поделюсь идеями, если кто скажет, как подключить.
 
B

Barmutik

А Вы искать сами пробовали ?

Всё описано в хелпе и ищется за 10 минут ... пример написан за 5 минут .. так что не взыщите ...

Код:
const
WM_CAP_START         = WM_USER;
WM_CAP_STOP          = WM_CAP_START + 68;
WM_CAP_DRIVER_CONNECT     = WM_CAP_START + 10;
WM_CAP_DRIVER_DISCONNECT   = WM_CAP_START + 11;
WM_CAP_GRAB_FRAME       = WM_CAP_START + 60;
WM_CAP_EDIT_COPY       = WM_CAP_START + 30;
WM_CAP_DLG_VIDEOSOURCE     = (WM_CAP_START+ 42);

function capCreateCaptureWindowA(lpszWindowName : PCHAR;
                dwStyle : longint;
                x : integer;
                y : integer;
                nWidth : integer;
                nHeight : integer;
                ParentWin : HWND;
                nId : integer): HWND;
                STDCALL EXTERNAL 'AVICAP32.DLL';


procedure TForm1.BClick(Sender: TObject);
begin
if B.Caption = 'Start' then
begin
 hWndC := capCreateCaptureWindowA('My Own Capture Window',
                  WS_CHILD or WS_VISIBLE ,
                  0,
                  0,
                  352,
                  288,
                  Form1.Handle,
                  0);
 if hWndC <> 0 then
 begin
  SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
  B.Caption := 'Stop';
  Timer1.Enabled := True;
 end;
end else
begin
 B.Caption := 'Start';
 Timer1.Enabled := False;
 if hWndC <> 0 then
 begin
  SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
  hWndC := 0;
 end;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var s : string;
begin
if (hWndC <> 0) and (SendMessage(hWndC, WM_CAP_GRAB_FRAME, 0, 0) = 1) and
  (SendMessage(hWndC, WM_CAP_EDIT_COPY, 0, 0) = 1) and (Clipboard.HasFormat(CF_BITMAP)) then
begin
 s := TimeToStr(Time);
 s[3] := '.';
 s[6] := '.';
 s := DateToStr(Date) + ' - ' + s + '.jpg';
  BMP.Assign(Clipboard);
 JPG.Assign(BMP);
 JPG.Compress;
//  JPG.SaveToFile(SavePath + s);
end;
end;

Вызов настроек
Код:
 if hWndC <> 0 then 
 SendMessage(hWndC, WM_CAP_DLG_VIDEOSOURCE, 0, 0);
 
V

vouk03

Barmutik'у: Виноват конечно, но заслуживаю снисхождения: не программист я вообще-то. Спасибо большое, я не надеялся на такой подробный ответ, думал наводку только получить.
Снимаю шляпу перед профессионалом :lol:
 
Z

zubr

Есть очень неплохой компонент DSPACK234, у которого кроме захвата изображения есть множество других возможностей. Также захват не зависит от драйвера захвата.
 
V

vouk03

Zubr, а где взять компонет? "Масса возможностей" интригует, может пригодиться...
 
B

Barmutik

Задача вообщем то не сильно сложная ... просто если Вы не программист, то может стоит обратится со своей задачей к программистам ..

Будет в итоге дешевле и по времени и по деньгам .. чем самому пробивать то в чём Вы не очень разбираетесь...

А так не за что .. удачи! B)
 
C

Chertik

Подскажите, пожалуйста.
А есть ли иные способы сохранения изображения в память для обработки, кроме WM_CAP_EDIT_COPY. И как узнать его размеры и формат(программно). Я только столкнулся с этим вопросом и многого не знаю(студент).
 
Z

zubr

Через DirectX. Тема довольно сложная, в 2-х словах не объяснишь. Скачай компонент DSPACK234, там все это реализовано в исходниках, также литературу поищи по DirectX.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!