Webcam

Für Fragen von Einsteigern und Programmieranfängern...
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4609
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 »

Ich bin von TBitmap we zu TBGRABitmap, da dieses über die verschiedenen BS stabiler ist und viele Funktionen bietet, die man alle nicht dokumentiert findet :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
six1
Beiträge: 403
Registriert: Do 1. Jul 2010, 19:01

Re: Webcam

Beitrag von six1 »

af0815 hat geschrieben:
Mi 5. Mai 2021, 21:28
Ich bin von TBitmap we zu TBGRABitmap, da dieses über die verschiedenen BS stabiler ist und viele Funktionen bietet, die man alle nicht dokumentiert findet :-)
:lol: :lol: :lol: :lol:
Gruß, Michael

Benutzeravatar
Winni
Beiträge: 796
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Webcam

Beitrag von Winni »

af0815 hat geschrieben:
Mi 5. Mai 2021, 21:28
Ich bin von TBitmap we zu TBGRABitmap, da dieses über die verschiedenen BS stabiler ist und viele Funktionen bietet, die man alle nicht dokumentiert findet :-)
Hi!

Source code lesen, source code leseen, source code lesen .....

Da findet man ab und zu sogar Web-Adressen statt Dokumentation. z.B. bei den BlendOperations. Und es ist spannend, was die BGRAbitmap so kann. Entdecke immer noch neue Funktionen,

Winni

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

Re: Webcam

Beitrag von nevermore2k »

Wenn wir gerade schon bei den Bitmap Geschichten sind :)
Irgendwie ist es so, dass wenn das QT5 Widget Set Aktiv ist, die Bitmaps nicht angezeigt werden. Was muss ich denn machen damit diese auch unter QT Funktionieren. Dieses Beispiel zeigt bei mir zumindest nur mit dem GTK2 Widget set das Bild an. Bei QT bleibt es blank, ohne Meldung (das Gleiche verhalten wie mit der Webcam Geschichte)
Was muss in den Projekteinstellungen einstellen das dies auch unter QT geht? Finde da nichts wirklich im Netz, kann auch sein das ich falsch suche.

Bild

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}

interface

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

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    PaintBox1: TPaintBox;
    procedure Button1Click(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  MyPicture: TPicture;
begin
  MyPicture := TPicture.Create;
  try
    MyPicture.LoadFromFile('/home/soul/Bilder/test2.jpg');

     PaintBox1.Canvas.Draw(0, 0, MyPicture.Bitmap);
  finally
    MyPicture.Free;
  end;

end;

end.

wp_xyz
Beiträge: 3746
Registriert: Fr 8. Apr 2011, 09:01

Re: Webcam

Beitrag von wp_xyz »

Du darfst nur im OnPaint-Event zeichnen: Mache MyPicture zu einer Variablen des Formulars, lies das Bild im OnClick nach MyPicture ein, rufe Paintbox1.Invalidate auf (was ein Neuzeichnen der Paintbox bewirkt) und gib es im OnPaint aus:

Ungetestet:

Code: Alles auswählen

type
  TForm1 = class(TForm)
  ...
  private
    MyPicture: TPicture;
  ...
  end;
  
procedure TForm1.Button1Click(Sender: TObject);
begin
  MyPicture.Free;
  MyPicture := TPicture.Create;
  MyPicture.LoadFromFile('....');
end,

procedure TForm1.PaintboxPaint(Sender: TObject);
begin
  Paintbox1.Canvas.Draw(0, 0, MyPicture.Bitmap);
 end;
 
 procedure TForm1.FormDestroy;
 begin
   MyPicture.Free;
 end;

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

Re: Webcam

Beitrag von nevermore2k »

Danke das funktioniert so jetzt auch mit QT. :)

Ob das Invalidate an der richtigen Stelle ist weiß ich nicht.


Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}

interface

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

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    PaintBox1: TPaintBox;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
  private
    MyPicture: TPicture;

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyPicture.Free;
  MyPicture := TPicture.Create;
  MyPicture.LoadFromFile('/home/soul/Bilder/test2.jpg');


end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

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

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin

  if MyPicture <> nil then
    Paintbox1.Canvas.Draw(0, 0, MyPicture.Bitmap);

  PaintBox1.Invalidate;
end;

end.

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

Re: Webcam

Beitrag von nevermore2k »

Wenn ich bei der Webcam Anwendung mit dem QT Widgetset, in der PaintBox bei "OnPaint"
das Draw rein kloppe und dann ein Invalidate mache, kommt plötzlich ein Bild.

PaintBox.Canvas.Draw(0, 0, BMP);
PaintBox.Invalidate;

Wenn es In der VideoFrameSynchroronized steht, kommt keines.
Wenn ich es in der Onpaint ohne Invalidate reinsetze, aktualisiert sich das Bild erst, wenn ich das Fenster mit der Maus verlasse.
Ist das normal ??

na ja sinnvoll Edit das auch nicht, die CPU Leistung geht echt hoch dann. Weill er es ja ständig neu holt.
Zuletzt geändert von nevermore2k am Do 6. Mai 2021, 02:30, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 3746
Registriert: Fr 8. Apr 2011, 09:01

Re: Webcam

Beitrag von wp_xyz »

nevermore2k hat geschrieben:
Do 6. Mai 2021, 01:15
Ob das Invalidate an der richtigen Stelle ist weiß ich nicht.
Nein. Das Invalidate hat im OnPaint nichts zu suchen, denn da ist die Ausgabe ja schon am laufen, und mit Invalidate forderst du gleich wieder einen neuen Ausgabezyklus an. Richtigerweise kommt es ins OnClick des Buttons - sorry ich habe das vergessen:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyPicture.Free;
  MyPicture := TPicture.Create;
  MyPicture.LoadFromFile('....');
  Paintbox1.Invalidate;   // <--------- hier
end;
Wiegesagt, Paintbox1.Invalidate bewirkt das Neuzeichnen der Paintbox, weil es die Darstellung der Paintbox als "ungültig" erklärt und einen Paint-Befehl in der Nachrichten-Warteschlange des Betriebssystems ablegt; der Befehl wird ausgeführt, wenn die Anwendung idle ist. Man könnte auch Paintbox1.Refresh aufrufen, das würde sofort ausgeführt, aber Invalidate hat den Vorteil, dass mehrere aufeinanderfolgende Aufrufe gebündelt werden.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4609
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:
Do 6. Mai 2021, 02:03
Wenn es In der VideoFrameSynchroronized steht, kommt keines.
Weil du hier ausserhalb von OnPaint bist. VideoFrameSynchroronized wird vom V4L2 Thread über Synchronized aufgerufen, damit der Kontext stimmt. Dort kannst du das Bild zwischenspeichern und dann ausgeben lassen. Ich mache es zusätzlich so, das ich nicht jedes Bild annehme, sondern nur diejenigen die ich brauche, da ich keinen Film draus machen will. Ich nehme zB. jedes 2-4 Bild. Damit kann man auch unnötige Rechenzeit vermeiden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Webcam

Beitrag von nevermore2k »

Ich lerne, glaub echt viel gerade :)
D.h. ich könnte einen Timer nehmen und im "OnTimer" das Invalidate durchführen. Würde man das so machen ?

Ich verstehe allerdings immer noch nicht, warum das der GTK version egal ist, ob etwas im OnPaint ist oder nicht, und es dort wie erwartet dargestellt wird.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4609
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:
Do 6. Mai 2021, 10:48
Ich verstehe allerdings immer noch nicht, warum das der GTK version egal ist, ob etwas im OnPaint ist oder nicht, und es dort wie erwartet dargestellt wird.
Grundlegend darf man nicht vergessen, das Lazarus uns sehr viel eigenheiten der nativen Widgetsets versteckt. Es gibt Widgetsets, da kannst du ausserhalb von OnPaint zeichnen. Dann gibt es Widgetsets, wo das ganz einfach nicht funktioniert. Allgemein, sollte man immer im OnPaint zeichnen, dann verschwinden die Bilddaten auch nicht, wenn man das Fenster verschiebt etc. Ich bin manchmal auch etwas unbedacht in diesen Sachen, obwohl ich es weis, allerdings nur im Hinterkopf. Der Vorderkopf, muss sich also immer wieder mal ne Beule holen :lol:

^Bezüglich Timer, brauchst du nicht unbedingt. Geht auch damit in dem du, wenn ein Bild kommst mal nachfragst, wieviel Zeit vergangen ist und wenn das Interval vorbei ist, so zeigst du wieder ein Bild. Viel Wege führen nach Rom.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Webcam

Beitrag von nevermore2k »

Ok verstehe, glaube ich zumindest :) d.h. der Korrekte weg ist eigentlich immer über OnPaint. Allerdings denkt sich GTK... mhhh... nööö geht auch so, und kaschiert das ganze.

Hab mal zu Testen einen Slider eingebaut, der stellt einen Timer um, der wiederum das Invalidate in seinem Intervall triggert,, so das ich die FPS zwischen 60 und 5 schalten kann. KSySGuard zeigt bei der Anwendung bei 60 FPS eine Auslastung von 3 % an bei 720p (30fps Kamera).

Wenn ich die Kamera mit OpenCV über Python Anzeige ist die Auslastung bei 4 % (gut das Ding macht noch etwas mehr im Hintergrund und ist voll multithreaded) Aber ist ja schonmal gar nicht so schlecht insgesamt.

Das mit dem Bildnachfragen muss ich mal versuchen :) hört sich etwas stressfreier an als mit dem Timer zu Arbeiten.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4609
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:
Do 6. Mai 2021, 13:09
Das mit dem Bildnachfragen muss ich mal versuchen :) hört sich etwas stressfreier an als mit dem Timer zu Arbeiten.
Es hängt davon ab, was du machen willst. Ich brauche meistens getriggerte Standbilder mit bis zu 20 Mpx. Da wird es langsam zum Stress für den PC. Dort schmeisse ich alles an Bildern weg was ich nicht brauche, allerdings muss die Kamera laufen, damit die Belichtungsautomatik etc. noch weiterläuft. Ok ist ein anderes Feld, als was du brauchst.

Generell gibt es auch von RVMedia Software für so Kameraanwendungen zum kaufen. Vom Preis her ist die in Ordnung und läuft mit Lazarus/FPC. Da man damit den Source kaufen muss - ist aufgrund des Paketsystems von Lazarus/FPC so - hat man auch die Gewissheit das man selbst was fixen kann. Läuft auf Windows und Linux (auch Arm-Linux schon probiert). Hat nur so seine Probleme mit Spezialkameras, da man dort auch EIgenschaften ändern muss, die das Programm nicht unterstützt (wozu auch). Link https://www.trichview.com/features/rvmedia.html . Support ist dort Ok, Sergey antwortet in seinem Forum sehr flott und kümmert sich um die Anliegen. Doku gibt es auch. Warum schreibe ich das, weil ich ein gutes Produkt für Lazarus auch mal beim Namen nennen muss, auch wenn es kostet. Ich habe es nur getestet und bin zufrieden, das es für mich nicht ganz passt hängt mit der aktuellen Anwendung zusammen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Webcam

Beitrag von nevermore2k »

Sieht nice aus, das RichView, preislich ist es auch OK, wenn man damit Geld verdienen wird / möchte. :) Ich mag erstmal einfach nur Lazarus verstehen, und da dachte ich bastel mal was, das ich auf einer anderen Plattform schonmal gemacht habe ( mac mit cocoa - objective c und quicktime / avfoundation). 4 Kameras Anzeigen und dann als einziges Video Speichern am besten mit TimeCode eingeblendet usw. Ist aber schon 10 Jahre her und hab keinen Schimmer mehr :) Fange Quasi wieder von vorne an :)

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4609
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 »

Es gibt 2 Varianten um zu Videos zu kommen unter Linux. Entweder V4L oder GStreamer. V4L ist einfacher von der Pascalseite her. Für Gstreamer gibt es weniger unter Pascal, dafür ist es mächtiger.

Gstreamer ist in machen Ideen dem DirectShow von MS ähnlich und auch so kompliziert :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten