OpenCV Face Detect

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

OpenCV Face Detect

Beitrag von six1 »

Hallo,
über http://forum.lazarus.freepascal.org/ind ... ic=31851.0 habe ich einen Start in die Materie gefunden.
Capture von Bildern einer WebCam funktioniert.

Jedoch bietet die OpenCV.pas Implementierung nicht die Gesichtserkennung aus OpenCV. ( cvHaarDetectObjects).
Dafür müssen weitere Scripte, wie ocv.core.types_c angepasst werden.
Leider bin ich daran gescheitert :(

Hat sich schon jemand mit dem Thema befasst und nötige Dateien an Lazarus angepasst? (OpenCV V2 oder V3) ( ocv.core_c.pas, ocv.core.types_c.pas, ocv.tracking_c.pas ...)


Gruß, Michael
Gruß, Michael

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

Re: OpenCV Face Detect

Beitrag von six1 »

Hi,
nach einigen Problemen, habe ich die OpenCV Dateien von Delphi soweit anpassen können, dass die Objekterkennung funktioniert.
Alle Delphi Units werden kompiliert, jedoch habe ich nicht alle Funktionen probiert!
Mir kam es darauf an, Bilder einer Webcam einzulesen und in diesen Objekte erkennen zu können.

Die OpenCV DLLs bitte hier herunterladen: https://opencv.org/releases.html (Version 2.4.13.5 diese Version ist in ocv.lib.pas definiert!)
In das Programmverzeichnis folgende DLLs aus obigem Download, opencv\build\x86\vc14\bin\ kopieren
opencv_calib3d2413.dll
opencv_contrib2413.dll
opencv_core2413.dll
opencv_features2d2413.dll
opencv_highgui2413.dll
opencv_imgproc2413.dll
opencv_legacy2413.dll
opencv_nonfree2413.dll
opencv_objdetect2413.dll
opencv_photo2413.dll
opencv_video2413.dll

Es handelt sich hierbei um ein Working Sample und nicht um eine fertige Software!
Habe das nur zusammengeschustert, um die Face Detect Funktionalität zum Laufen zu bringen.
Um eine Gesichtserkennung zu erreichen, ist noch einiges zu tun :?

Leider kann ich hier keine weiteren Anhänge hochladen. Hier der Link zum Mediafire Download:
http://www.mediafire.com/file/3t2a024na ... Detect.zip

Bild:
http://www.mediafire.com/view/kof090bbdcm9n2t/Bild1.png

Gruß, Michael
Gruß, Michael

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

Re: OpenCV Face Detect

Beitrag von six1 »

H,
ich bräuchte mal ein bisschen Hilfe:

Wie kann ich diese Struktur in Lazarus übersetzen? Ich kapiere es nicht :(

bei folgendem kommt eine Fehlermeldung:
ocv.core.types_c.pas(4593,61) Error: Message recordind not yet supported

Code: Alles auswählen

type
  TCV_SET_ELEM_FIELDS<elem_type> = record
    flags: Integer;
    next_free: ^elem_type;
  end;
 
  TCvVoronoiNode2D = record
    // CV_VORONOINODE2D_FIELDS:TCV_VORONOINODE2D_FIELDS;
    CV_SET_ELEM_FIELDS: TCV_SET_ELEM_FIELDS<TCvVoronoiNode2D>;
    pt: TCvPoint2D32f;
    radius: Single;
  end;
 


Bin für jede Erleuchtung dankbar.

Gruß, Michael
Gruß, Michael

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: OpenCV Face Detect

Beitrag von Socke »

Mit konkreten Typen funktioniert das wunderbar:

Code: Alles auswählen

type
  PCvVoronoiNode2D = ^TCvVoronoiNode2D;
 
  TCV_SET_ELEM_FIELDS = record
    flags: Integer;
    next_free: PCvVoronoiNode2D;
  end;
 
 
  TCvVoronoiNode2D = record
    // CV_VORONOINODE2D_FIELDS:TCV_VORONOINODE2D_FIELDS;
    CV_SET_ELEM_FIELDS: TCV_SET_ELEM_FIELDS;
    pt: TCvPoint2D32f;
    radius: Single;
  end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: OpenCV Face Detect

Beitrag von six1 »

Danke Socke, hat mich weiter gebracht.
Gruß, Michael

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

Re: OpenCV Face Detect

Beitrag von six1 »

Hi,
ich habe weiter mit der Delphi Vorlage gespielt und mittlerweile die Delphi Komponenten angepasst, so dass diese in Lazarus kompilierbar sind und eingebunden werden.
Dies bezieht sich in meinem Fall auf Lazarus 1.8.0/x86 Win10.
Bild

Zu den Problemen komme ich später...

Hier das Paket mit den Komponenten: http://www.mediafire.com/file/j1h5mwsj5 ... enCV_2.zip (~20MB mit Dlls)
Die DLLs aus "DLL_Backup" am besten nach c:\Windows kopieren. (Ansonsten müssten diese im Verzeichniss von Lazarus.exe und im jeweiligen Projektverzeichnis vorhanden sein).

Hier das Paket mit dem Testprojekt: http://www.mediafire.com/file/p1yognue3 ... Detect.zip (~7MB)

Das Projekt zeigt die Verwendung der ocvCameraSource und der ocvImageOperation Komponenten.
Es können bis zu drei HaarClasses über Comboboxen ausgewählt werden und so bis zu drei verschiedene "Dinge" in Bildern erkannt werden.
Über eine weiter Combobox können Bildeffekte ausgewählt werden, wie Grayscale, Erode, Dilate usw.

Soweit geht also schon etwas...

Ein Problem ist die ocvView Komponente, welche eigentlich Images von den Sourcen wie Webcam oder ImageOperation anzeigen soll.
Dies funktioniert nicht und ich weiß nach stundenlanger Suche nicht, woran es hapert.
Die Komponente zeigt zur Laufzeit einen Teil der Form an, anstatt des Images der Webcam!
Schiebt man die Form zur Laufzeit etwas zusammen und zieht sie wieder langsam auf, so flackert manchmal das richtige Bild auf...
Das irre ist, wenn ich in icv.comp.view in TocvView.WMPaint(var Message: TWMPaint); ab Zeile 295 die relvanten Teile zum Zeichnen der Canvas entferne, zeigt die Komponente zur Laufzeit immer noch Teile der Form... ?!?!?
Bild


Ein Tipp am Rande: Zum Debugen habe ich alle Scripte der Komponenten in das Projektverzeichnis kopiert. (Projekt neu kompilieren!). Ansonsten funktionieren die Haltepunkte nicht.

Vielleicht hat ja jemand Interesse daran, mal in die Sourcen reinzuschauen... ich bin im Moment ziemlich frustriert und komme einfach nicht weiter.

Gruß, Michael
Gruß, Michael

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

Re: OpenCV Face Detect

Beitrag von af0815 »

Wenn dein Projekt (Sourcen) bei Github (oder ähnlich) liegen würde, so wäre es einfacher. Man kann auch dann Änderungen verfolgen. Zip's von irgenwelchen Servern zu laden ist mir einfach zu riskant, vor allen, wo schon bei dem Besuch der Seite von Mediafire einigen Warnungen bei mir auftauchen.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: OpenCV Face Detect

Beitrag von six1 »

Hi Andreas,
nun gut, ich habe die Veröffentlichung von OpenCV_Master(Delphi) für Lazarus überarbeitet und unter Lazarus 1.8.0 x86 erfolgreich kompiliert.
Die Struktur habe ich nun auf Github hochgeladen.

https://github.com/six1/Laz_OpenCV_2

Das Lazarus Sample liegt als Zip unter samples/

Die Probleme der View Komponente sind natürlich geblieben :)

Gruß, Michael
Gruß, Michael

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

Re: OpenCV Face Detect

Beitrag von six1 »

Hi,
ich habe mich noch etwas weiter durch dieses riesige Projekt OpenCV durchgearbeitet.

Neben dem Problem mit OcvView besteht das Problem, dass es eine Exception nach einiger Zeit gibt, wenn man einen Videostream einer Webcam in einem TImage anzeigt.

Hierfür habe ich die Funktion TocvImage.AsBitmap verwendet.
Nachdem ich die Bitmap probeweise über eine eigene Routine erzeugt habe und das funktionierte, war klar woher der Fehler kommt.

Code: Alles auswählen

function TocvImage.AsBitmap: TBitmap;
var
  deep: Integer;
  // i, j, K, wStep, Channels: Integer;
  // data: PByteArray;
  // pb: PByteArray;
begin
  if (FImage <> NIL) then
  begin
    try
    Result := TBitmap.Create;
 


Hier wird bei jedem Aufruf der Funktion AsBitmap eine TBitmap erzeugt und nie zerstört... klar, warum es irgendwann kracht.
Ich werde dem Objekt TocvImage eine Bitmap spendieren :)

Übrigens hatte ich einige DLL im Upload auf Github vergessen, die ich mittlerweile eingespielt habe.
Wenn man einen Stream einer Webcam empfangen möchte, muss man die OpenCV ffmpeg dll eingespielt haben. Zudem muss ffmpeg auf dem Rechner vorhanden sein und die Path Variable auf das ffmpeg/bin Verzeichnis erweitert werden.
Webcam Stream läuft danach hervorragend!

Irgendwie ist das Ganze noch sehr experimentell :lol: , aber ich habe schon relativ viel am laufen.
Wenn ich wesentliches gefixt habe, spiele ich es in Github Master ein. (Link siehe oben)

Gruß, Michael
Gruß, Michael

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

Re: OpenCV Face Detect

Beitrag von six1 »

Hi,
ich habe die Komponenten etwas überarbeitet und auch ein neues Sample für Lazarus (Laz V1.8.0) erstellt.

https://github.com/six1/Laz_OpenCV_2

Probleme mit OcvView sind noch nicht gelöst.

Gruß, Michael
Gruß, Michael

Antworten