Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Erkennung von einfachen Formen (https://www.delphipraxis.net/198787-erkennung-von-einfachen-formen.html)

ULIK 29. Nov 2018 13:59

Erkennung von einfachen Formen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Servus,

ich hab aktuell das Problem, daß ich erkennen soll, ob eine durch eine beliebige Anzahl von Punkten definierte Polyline in etwa einem Kreis, einem Rechteck oder einem Dreieck entspricht. Wenn ja, dann sollen die Punkte so abgeändert werden, daß sie exakt diese Form bilden.

Hintergrund der Geschichte: wenn jemand mit der Maus/dem Stift eine Linie zeichnet, dann will ich erkennen, ob die Linie so in etwa einen Kreis/ein Rechteck/ein Dreieck darstellt und wenn ja, dann soll die Linie auf genau dieses Rechteck, Dreieck/Kreis hin geglättet werden.
Sprich ein schnell hin gezeichnetes Rechteck soll als korrektes Rechteck dann in der Zeichnung erscheinen (siehe Anhang)

Gibt's für sowas irgendwelche Algorithmen oder Stichworte, nach denen man Theorie dazu suchen kann? Da das Ganze während des Schreibens auf dem Bildschirm passieren soll, dürfte die Bestimmung nicht mehr als ca. 1/2-1 Sekunde in Anspruch nehmen. Ist das realistisch?


vielen Dank,
Uli

HolgerX 29. Nov 2018 14:06

AW: Erkennung von einfachen Formen
 
Hmm..

Fragen wir mal erstmal, 'wie' die Sysmbole gezeichnet werden.

Wenn hierfür den IInkRecognizer von MS verwendest, kannst Du über die Strokes Poligone bekommen.
Dann brauchst Du nur diese zu analysieren ;)

ULIK 29. Nov 2018 14:25

AW: Erkennung von einfachen Formen
 
Hast schon recht, es wird hier Ink aufgezeichnet (via InkOverlay). Nur das analysieren der Polyline ist ja das Problem. Ich wüßte jetzt nicht, daß die Ink hier etwas anbietet, um Formen zu erkennen.
Zumindest nichts, was unter Windows 7 läuft und keine UWP benötigt.
Oder hab ich das was übersehen?

HolgerX 29. Nov 2018 14:32

AW: Erkennung von einfachen Formen
 
Hmm..

es gibt da als Aufsatz IInkAnalyse (oder so ähnlich) jedoch konnte ich die hierfür benötigte TypeLib noch nicht identifizieren.

Damit sollte es dann möglich sein, eine StrokeCollection zu Prüfen..

Gibt nur leider kaum Beispiele (außer UWP) hierfür..

ULIK 29. Nov 2018 15:14

AW: Erkennung von einfachen Formen
 
Ich bin mir nicht mal sicher, ob das IInkAnalzer Interface überhaupt via TypeLib gibt. Im Standard MSInkAut ist jedenfall nichts drinnen. Auch im InkDevider nicht.

Ich denke, ich muß erst mal selbst eine Lösung zu finden.

TigerLilly 30. Nov 2018 07:06

AW: Erkennung von einfachen Formen
 
Können sich die Formen überlappen? Kannst du die einzelne gezeichnete Form schon identifizieren?

Uwe Raabe 30. Nov 2018 07:18

AW: Erkennung von einfachen Formen
 
Vielleicht kannst du den
Delphi-Quellcode:
TGestureRecognizer
oder die
Delphi-Quellcode:
TGestureEngine
aus Vcl.Touch.Gestures irgendwie verwenden. Die sind in der Lage, anhand einer Punktliste eine vorher registrierte CustomGesture zu erkennen.

Rollo62 30. Nov 2018 08:56

AW: Erkennung von einfachen Formen
 
Wenn die so aussehen wie in deinem Bild würde ich versuchen die Ränder zu finden und abzufahren,
und dabei Eckpunkte zu erkennen (Tangenten machen einen größeren Sprung).
Gibt es 4 Ecken = Rechteck
Gibt es 3 Ecken = Dreieck
Gibt es 0 Ecken = Kreis

Ist aber ein sehr vager Algorithmus, zugegeben :stupid:
Jegliche Abweichung von der Norm wird Probleme bereiten.

hanvas 30. Nov 2018 09:29

AW: Erkennung von einfachen Formen
 
Zitat:

Zitat von ULIK (Beitrag 1419691)
Servus,
ich hab aktuell das Problem, daß ich erkennen soll, ob eine durch eine beliebige Anzahl von Punkten definierte Polyline in etwa einem Kreis, einem Rechteck oder einem Dreieck entspricht. Wenn ja, dann sollen die Punkte so abgeändert werden, daß sie exakt diese Form bilden.

[...]

Gibt's für sowas irgendwelche Algorithmen oder Stichworte, nach denen man Theorie dazu suchen kann? Da das Ganze während des Schreibens auf dem Bildschirm passieren soll, dürfte die Bestimmung nicht mehr als ca. 1/2-1 Sekunde in Anspruch nehmen. Ist das realistisch?

Uli

Mit OpenCV geht das ganz gut.

Ein wirklich gut erklärtes Beispiel das fast genau auf dein Problem passt - allerdings in Python - findest Du in

https://www.pyimagesearch.com/2016/0...ape-detection/

Gute OpenCV Bindings für Delphi sind mir allerdings nur bis zur OpenCV Version 2.4.13 bekannt (aktuell ist OpenCV 4.0)

https://github.com/Laex/Delphi-OpenCV

für dein Problem sollte die 2.4.13 aber reichen

hth Hans-Joerg

ULIK 30. Nov 2018 10:27

AW: Erkennung von einfachen Formen
 
Vielen Dank auch allen!

Ich werd mir jetzt mal die diversen Ideen ansehen und schauen, was davon verwendbar wäre. Kann etwas dauern... :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz