Interpolation Touchscreen

Gast #1779983
Lesenswert?

Hallo,

Ich versuche momentan einen kapazitiven Touchscreen mit einem ATMega32 
auszuwerten. Dabei benutze ich die QTouch Lib von Atmel um die Signale 
der Sensoren auf einer Folie zu erfassen. Der nächste Schritt ist die so 
gewonnene Matrix zu interpolieren um die Auflösung der Folie zu erhöhen.
Momentan interpoliere ich linear auf das 10-Fache.
Danach stecke ich aber fest. Ich habe keine Idee wie ich nun die x/y 
Koordinate in der interpolierten Matrix finde (wird zb zwischen 2 oder 4 
tasten gedrückt ist kein Maximalwert vorhanden bzw der maximalwert in 
der Matrix entspricht nicht der Fingerposition) bzw ob ich überhaupt die 
ganze Matrix interpolieren muss?
Und bei dem Wetter ist es auch schwer einen kühlen Kopf zu bewahren um 
klar zu denken ;-)

Vielleicht hat hier jemand eine Idee oder kann mich wenigstens in die 
richtige Richtung schubsen?

Gruß Markus
Gast #1780117
Lesenswert?

Mal ein Beispiel mit einer 3x3 Matrix:
_____________
|    |    |    |
|    |    |    |
----------------
|    |x   |    |       Hier drücke ich.
|    |    |    |
----------------
|    |    |    |
|    |    |    |
----------------

Das sind die Werte meiner Sensoren:

| 3  | 6  | 0  |
| 6  | 11 | 0  |
| 0  | 0  | 0  |

Das ist meine Interpolierte Matrix:

| 4  | 4  | 5  | 6  | 4  | 2  | 0  |
| 4  | 5  | 6  | 7  | 5  | 2  | 0  |
| 5  | 6  | 8  | 9  | 6  | 3  | 0  |
| 6  | 7  | 9  | 11 | 7  | 3  | 0  |
| 4  | 5  | 6  | 7  | 4  | 2  | 0  |
| 2  | 2  | 3  | 3  | 2  | 1  | 0  |
| 0  | 0  | 0  | 0  | 0  | 0  | 0  |

Das sieht alles Toll aus, die Werte stimmen so weit, die lineare 
Interpolation ist genau genug aber wie man sieht ist die 11 immer noch 
der höchste Wert. Der höchste Wert müsste aber unter dem Finger liegen, 
was der 8 entspricht.
Gast #1780126
Lesenswert?

Markus schrieb:
> Das sieht alles Toll aus, die Werte stimmen so weit, die lineare
> Interpolation ist genau genug aber wie man sieht ist die 11 immer noch
> der höchste Wert. Der höchste Wert müsste aber unter dem Finger liegen,
> was der 8 entspricht.

Ich verstehe noch nicht so ganz, was du machst, aber wenn du in der 
Mitte eine 11 hast und links eine 6, wird eine lineare Interpolation 
dazwischen niemals einen Wert liefern, der größer als 11 ist.
#1780130
Lesenswert?

Markus schrieb:

> Das sieht alles Toll aus, die Werte stimmen so weit, die lineare
> Interpolation ist genau genug aber wie man sieht ist die 11 immer noch
> der höchste Wert. Der höchste Wert müsste aber unter dem Finger liegen,
> was der 8 entspricht.

Ich denke, da wirst du nicht viel dagegen machen können.
Du hast nun mal nur 3*3 Sensorwerte. Alles andere, was du dazwischen 
reinrechnest beruht nun mal auf der Annahme, dass bildlich gesprochen, 
eine Bergspitze nur in der Mitte eines der Sensorfelder sein kann.

Hast du mal ein paar 'Spielchen' probiert:

alle Werte rund um einen Wert addieren

| 4  | 4  | 5  | 6  | 4  | 2  | 0  |
| 4  | 5  | 6  | 7  | 5  | 2  | 0  |
| 5  | 6  | 8  | 9  | 6  | 3  | 0  |
| 6  | 7  | 9  | 11 | 7  | 3  | 0  |
| 4  | 5  | 6  | 7  | 4  | 2  | 0  |
| 2  | 2  | 3  | 3  | 2  | 1  | 0  |
| 0  | 0  | 0  | 0  | 0  | 0  | 0  |


Als zb für den 8-er links von der 11: 5 + 6 + 7 + 9 + 11 + 9 + 7 + 6

Mit ein wenig Glück kriegst du so eine Verschiebung des Maximums in 
Richtung linke obere Ecke hin.

Aber grundsätzlich: Information die in den Ausgangsdaten nicht vorhanden 
ist, ist weg. Und wenn du dich Kopf stellst, sie ist trotzdem weg.
Deine Ausgangsdaten sind nun mal 9 Sensorwerte und nicht mehr. Aus 
deinen Seonsorwerten kann man noch ablesen, dass der Druckpunkt nicht 
zentral in der Mitte war, sondern eher links von der Mitte und oberhalb 
der Mitte. Aber zu recht viel mehr wirds nicht reichen.
Gast #1780145
Lesenswert?

Huch, ich hab mich verlesen...

| 0  | 0  | 0  |
| 2  | 15 | 2  |
| 1  | 9  | 1  |

Was dann dort wäre:
______________
|    |    |    |
|    |    |    |
----------------
|    |    |    |
|    | x  |    |
----------------
|    |    |    |
|    |    |    |
----------------
Gast #1780147
Lesenswert?

also im mittleren Feld drücken, kann eine den höchsten Wert in einem 
anderen erzeugen?
Schade ich hätte sonst ausgehend vom maximalen Wert, also Feld gedrückt 
geschaut in welche Richtung die Differenzen geringer sind, um die 
Tendenz in dem Feld festzustellen.
#1780150
Lesenswert?

Im Folgenden nur weiterlesen, wenn du dich mit Geometrie und Mathe nicht 
auf Kriegsfuss befindest.

Man könnte versuchen einen Bi-quadratischen Patch in die Daten 
hineinzurechnen und dessen Maximum zu bestimmen.

Hintergrund:
Wenn man 3 Punkte kennt, kann man eine Gleichung 2ten Grades in diese 
Punkte hineinrechnen, so dass alle 3 Punkte auf dieser Gleichung liegen.

Dasselbe kann man auch mit 9 Punkten und einer Fläche machen, die in 2 
Achsrichtungen jeweils aus einer Gleichung 2ten Grades besteht.

Das müsste ungefähr so aussehen
1
 f( x, y ) = z = a*x^2 + b*x + d*y^2 + e*y + f*x^2y^2 + g*x^2y + h*xy^2 + i*xy + j

du hast 9 bekannte Punkte, damit lassen sich 9 Gleichungen dieser Form 
aufstellen und die Koeffizienten a bis j berechnen.

Aus der dann bekannten Formel, kann man wiederum mittels Differentiation 
die Position des Maximums (von z) berechnen.
#1780163
Lesenswert?

hm schrieb:
> Vorrausgesetzt der kapazitive Einfluß des Fingers genügt auch einer
> quadratischen Funktion, das wüsst ich jetzt physikalisch nicht.

Ich auch nicht.
Im Zweifelsfall würd ich aber sagen: eher nicht

Aber das ist so ziemlich das einzige was mir einfällt um aus einem Satz 
unvollständiger Daten Kaffeesatzleserei zu betreiben.

Im Grunde gehts darum, von einem Messpunkt auch noch ein wenig seiner 
Umgebung zu berücksichtigen.
Anschaulich gesagt ist klar, dass bei

| 3  | 6  | 0  |
| 6  | 11 | 0  |
| 0  | 0  | 0  |

*) der Druckpunkt nicht in der Mitte war
*) sondern etwas weiter links
*) und etwas oberhalb der Mitte
*) aber auch nicht soweit links/oberhalb, dass man schon am Rand wäre
*) sondern eher näher der Mitte als näher am Rand

Nur: Wie giesst man das in Formeln?
Gast #1780173
Lesenswert?

Andere Idee wäre zu gucken, wenn vielleicht schon die Tools da sind, ob 
man einem mehrschichtiges Perzeptron beibringen kann, von der 3x3 auf 
eine höhere Auflösung zu abstrahieren. GANZ ähnliches Problem habe ich 
so mal gelöst.
Falls eine Funktion über die Fläche gelegt werden kann, könnte man die 
auch lernen und spart sich das Lösen. Verbraucht sicher nciht 
unwesentlich Rechenzeit. Zweiten Grades bräuchte auch nciht so viele 
Neuronen.
Gast #1780184
Lesenswert?

Ja... eben da bin ich auch mit meinem Latein, was auch noch nicht allzu 
groß ist, am Ende...  Vielleicht hilft es das ich das Maximum das ein 
Feld erreichen kann kenne und weiß wie groß der Radius einer Berührung 
ca. ist? Könnte man da nicht was mit einer Gausschen Glocke basteln? Das 
Problem ist nur das ich den Mittelpunkt nicht kenne, den die Formel aber 
verlangt.
#1786359
Lesenswert?

Markus schrieb:
> Dann will ich mich mal bei allen bedanken!
> Allein die Schwerpunktsberechnung ;-) reicht nicht, wenn ich vorher
> interpoliere bekomme ich aber recht genaue Ergebnisse.

Wie genau denn? Würde mich mal interessieren. Wie groß ist denn dein 
Touchpad und wie groß die Elektroden? Welchen Abstand hat dein Finger zu 
den Elektroden?

Viele Grüße,

Arne
Gast #2243831
Lesenswert?

Hi Leute, ich bin gerade auch dabei einen ATmega32 für ein touch pad zu 
programmieren. Ich bin recht unerfahren was die Programmierung in C 
angeht. Wie ich die Interpolation und Schwerpunktberechnung auf dem 
Papier mache ist mir klar, nur krieg ich das nicht in Code gegossen :\

@ Markus (Gast): Es wäre mir eine große Hilfe, wenn du vielleicht ein 
kleines Codebeispiel o.Ä. hättest.

Gruß

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren