![]() |
einzelnes Bild von der Webcam machen
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
hier im forum gibt es ja bereits anleitungen wie man Bilder von der webcam erhält aber ich denke wenn man es minimalistisch mag dan ist meine methode ganz okay :)
Delphi-Quellcode:
mfg smallsmoker
unit UnitWebcam;
interface uses Windows; const WM_CAP_DRIVER_CONNECT = $0400 + 10; WM_CAP_DRIVER_DISCONNECT = $0400 + 11; WM_CAP_SAVEDIB = $0400 + 25; WM_CAP_GRAB_FRAME = $0400 + 60; WM_CAP_SET_VIDEOFORMAT = $0400 + 45; var CaptureWindow: dword; isConnected: Boolean; function capCreateCaptureWindowA(lpszWindowName: PChar; dwStyle: dword; x, y, nWidth, nHeight: word; ParentWin: dword; nId: word): dword; stdcall external 'AVICAP32.DLL'; function capGetDriverDescriptionA(wDriverIndex: UINT; lpszName: LPSTR; cbName: integer; lpszVer: LPSTR; cbVer: integer): BOOL; stdcall; external 'AVICAP32.DLL'; function ListWebcams(): string; procedure GetWebcamSnapshot(Filename: string); Procedure ConnectWebcam(WebcamIndex: integer); procedure DisconnectWebcam(); implementation function ListWebcams(): string; var szName, szVersion: array[0..MAX_PATH] of char; iReturn: boolean; x: integer; begin x := 0; repeat iReturn := capGetDriverDescriptionA(x, @szName, sizeof(szName), @szVersion, sizeof(szVersion)); if iReturn then begin Result := Result + '|"' + szName + ' - ' + szVersion + '"'; Inc(x); end; until iReturn = False; result := copy(result,2,length(result) - 2); end; Procedure ConnectWebcam(WebcamIndex: integer); begin CaptureWindow := capCreateCaptureWindowA('CaptureWindow', WS_CHILD or WS_DISABLED, 0, 0, 0, 0, GetDesktopWindow, 0); isConnected := (CaptureWindow <> 0) and (SendMessage(CaptureWindow, WM_CAP_DRIVER_CONNECT, WebcamIndex, 0) <> 0) end; procedure DisconnectWebcam(); begin SendMessage(CaptureWindow, WM_CAP_DRIVER_DISCONNECT, 0, 0); CaptureWindow := 0; end; procedure GetWebcamSnapshot(Filename: string); var bmi: BITMAPINFO; begin if isConnected then begin SendMessage(CaptureWindow, WM_CAP_SET_VIDEOFORMAT, 0, integer(@bmi)); SendMessage(CaptureWindow, WM_CAP_GRAB_FRAME, 0, 0); SendMessage(CaptureWindow, WM_CAP_SAVEDIB, 0, longint(PChar(Filename))); end; end; end. Beispielprojekt im Anhang |
Re: einzelnes Bild von der Webcam machen
Hi!
Ist es as-designed, dass ich anstelle meiner WebCams "nur" einen Eintrag "Microsoft WDM Image Capture (Win32) - Version: 6.1.7600.1638" in der Combobox bekomme? Wähle ich diesen aus und möchte dann einen Snapshot machen, dann kommt ein Fenster "Videoquelle", wo ich dann nochmals eine Combobox habe zum auswählen der tatsächlichen Webcam. Danach funktioniert es aber. Win 7 Pro, 64bit Grüße, Frederic |
AW: einzelnes Bild von der Webcam machen
Hallo,
der Code macht eigentlich alles, was ich benötige, um Bilder (keine Videos) mit USB-Cams zu machen. Allerdings habe ich mehrere baugleiche USB-Cams (z.Z. 2 Stück, später 4). Ich kann immer nur die zuletzt installierte auslesen. Im Gerätemanager sind beide aufgelistet und mit einem anderen Programm kann ich auch beide ansteuern. Ich habe den Eindruck, dass nur die Treiber aufgelistet werden. Da die USB-Cams jedoch alle den gleichen Treiber haben, ist so eine Unterscheidung nicht möglich. Wo muss das Programm verändert werden? Peter |
AW: einzelnes Bild von der Webcam machen
Setting the Initial State
The Webcam service supports the Initial State partner. Initial state is used to configure: Which camera to use, if more than one is supported. Default is the first camera found. What frame rate for capture. Default is the highest supported by the camera. What size frame to capture. Default is the largest frame size supported at the highest frame rate. The file in which to save captured frames. The default is not to save captured frames. The quality to save at. Default is 0. ![]()
Delphi-Quellcode:
Procedure ConnectWebcam(WebcamIndex: integer);
begin CaptureWindow := capCreateCaptureWindowA('CaptureWindow', WS_CHILD or WS_DISABLED, 0, 0, 0, 0, GetDesktopWindow, 0); isConnected := (CaptureWindow <> 0) and (SendMessage(CaptureWindow, WM_CAP_DRIVER_CONNECT, WebcamIndex=HIERMUSSDEINECAMERASTEHEN, 0) <> 0) end; |
AW: einzelnes Bild von der Webcam machen
Hallo hathor,
mit dem Parameter WebcamIndex habe ich auch schon gespielt. Im Gerätemanager werden unter Bildbearbeitungsgeräte angezeigt: - USB-Videogerät #3 - USB-Videogerät #4 Nur mit WebcamIndex:= 1 wird eine Cam ausgelesen. Welche das jeweils ist, kann ich nicht steuern (meistens #3). Peter |
AW: einzelnes Bild von der Webcam machen
Gib in REGEDIT in der Suchfunktion 65E8773D-8F56-11D0-A3B9-00A0C9223196 ein.
Ändere die FriendlyName -Einträge Deiner WebCams durch Anfügen von -1, -2, -3 usw. So kannst Du die WebCams unterscheiden. |
AW: einzelnes Bild von der Webcam machen
Hallo hathor,
ich habe nur einen Eintrag Friendly Name. Muss ich noch Einträge erstellen? Peter |
AW: einzelnes Bild von der Webcam machen
Das nützt nichts.
Wenn die WebCams keine eigenen Einträge haben, hilft nur ein Hardware-Scanner oder USB-Hub, der die einzelnen Cameras zum USB durchschleift. Die einzelnen USB-Ports beim USB-Hub sollten adressierbar oder fernsteuerbar sein. Andererseits: Wenn die WebCams an verschiedenen USB-Ports sind, bekommen sie sicher auch eigene Einträge in der Registry. Dann kann der FriendlyName wie oben empfohlen geändert werden. Zitat: "Im Gerätemanager sind beide aufgelistet und mit einem anderen Programm kann ich auch beide ansteuern." Wenn Du mehr mitteilungsfreudig wärst, könnte man vielleicht besser helfen!!! |
AW: einzelnes Bild von der Webcam machen
Hallo hathor,
die anderen Programme sind - Amcap Vers. 8.00 von Microsoft - Mini-WebCamara Utily von 2008 (mitgeliefert mit USB-Cams von Conrad) Mit dem Ziel, 4 USB-Cams einzusetzen, ist der Einsatz eines USB-Hubs nicht zu vermeiden. Peter |
AW: einzelnes Bild von der Webcam machen
Hallo,
wenn ich die Procedure GetWebcamSnapshot als ersten Befehl um SendMessage(CaptureWindow, WM_CAP_DLG_VIDEOSOURCE, 0, 0); ergänze mit der Deklaration const WM_CAP_DLG_VIDEOSOURCE = $0400 + 42; kann ich die USB-Cam auswählen. Allerdings erscheint dann immer ein Dialog, den ich vermeiden möchte. In der Dokumentation zu der AVICAP32.DLL habe ich kein Befehl wie WM_CAP_SET_VIDEOSOURCE o.ä. gefunden. Ist das richtig? Ist eventuell TSCAP32 ( ![]() Peter |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:57 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