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
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.
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.
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.
Genau! Das ist mein Problem :-) Ich hab nur keine Ahnung wie ich das so Interpoliere das zwischen der 6 und der 11 ein Anstieg ist, und drumherum ein Abstieg.
Wie sieht die 3x3 Matrix denn aus, wenn du im selben Feld woanders drückst?
Huch, ich hab mich verlesen... | 0 | 0 | 0 | | 2 | 15 | 2 | | 1 | 9 | 1 | Was dann dort wäre: ______________ | | | | | | | | ---------------- | | | | | | x | | ---------------- | | | | | | | | ----------------
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.
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.
Vorrausgesetzt der kapazitive Einfluß des Fingers genügt auch einer quadratischen Funktion, das wüsst ich jetzt physikalisch nicht. Dann wärs schon beliebig präzise.
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?
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.
Sollte das nicht einfach über eine Schwerpunktsberechnung gehen? Die wär jedenfalls recht einfach zu machen und irgendwie klingts für mich logisch ^^ Sebastian
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.
@zahlenfreak Das heisst Schwerpunktberechnung. Du sagst ja auch nicht Bratswurst oder Schamslippen ;-)
Und ja, du hast Recht. mit der Schwerpunktberechnung bekomme ich ziemlich gute Ergebnisse!
Mit der Schwerpunktberechnung solltest du dir sogar die Interpolation sparen können. Dann dürfte auch die Genauigkeit steigen, weil du auf dem Weg weniger Rundungsfehler hast. Der Rechenzeit tuts sowieso gut.
Schwerpunkt ist wahrscheinlich wegen der Linearitär bischen ungenauer als der quadratische Ansatz, aber ja auch unschlagbar einfach. Würd ich definitiv als Gewinner ansehen, wenn reicht.
Markus schrieb: > Das heisst Schwerpunktberechnung. Du sagst ja auch nicht Bratswurst ... oder Weihnachtszeit, Rotationsmatrix, Spannungsspitze, Essensreste, Heizungsinstallateur, Geschäftsmann, Tageszeitung, ...
Dann will ich mich mal bei allen bedanken! Allein die Schwerpunktsberechnung ;-) reicht nicht, wenn ich vorher interpoliere bekomme ich aber recht genaue Ergebnisse.
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
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ß
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.