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