Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| kurse:ef05a-2021:kurven:bezier-interpolation [2022/01/10 20:15] – created Ivo Blöchliger | kurse:ef05a-2021:kurven:bezier-interpolation [2022/01/20 07:10] (current) – [Warum Interpolation?] Ivo Blöchliger | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Interpolation mittels Bezierkurven ====== | ||
| + | Das (ambitionierte) Ziel ist die Buchstabenerkennung auf einer Smartwatch. | ||
| + | ===== Trainingsdaten ===== | ||
| + | |||
| + | Dazu liegen bereits erste Input-Daten vor: | ||
| + | https:// | ||
| + | |||
| + | Das Format ist wie folgt: | ||
| + | <code txt> | ||
| + | ID letter | ||
| + | ms x y | ||
| + | ... | ||
| + | ms -1 -1 | ||
| + | ms x y | ||
| + | ... | ||
| + | ms -1 -1 | ||
| + | ID letter | ||
| + | ... | ||
| + | </ | ||
| + | Wobei | ||
| + | * ID ist eine 12-stellige Hexadezimalzahl ist. Damit kann z.B. spezifisch für eine Person trainiert werden. | ||
| + | * letter ist ein Zeichen (zur Zeit A-Za-z0-9). | ||
| + | * ms ist die Zeit in Millisekunden seit Beginn des Zeichnens | ||
| + | * x y sind die Pixelkoordinaten (auf einen 240x240 Pixel grossen Bildschirm). | ||
| + | * sind die Koordinaten -1 wurde der Finger abgesetzt. Entweder ist das Symbol fertig, oder es folgt ein weiterer Strich | ||
| + | |||
| + | |||
| + | ====== Geeignete Datenstruktur ====== | ||
| + | * Wir haben mehrere Buchstaben (zur Zeit A-Za-z0-9). | ||
| + | * Jeder Buchstaben kann von verschiedenen Personen gezeichnet worden sein. | ||
| + | * Zu jedem Buchstaben liegt z.T. mehrere " | ||
| + | * Eine Zeichnung besteht aus z.T. mehreren Strichen. | ||
| + | * Ein Strich besteht aus mehreren Zeit/x/y Koordinaten | ||
| + | |||
| + | Später werden aus jeder Zeichnung Daten (Fingerprint) errechnet, mit deren Hilfe dann die Ähnlichkeit mit einer zu bestimmenden Zeichnung errechnet werden kann. | ||
| + | |||
| + | Aus mehreren Zeichnungen eines Buchstabens soll dann auch ein " | ||
| + | |||
| + | ===== Frage: Arrays und Funktionen oder Klasse(n)? ===== | ||
| + | Vorteile von Klassen: | ||
| + | * Einfach erweiterbar | ||
| + | * Einlesen/ | ||
| + | * Übersichtlichkeit im Code dank mehreren Dateien (jede Klasse in eine Datei). | ||
| + | Nachteile von Klassen: | ||
| + | * Boilerplate-Code (Viel Code, damit die Klasse erst mal als solche funktioniert). | ||
| + | * Gefahr vom " | ||
| + | |||
| + | |||
| + | |||
| + | ==== Auslesen und Anzeigen der Daten ==== | ||
| + | Schreiben Sie ein Python-Programm, | ||
| + | |||
| + | ==== Mögliche Ähnlichkeitsmasse ==== | ||
| + | Überlegen Sie sich, wie die Ähnlichkeit zweiter Buchstaben gemessen werden könnte. Formulieren Sie dazu einen präzisen Algorithmus (d.h. wie genau was gerechnet werden soll). | ||
| + | * Ihre Ideen möchte ich haben... | ||
| + | |||
| + | ==== Warum Interpolation? | ||
| + | Ein mögliches Ähnlichkeitsmass besteht darin, die vom Benutzer gezeichnete Kurve in Fourier-Koeffizienten zu zerlegen und diese Koeffizienten zu vergleichen. Weil die Kurve nicht geschlossen ist und aus mehreren Stücken bestehen kann, muss die Kurve vor der Transformation zuerst vervollständigt werden. Um hochfrequentes Rauschen zu minimieren, sollen die fehlenden Stücke " | ||
| + | |||
| + | |||
| + | ===== Code zum Einlesen in einfache Datenstruktur ===== | ||
| + | <code python> | ||
| + | # | ||
| + | # -*- coding: utf-8 -*- | ||
| + | |||
| + | from gpanel import * | ||
| + | |||
| + | makeGPanel(Size(800, | ||
| + | window(0, 240, 240, 0) # Koordinatensystem | ||
| + | |||
| + | |||
| + | alles = {} # Neuer dictionary, keys sind Buchstaben | ||
| + | # Eintrag ist ein dictionary, keys sind ids(person) | ||
| + | # Eintrag ist ein Array, Einträge sind Zeichnungen | ||
| + | # Zeichnung ist ein Array, Einträge sind Striche | ||
| + | # Strich ist ein Array, Eintrag ist ein Array von 3 Einträgen ms,x,y | ||
| + | # | ||
| + | # alles[' | ||
| + | |||
| + | |||
| + | with open(" | ||
| + | while True: | ||
| + | line = datei.readline() | ||
| + | if not line: # Datei Ende? | ||
| + | break | ||
| + | line = line.rstrip() | ||
| + | items = line.split() | ||
| + | | ||
| + | if len(items)==2: | ||
| + | person = items[0] | ||
| + | buchstabe = items[1] | ||
| + | if not buchstabe in alles: | ||
| + | alles[buchstabe] = {} | ||
| + | if not person in alles[buchstabe]: | ||
| + | alles[buchstabe][person] = [] # Platz für Zeichnungen | ||
| + | zeichnung = [] # Platz für Striche | ||
| + | alles[buchstabe][person].append(zeichnung) | ||
| + | strich = [] # Platz für Koordinaten | ||
| + | else: # " | ||
| + | koordinaten = [int(s) for s in items] | ||
| + | if koordinaten[1]==-1: | ||
| + | zeichnung.append(strich) | ||
| + | strich = [] # Neuer Platz für Koordinaten | ||
| + | else: | ||
| + | strich.append(koordinaten) | ||
| + | | ||
| + | |||
| + | for buchstabe, | ||
| + | for person, zeichnungen in personen.items(): | ||
| + | print(" | ||
| + | for zeichnung in zeichnungen: | ||
| + | clear() | ||
| + | for strich in zeichnung: | ||
| + | move(strich[0][1], | ||
| + | for txy in strich: | ||
| + | lineto(txy[1], | ||
| + | delay(20) | ||
| + | | ||
| + | | ||
| + | |||
| + | </ | ||