AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kreise und Linien Erkennen , jetzt mit FMX (LINUX)

Ein Thema von bernhard_LA · begonnen am 11. Jun 2020 · letzter Beitrag vom 21. Jun 2020
Antwort Antwort
Rollo62

Registriert seit: 15. Mär 2007
4.241 Beiträge
 
Delphi 12 Athens
 
#1

AW: Kreise und Linien Erkennen , jetzt mit FMX (LINUX)

  Alt 16. Jun 2020, 10:52
nicht immer kann ich den Caller wie im Beispiel oben optimieren
Dann würde vielleicht helfen ein "Shadow-Bitmap" zu führen, das vielleicht auch nur ein TAlphaColor array Buffer ist.
Der dann nur bei Bedarf am Stück in das echte Bitmap kopiert wird.
Macht aber wohl nur Sinn wenn die Bitmaps nicht zu groß werden, und Du nicht dauernd neue Bilder laden musst.

Bitmaps in FMX kann man auch über die Texture-Komponenten verwalten, vielleicht gibt es da auch was Passendes für Dich.
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.153 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Kreise und Linien Erkennen , jetzt mit FMX (LINUX)

  Alt 20. Jun 2020, 23:10
was macht eigentlich die map Funktion genau ?
im Task Manager ist meine GPU auf 80 % für 10 min

der VCL code hat eine Laufzeit im Sekunden Bereich
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.079 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Kreise und Linien Erkennen , jetzt mit FMX (LINUX)

  Alt 21. Jun 2020, 01:21
Wenn du Map und Unmap außerhalb deiner Schleife aufrufen würdest, dann wäre das auch Ruckzuck erledigt.
Ansonsten würde einfach ein Debuggen mit Debug-DCUs und F7 dir schon weiterhelfen zu erkennen, dass ein ständiges hin- und herkopieren des Bitmaps aus dem Grafikkartenspeicher in den CPU erreichbaren RAM pro (!) einzelnen Pixel nicht die schnellste Lösung ist.
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.111 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Kreise und Linien Erkennen , jetzt mit FMX (LINUX)

  Alt 21. Jun 2020, 19:12
Die Sache hat mich interessiert.
Ich habe mir deshalb das Demo-Projekt einmal angeschaut und, nachdem ich auf einige Ungereimtheiten stieß, ein eigenes Projekt erstellt, das im Anhang zu finden ist.

Zu den langen Laufzeiten:
Die sind darauf zurückzuführen, dass
1) Für die Prüfung der Pixel eine eigene Funktion aufgerufen wird, die ihrerseits mit TBitmap.ScanLine einen Zeiger auf die Pixeldaten holt, die RGB-Werte liest und prüft, ob der Mittelwert der RGB-Werte 1/3 Threshold übersteigt.
2) In den Prozeduren Hough_CircleDetection und Hough_LineDetection wiederholt cos(theta*PI/max_theta) und sin(theta*PI/max_theta) berechnet werden. Sinnvoller ist es, die Sinus und Cosinus Werte für alle 0 bis 360 Theta Werte (bzw. 0 bis 180 bei LineDetection) in Tabellen zu stellen und bei Bedarf daraus zu lesen.

Mit dem Programm im Anhang können Bilder geladen werden und Linien- / Kreiserkennungen durchgeführt werden.
Die daraus resultierenden Bitmaps können als Bitmap oder JPEG gespeichert oder als Bitmap ins Clipboard kopiert werden.
Die Original-Prozeduren stehen in der Unit "Unit_HoughTransformation".
Die von mir erstellten Prozeduren stehen in der Unit "Detect_Transformation".
Die Prozeduren zur Kreis- und Linienerkennung sich auch als Assembler-Prozeduren vorhanden, für 32Bit und 64Bit.
Das Ganze ist für VCL. Wie das für FMX angepasst werden kann/muss weiß ich nicht, weil ich mich nie mit FMX beschäftigt habe.
Bitte keine Rückfragen zur Funktionsweise der Kreis-/ Linienerkennung. Ich habe mich damit nicht beschäftigt sondern nur auf Basis der Original-Codes meine Codes erstellt.

Wenn ein Bild geladen ist, kann die Linienerkennung mit F4 (Original-Prozeduren), Ctrl-F4 (Neue Prozeduren) oder Shift-F4 (Assembler-Prozeduren) gestartet werden.
Die Kreiserkennung wird nach dem gleichen Schema mit F5 gestartet.
Mit F11 können anschließend die gemessenen Ausführungszeiten angezeigt werden.
Für das Bild "circle_many.bmp" wurden für die Erkennung von Kreisen folgende Zeiten gemessen:

Original 883.2 ms
Neu 47.90 ms
Assembler 25.03 ms

Tipps:
Die Dateinamen geladener Bilder werden in einer Liste gespeichert und im Menu Datei > "Bild laden" Menu-Einträge erzeugt, mit denen diese Dateien erneut geladen werden können.
Mit Strg-F2 kann das zuletzt geladene Bild erneut geladen werden.
Wenn der Eintrag "Menu > Optionen > Einstellungen bei Programmende speichern" markiert ist, werden die Einstellungen und die Liste der geladenen Dateien in der Datei "DetectSettings.bin" im Programmverzeichnis gespeichert und beim nächsten Programmstart geladen.

Das Original Projekt enthält mehrere Fehler. So werden zum Beispiel die bei der Erkennung von Linien und Kreisen erstellten Daten vor der nächsten Erkennung nicht gelöscht, was zur Folge hat, dass die Daten die Summen aller Erkennungen enthalten.
Ich habe das (für die Original-Routinen) bewusst so belassen.
Wenn der Eintrag "Daten vor Erkennung löschen" markiert ist, werden diese Daten vor einer Erkennung gelöscht und enthalten dann korrekte Daten.

Im Anhang befinden sich
Die Source-Codes meines Projektes und des Original-Projektes.
Die .exe Dateien meines Projektes und des Original-Projektes.
Die zum Original-Projekt gehörenden Bilder
Angehängte Dateien
Dateityp: zip Detect.zip (3,32 MB, 5x aufgerufen)
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz