Seite 1 von 1

Webcam

Verfasst: 12.04.2011 06:47
von KatSeiko
Es ist lange her, dass ich PureBasic nutzen konnte. Ich blicke im Beispiel (siehe hier) nicht durch.. Ich brauche nicht viel, nur ein einziges "Foto"..

Kann mir jemand darauf basierend eine Procedure (bitte mit ausfuehrlicher Kommentierung) schreiben, die mir ein Bild als Image aufnimmt und mir die ID des Bildes (als return) wiedergibt? Mit der groessten unterstuetzten Aufnahmegroesse..

Beispiel:

Code: Alles auswählen

WebcamImage = CaptureImageFromWebcam()
Height = ImageHeight(WebcamImage)
Width = ImageWidth(WebcamImage)
OpenWindow(#PB_Any, 0, 0, Height, Width, "Image", #PB_Window_Borderless|PB_Window_ScreenCentered)
ImageGadget(#PB_Any, 0, 0, Height, Width, WebcamImage)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Das Ganze wuerde dann ungefaehr so aussehen:

Bild

Re: Webcam

Verfasst: 12.04.2011 08:04
von Kukulkan
Hallo,

hast Du in der Forensuche mal nach "Webcam" gesucht? Da findest Du haufenweise Beispiele zur Aufnahme von Bildern über API, über's Clipboard etc. Da muss doch was dabei sein...

Wenn nicht, dann such im englischen Forum, dort hat es mindestens 20 Beispiele für den Zugriff auf Webcams.

Kukulkan

Re: Webcam

Verfasst: 12.04.2011 12:51
von Dark
Hi,

um die größt mögliche Auflösung zu nutzen solltest du aber am besten DirectShow nutzen. Bei Video For Windows (VFW), was die meisten hier im Forum nutzen, kann man weder das Format, die Auflösung, noch welche Webcam als Quelle dient durch Programmierung ändern, sondern kann dem Benutzer lediglich einen Systemdialog anzeigen in dem das geändert werden kann.
VFW stellt außerdem nicht immer die maximale Auflösung zur Verfügung. Eine meiner Webcams hat die Auflösung 1280x720, unterstützt über VFW aber nur 640x480 als maximale Auflösung.
DirectShow hat dafür den Nachteil, das es viel schwieriger zu benutzen ist.
Ich würde aber an deiner Stelle das ganze auch nicht in eine Prozedur packen, da so eine Webcam auch mal 2 - 3 Sekunden für die Initialisierung braucht und dein Programm in dieser Zeit hängen würde. Ein eigener Thread mit Callback wäre aus meiner Sicht die bessere Lösung.
Du könntest aber auch ein anderes Programm wie FFmpeg nutzen, welches du mit passenden Parametern anweist einen Frame aufzunehmen und nach stdout zu schreiben. Dann müsstest du nur den Programm Output einlesen und hast dein Bild. (FFmpeg ist in dem Falle aber auch nicht die beste Lösung, da es bisher kein DirectShow unterstützt.)

mfg,
Dark