Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi frames von zwei identischen webcams grabben (https://www.delphipraxis.net/90428-frames-von-zwei-identischen-webcams-grabben.html)

tillitanglebob 17. Apr 2007 13:18


frames von zwei identischen webcams grabben
 
Hi ihr da draußen,
ich möchte (möglichst ohne die Hilfe von fertigen Komponenten, denn ich will ja was lernen) die Frames von zwei baugleichen Webcams grabben. Anschließend sollen sie zur weiteren Bearbeitung in zwei Images geladen werden. Die Kameras sind zwei SPEEDLINK sqare webcams SL-6810.
Ich habe mich schon im Forum und der win-api-reference ein bissel kundig gemacht, habe mir aber aus dem, was ich verstanden habe, bisher nur folgenden nicht sehr hilfreichen Schnipsel zusammensuchen können:

Delphi-Quellcode:
unit scanneruI;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Clipbrd, Math;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Timer1: TTimer;
    Image2: TImage;
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);

  private

  handle: THandle;

    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
var
  vdevice: boolean;


const
  WM_CAP_DRIVER_CONNECT = WM_USER + 10;
  WM_CAP_EDIT_COPY = WM_USER + 30;
  WM_CAP_GRAB_FRAME_NOSTOP = WM_USER + 61;
  //WM_CAP_SET_MCI_DEVICE = WM_USER + 66;
  WM_CAP_DLG_VIDEOSOURCE = WM_USER + 42;
implementation

{$R *.dfm}

function capCreateCaptureWindow(lpszWindowName: LPCSTR;
  dwStyle: DWORD; x, y, nWidth, nHeight: integer;
  hwndParent: HWND; nID: integer): HWND; stdcall;
  external 'AVICAP32.DLL' name 'capCreateCaptureWindowA';


procedure TForm1.FormCreate(Sender: TObject);
begin
handle := capCreateCaptureWindow('Video',ws_child+ws_visible, 0,
  0, 640, 480, Panel1.handle, 0);
  SendMessage(handle, WM_CAP_DRIVER_CONNECT, 0, 0);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  clipboard.Clear;
  SendMessage(handle, WM_CAP_DLG_VIDEOSOURCE, 0, 0);
  SendMessage(handle, WM_CAP_GRAB_FRAME_NOSTOP, 1, 0);
  SendMessage(handle, WM_CAP_EDIT_COPY, 1, 0);
  if vdevice then
    image1.Picture.LoadFromClipboardFormat(cf_BitMap,Clipboard.GetAsHandle(cf_Bitmap),0)
  else
    image2.Picture.LoadFromClipboardFormat(cf_BitMap,Clipboard.GetAsHandle(cf_Bitmap),0);

  vdevice:= not vdevice;
end;

end.
Es wäre jetzt also interessant zu wissen, wie man das source-device aus dem Programm heraus ohne Dialog festlegt, oder wie man möglicherweise gleichzeitig zwei Webcams initialisiert und ausliest, obwohl ich gelesen habe, dass es da Probleme mit den Treibern gibt. Die Sache mit der Dekompression über die Zwischenablage stellt für mich der Einfachheit halber kein problem dar, da ich das Ganze alleinig und im Vordergrund laufen lassen will.

Robert Marquardt 17. Apr 2007 13:31

Re: frames von zwei identischen webcams grabben
 
Die Frage ist ob die Treiber fuer die Webcam ueberhaupt zwei Geraete unterstuetzen. Webcam-USB-Treiber sind dafuer beruechtigt nur eine Webcam zu koennen.

tillitanglebob 17. Apr 2007 13:41

Re: frames von zwei identischen webcams grabben
 
ich glabe nicht, dass sie zwei webcams zugleich unterstützen, aber man könnte ja auch beide webcams abwechselnd initialisieren. mir geht es nicht so sehr um schnelligkeit. mich interessiert ehr wie man ohne einen dialog das sourcedevice festlegt. gibts da vielleicht einen api-befehl?

tillitanglebob 17. Apr 2007 13:44

Re: frames von zwei identischen webcams grabben
 
es funktioniert übrigens zwei webcams anzuschließen und sie immer abwechseld per dlg_videosource auszuwählen. nervt eben bloß! :?

skyobserver 18. Apr 2007 11:39

Re: frames von zwei identischen webcams grabben
 
Soviel ich weiß kann man mit VfW immer nur eine Video Capture-Quelle ansprechen.

Mit DirectShow kann man auch mehrere gleichzeitig verwenden.
Fertige Komponenten sind zum Beispiel das DSPack (frei).

Einfach mal runterladen und in den Beispielen und im Unit-Code stöbern...


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz