![]() |
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:
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.
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. |
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.
|
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?
|
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ß! :?
|
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 12:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz