Webcam

Für Fragen von Einsteigern und Programmieranfängern...
nevermore2k
Beiträge: 42
Registriert: Sa 1. Mai 2021, 15:39

Webcam

Beitrag von nevermore2k »

Hi,
Ist es möglich in Lazarus / Linux auf eine Webcam zuzugreifen und den Stream auf dem Formular anzuzeigen ? Und vorallem wie ?

Habe schon etwas gegoogelt, und bin dann auf 5dpo und v4l2 gestoßen, mit v4l2 werden ja die kameras unter Linux behandelt.
Ich habe auch die v4l2 Komponente in Lazarus installiert bekommen... Und jetzt steh ich da, keine Doku und nichts dafür... die Demo dafür funktioniert nicht richtig.
Hat jemand von euch erfahrung in diesem Berreich ? Und kann mir da etwas weithelfen ?
Hab vor Jahren mal mit AVFoundation und Quicktime Hantiert auf dem Mac mit Objective C und dort war es relativ einfach.. aber hier steh ich da wie ne Kuh im Wald :(

Timm Thaler
Beiträge: 1201
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Webcam

Beitrag von Timm Thaler »

Kommt drauf an was die Webcam liefert.

Ich greife hier Snapshots von einer Webcam ab und baue daraus ein Zeitraffer-Video.

Meine Webcam liefert Snapshots als jpg, einen Bilderstream als mjpeg über https und einen Videostream über rtps.

Testen kann man das gut im Browser, da kann man über die verschiedenen Protokolle auf die verschiedenen Inhalte zugreifen. Es ist nicht ganz trivial, wenn die Webcam einigermaßen brauchbar ist möchte sie einen Login mit Passwort und eine sichere Verbindung.

nevermore2k
Beiträge: 42
Registriert: Sa 1. Mai 2021, 15:39

Re: Webcam

Beitrag von nevermore2k »

Es sind USB Webcams - Logitech c920 und Logitech StreamCam (60fps). Hm du scheintst IP Cams zu haben oder ?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4591
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Webcam

Beitrag von af0815 »

https://github.com/afriess/fpcVideo4L2
Die Version verwende ich mit Debian und Raspian. Mit verschiedenen Logitechkameras und BRIO. Auch mit USB3 Kameras von TheImageSource.

Es würde auch gstreamer gehen, das habe ich aber nur sehr rudimentär zum Laufen gebracht. Ist aber nur ein Zeitproblem :D Damit habe ich schon mal GigE Kameras am laufen gehabt.

Wenn es etwas kosten darf, gibt es auch Komponenten.
Zuletzt geändert von af0815 am Di 4. Mai 2021, 21:28, insgesamt 1-mal geändert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

nevermore2k
Beiträge: 42
Registriert: Sa 1. Mai 2021, 15:39

Re: Webcam

Beitrag von nevermore2k »

hättest du mir da ein kleines Beispiel Projekt ?, das Projekt das dabei ist, zeigt mir kein Bild an. Weiss einfach nicht so recht wie ich da ansetzen soll

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4591
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Webcam

Beitrag von af0815 »

Installier dir das QT V4L test Utility. Bekommst du damit ein Bild geht es auch mit Pascal.

Mit dem Tool kann man alle wichtigen Parameter in Erfahrung bringen. Geht es mit dem Tool nicht, so hat man meist Bibliotheken oder udev Regeln nicht richtig.

Edit:
Wenn man sich die Video Geräte unter /dev ansieht, ist das Device mit der geraden Nummer meistens das richtige. Man muss nur aufpassen, wenn man einen Laptop hat, dann ist /dev/video2 meist das richtige. /dev/video0 ist normalerweise die interne Kamera.

Wichtig ist, einmal das Video-Format und die Auflösung zu wissen. Kann sein , das im Demo ein anderes Format verwendet wird, als deine Kamera kann.
Du kannst im Create auch das Format V4L2_PIX_FMT_YUYV verwenden. Dann im VideoFrameSynchronized die Zeilen
//YUYV_to_BGRA(PLongWord(Buffer), PLongWord(BMP.RawImage.Data), BMP.Width*BMP.Height);
YUYV_to_BGRA16(PLongWord(Buffer), PWord(BMP.RawImage.Data), BMP.Width*BMP.Height);
mal umschalten.

Wie gesagt, man muss einmal wissen, welche Formate die Kameras können.

Es ist am ANfang nicht ganz trivial. Deswegen mal mit dem QT V4L test Utility herumspielen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

nevermore2k
Beiträge: 42
Registriert: Sa 1. Mai 2021, 15:39

Re: Webcam

Beitrag von nevermore2k »

ne alles andere als Trivial :)

also ich kann mit den Kameras eigentlich alles anstellen dort und die geben immer ein Bild aus im QT V4l2 :)

Hab es geschaft das in der Demo wenigstens das Kamera Licht angeht, allerdings kommt kein Bild.

nevermore2k
Beiträge: 42
Registriert: Sa 1. Mai 2021, 15:39

Re: Webcam

Beitrag von nevermore2k »

Ich komme nicht weiter, irgendwas fehlt... bekomme den stream nicht in die paintbox ( ich bin noch sehr neu in Lazarus / Pascal keine Woche bisher)
Ich habe ein Projekt mal auf mein google drive hochgeladen....


https://drive.google.com/file/d/1L9qP0l ... sp=sharing

also die Kamera kann YUYV bei 640x480 auf 30fps

YUYV_TO_BGRA16

gibt es irgendwie nicht in der dekleration YUV2RGB Datei

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4591
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Webcam

Beitrag von af0815 »

Generell mal die Frage, hast du den Beispielcode mal probiert ? Weil im Code von dir fehlt eigentlich alles, was den V4L Teil initialisieren soll.

Wenn du Dateien hochlädst, bitte ohne Exekutable, libs, etc. Das spart mächtig Platz und mir unnötigen Balast.

Dein Code:

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
  VideoCapture, YUV2RGB ;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    LabelError: TLabel;
    PaintBox1: TPaintBox;
    Video: TVideo4L2Device;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure VideoFrame(Sender: TObject; Buffer: pointer; Size: integer;
      Error: boolean);
    procedure VideoFrameSynchronized(Sender: TObject; Buffer: pointer;
      Size: integer; Error: boolean);
  private
    BMP: TBitmap;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  BMP := TBitmap.Create;
  BMP.Width := PaintBox1.Width;
  BMP.Height := PaintBox1.Height;
  BMP.PixelFormat := pf24bit;
 //BMP.PixelFormat := pf32bit;
 // pf24bit; // Byte order: BGR. pf32bit gives inverted RGB order for some reason
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Video.Open := True;
  Video.Capture := True;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Video.Free;
  BMP.Free;
end;

procedure TForm1.VideoFrame(Sender: TObject; Buffer: pointer;
  Size: integer; Error: boolean);
begin
end;

procedure TForm1.VideoFrameSynchronized(Sender: TObject; Buffer: pointer;
  Size: integer; Error: boolean);
begin
  if Size <> (PaintBox1.Width * PaintBox1.Height * 2{YUYV}) then
  begin
    LabelError.Caption := 'Invalid buffer length ' + IntToStr(Size);
  end;
  if Error then
  begin
    LabelError.Caption := 'Frame with recoverable error received';
  end;
  BMP.BeginUpdate;
  YUYV_to_BGRA(PLongWord(Buffer), PLongWord(BMP.RawImage.Data), BMP.Width * BMP.Height);
  //YUYV_to_BGRA16(PLongWord(Buffer), PWord(BMP.RawImage.Data), BMP.Width * BMP.Height);
  BMP.EndUpdate;
  PaintBox1.Canvas.Draw(0, 0, BMP);

end;
end.
Ich hätte mir so etwas erwartet im Create

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  // v4l
  Video:=TVideo4L2Device.Create(Self);
  // A lot of low budgetcameras use this YUYV Format
  Video.PixelFormat := V4L2_PIX_FMT_YUYV;
  // Set the resoloution and other parameters depending of the camaera
  Video.Width := 640;
  Video.Height := 480;
  Video.FrameRate := 6;
  Video.BufferCount := 2;
  Video.Device:= '/dev/video0';

  Video.OnFrameSynchronized := @VideoFrameSynchronized;

  // BMP for on-form preview
  BMP:=TBitmap.Create;
  BMP.PixelFormat:=pf24bit;
  PaintBox.Width := Video.Width;
  PaintBox.Height := Video.Height;
  BMP.SetSize(Video.Width,Video.Height);
end;
Weil du erzeugst weder das Video Objekt noch wird es von dir initialisiert. Ohne das das Objekt initialisiert ist geht einmal nichts. Man darf dann auch den Debugger nehmen und sich einen Breakpoint in die VideoFrameSynchronized setzen. Dann sieht man, ob die überhaupt angesprungen wird. Wenn nicht, so ist vorher noch ein Fehler drinnen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

nevermore2k
Beiträge: 42
Registriert: Sa 1. Mai 2021, 15:39

Re: Webcam

Beitrag von nevermore2k »

Der ist schon rein gesprungen in die FrameSynchronized. Und auch bis zu Paintbox1.Canvas.Draw.

Ich stelle gerade fesst, das dein link von dem V4l ein anderer ist als den der ich benutzte. Ich installiere mal deinen.

Das ist der Create in dem Beispielprojekt von dem Forge den ich genutzt habe. Daher wusste ich es nicht besser :/

https://github.com/uaply/fpcVideo4L2

Code: Alles auswählen

procedure TFormMain.FormCreate(Sender: TObject);
begin
  BMP:=TBitmap.Create;
  BMP.Width:=PaintBox.Width;
  BMP.Height:=PaintBox.Height;
  BMP.PixelFormat:=pf24bit; // Byte order: BGR. pf32bit gives inverted RGB order for some reason
  UpdateParams;
end; 

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4591
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Webcam

Beitrag von af0815 »

nevermore2k hat geschrieben:
Mi 5. Mai 2021, 10:52
Ich stelle gerade fesst, das dein link von dem V4l ein anderer ist als den der ich benutzte. Ich installiere mal deinen.
Ich habe von dem einen Fork gemacht und mit Code von Alfred sogar lauffähig. Nimm bitte das DemoAlf. Könnte sein, das das Demo Probleme macht, da es seine Dateien nicht findet. Dann bitte das Paket aus dem Verzeichnis decoders in die Liste der Pakete aufnehmen. Ich habe da in den letzten Tagen zusätzliche Decoders hinzugefügt und die Struktur etwas angepasst. Das Demo habe ich dabei nicht bedacht.

Edit: Ein neues Demo hätte ich hier auch noch. Ist ein wenig ausgeweitet und kann auch speziellere Kameras. Allerdings muss man in den Projektoptionen die richtigen Defines anwählen.
Dateianhänge
V4LV01.7z
(3.82 KiB) 9-mal heruntergeladen
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

nevermore2k
Beiträge: 42
Registriert: Sa 1. Mai 2021, 15:39

Re: Webcam

Beitrag von nevermore2k »

ja das mit den Defines, welche genau gebraucht werden ist mir noch nicht ganz klar. Hab zumindest rausbekommen, dass ich das gtk2 widget set nutzen muss, damit ein Bild kommt in der vorschau

nevermore2k
Beiträge: 42
Registriert: Sa 1. Mai 2021, 15:39

Re: Webcam

Beitrag von nevermore2k »

das ist doch schonmal ein fortschritt :)
Bild

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4591
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Webcam

Beitrag von af0815 »

nevermore2k hat geschrieben:
Mi 5. Mai 2021, 14:42
ja das mit den Defines, welche genau gebraucht werden ist mir noch nicht ganz klar. Hab zumindest rausbekommen, dass ich das gtk2 widget set nutzen muss, damit ein Bild kommt in der vorschau
Es geht auch ohne gtk2, nur muss man dann aufpassen, wie das Bild vom Puffer in den Speicher des Bildes eingelesen wird. Ich habe auch festgestellt, das es da ganz schöne unterschiede in den Internas der Komponenten gibt.

Diese ganzen defines ergeben sich daraus, in welchen Format das Bild im Puffer liegt. Das sind ganz einfach mal Bytes die über den FourCC Code https://www.kernel.org/doc/html/v4.9/me ... t-004.html erst eine Bedeutung bekommen. Mit dem Wissen kann man dann die Bytes aus dem Puffer in die richtige Reihenfolge bringen - bei TBitmap ist das RGB oder auch RGBA. Auch hier gibt es je nach Bitmapverfahren verschiedene Kodierungen. Das macht die Sache auch so undurchsichtig.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

nevermore2k
Beiträge: 42
Registriert: Sa 1. Mai 2021, 15:39

Re: Webcam

Beitrag von nevermore2k »

Also sollte ich mich in jedem fall mit TBitmap mal beschäftigen. :)
Danke für deine HIlfe übrigens :)

Antworten