PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Webcam Auslesen mit Delphi



dutschman
26.07.2006, 13:21
Liebe Robonetzler,
wie kann ich in Delphi das Signal einer handelüblichen Webcam auslesen. Ich bräuchte eine Funktion, die mir ein aktuelles Bild zurückliefert. Wie es dann weiter geht müsste eigentlich klar sein. Es kommt dabei kaum auf Geschwindigkeit an. Die sicherlich sehr informationshaltigen Threads zu dem Thema waren, was die Lösung meines Problems angeht, nicht wirklich aufschlussreich. Ich lass mich aber gerne eines besseren belehren.

michigrunf
26.07.2006, 15:14
Ich suche auch schon recht lange nach einer Lösung.
Bin jetzt dabei den Webcamtreiber anzusteuern oder muss mir selbst einen Treiber schreiben. Ich hab nur keinen Schimmer wie das geht :(

Edit: Ich habe dein "kaum" bei der Geschwindigkeit überlesen, also kannst du ganz normal Video for Windows (VfW) oder WIA oder WDM(?) nutzen.

dutschman
26.07.2006, 17:33
Ganz normal ist gut. Kannst du mir eine konkrete Anleitung geben? Das wäre toll.

Treiber schreiben dürfte recht kompliziert sein.

ähM_Key
27.07.2006, 01:02
Hi!
Geht ganz einfach:

1. Erst mal machst du ein neues Formular und läst alles wie es ist (Name, Größe usw.)
2. Setzt du ein TPanel auf das Formular
3. Löscht du den gesamten Code des Formulars und setzt diesen ein

const
WM_CAP_DRIVER_CONNECT = WM_USER + 10;
WM_CAP_EDIT_COPY = WM_USER + 30;
WM_CAP_SET_PREVIEW = WM_USER + 50;
WM_CAP_SET_OVERLAY = WM_USER + 51;
WM_CAP_SET_PREVIEWRATE = WM_USER + 52;

implementation

{$R *.dfm}

//Dann brauchst du noch das hier
function capCreateCaptureWindow(lpszWindowName: LPCSTR;
dwStyle: DWORD;
x, y,
nWidth,
nHeight: integer;
hwndParent: HWND;
nID: integer): HWND; stdcall;
external 'AVICAP32.DLL' name 'capCreateCaptureWindowA';

procedure TForm1.LaberLaber; //halt irgendne Prozedur, ich habs im Formcreate, damit ich gleich was seh ^^
var handle:THandle;
begin
handle := capCreateCaptureWindow('Video',ws_child+ws_visible , 0,
0, 320, 240, Panel1.Handle, 1); //Wie du siehst, brauchst du ein Panel in diesem Beispiel ;-)
SendMessage(handle, WM_CAP_DRIVER_CONNECT, 0, 0);
SendMessage(handle, WM_CAP_SET_PREVIEWRATE, 30, 0);
sendMessage(handle, WM_CAP_SET_OVERLAY, 1, 0);
SendMessage(handle, wm_cap_set_preview, 1, 0);
end;
//orig von http://www.delphipraxis.net/post282535.html#282535


Gruß, MK

root
27.07.2006, 11:14
Naja, ganz so gehts dann doch nicht...
Da es ja eine Webcam ist, wird die auch über HTTP angesprochen
wie das geht, kann man im Browser, wo man ja auch die Bilder ansehen kann
nachprüfen.
In Delphi gibts (zumindest bei 7, glaube auch bei 5) die Komponente TIDHTTP
auf der Komponentenseite Indy Clients.
Port, URL bzw IP einstellen, das Protokoll ausführen
mit den methoden IDHTTP.post bzw get und man sollte die Images
als Bilddaten bekommen. Ich glaube nicht das die Kamera streamt, dann
müßte man es etwas anders machen
Gruß
root

ähM_Key
27.07.2006, 11:22
Ich gehe davon aus, er hat eine USB Webcam, die an dem Rechner hängt, wo er auch das Delphi-Programm ausführen will.

Black Scorpion
27.07.2006, 11:43
Servus Leute,
also wenn es um Probleme mit Delphi geht kann ich nur
www.delphi-forum.de empfehlen.

Zu diesem Problem gibt es einen Link von meiner Seite aus:
http://www.delphi-forum.de/viewtopic.php?t=19282&highlight=webcam

Einfach mal bei der Suche "Webcam" eingeben und durchblättern. Dort gibt es komplexe als auch einfache Beispiel.

dutschman
27.07.2006, 14:26
Vielen Dank für die ganzen Antworten.
Das sieht doch machbar aus.
Ja ich will eine USB-Webcam nehmen (einfach weil billig und unkompliziert)

sast
27.07.2006, 16:50
Einfach nach Anleitung vorgehen
http://www.delphipraxis.net/topic71146_webcambildzugriff+zuerst+grabbe+amp+dek omprimiere+den+frame.html

und mit "FBitmap.SaveToFile()" in der Callback Funktion kannst du sogar noch je nach Timereinstellung das aktuelle Bild speichern.

sast