Kantenerkennung



  • Guten Morgen :xmas1:

    Ich habe ein Problem mit der Kantenerkennung. Damit mich Jeder versteht, habe ich mein Problem im Stil von einer Textaufgabe geschrieben.

    Nehmen wir an, ich habe ein Eindimensionales Array, der mit seine Werte die Distanz zwischen ein Prisma und einen Messsensor angibt und man mit diese Daten ein Dreieck ohne Hypotenuse als Graphik darstellen kann, weil der X-Wert die Array-Position und der Y-Wert das jeweilige Array-Wert entspricht. Wie bekomme ich es anhand der Werteliste (Array) hin, die Array-Position herauszufinden, dass die Kante des Dreiecks entspricht?

    Ich glaube man muss zuerst die Daten miteinander vergleichen. Aber das Dumme ist, dass nicht unbedingt das Array mit den höchsten Wert die Spitze eines Dreiecks ohne Hypotenuse darstellen muss, da das dargestellte Dreieck auch etwas zur Seite gedreht sein kann und es den anschein hat, als würde man eine Horizontale und Vertikale Line sehen, die zusammen hängen.
    In der Schule hat man gelernt, die Extremwerte einer kubischen Funktion mit Ableitungen zu lösen. Aber ich weiß nicht, ob man diese Methode auch an diesen Beispiel lösen könnte, da es eigentlich keine kubische Funktion ist, sondern nur Messdaten, die als Liste gespeichert sind. Ich würde mich freuen, wenn es unter euch einige Mathematiker oder erfahrene Programmierer gibt, die dieses Problem geschickt lösen und mir Code-Schnipsel zu den entscheidenden Funktionen posten könnt.

    Danke euch schon jetzt, für eure Interesse und Mithilfe!



  • stefan2008 schrieb:

    Damit mich Jeder versteht, habe ich mein Problem im Stil von einer Textaufgabe geschrieben.

    Hat nicht geklappt.


  • Mod

    fooooa schrieb:

    stefan2008 schrieb:

    Damit mich Jeder versteht, habe ich mein Problem im Stil von einer Textaufgabe geschrieben.

    Hat nicht geklappt.

    Zustimm. Ich habe zwar die einzelnen Worte alle verstanden, aber die Grammatik ist reiner Zufall, wodurch ich nicht weiß, wie die Worte zueinander in Beziehung stehen sollen.



  • Naja, so schwer ist das doch auch nicht. Wenn ich dich richtig verstehe, dann guckst Du "von oben" auf dein Prisma, d.h. Du hast Sensordaten, die erst groß sind ("linke Ecke weit weg"), dann kleiner werden ("die Spitze") und dann wieder größer werden ("rechte Ecke"). Ich frage mich, wo dann das Problem ist, man kennt ja die Koordinaten der Eckpunkte relativ zum Messsensor und die Spitze ist das Minimum der Messwerte (das findet man, indem man alle Messwerte abläuft und dann den niedrigen rauspickt -- wenigstens wenn die Messwerte ausreichend sauber sind. Sonst musst Du da ein bißchen glätten und Regressionen drüberlaufen lassen.), also kennt man auch dessen Koordinaten. Das kann man dann auf ein Blatt Papier aufmalen und relativ zum Sensor ausrechnen via etwas Trigonometrie. Dazu muss man halt wissen, wie die Sensordaten zustandekommen. Wird zB. der Abstand zu einer gewissen Ebene gemessen oder wird der Messsensor geschwenkt?

    Es ist halt dafür wichtig, die Geometrie so zu wählen, daß der Sensor beide Ecken tatsächlich sieht und nicht "eine Ecke von der Spitze verdeckt wird". Sollte das passieren, guckst Du mit deinem Messsensor auf eine Platte drauf und wenn die geeignet liegt, und Du zB. unter einem Winkel aus deinem Sensor rausmisst, wirst Du einen ähnlichen Verlauf der Messwerte sehen. Wenn Du das ausschließen willst, solltest Du wenigstens wissen, wie die Messebene (also die Ebene, wo Du dein Prisma draufstellst) relativ zum Sensor plaziert ist.

    Frohe Weihnachten.



  • Ja, ich betrachte das Prisma von oben. Ich habe anfangs auch gedacht, ich brauche nur nach den niedrigsten oder höchsten Wert (je nach Blickwinkel) suchen, um die Spitze zu erkennen. Aber ich habe gemerkt, dass es auch Ausnahmefälle gibt, in dem die Spitze zwischen den Hoch- und Tiefwerten liegt. Zum Beispiel wenn das Dreieck ohne der Hypotenuse in der 2D-Ansicht um 30° nach links oder rechts gekippt wird und das Dreieck sehr Stumpf ist.

    Beispiel:

    float dreieck[11] = {3.0f, 2.9f, 2.8f, 2.7f, 2.6f, 2.5f, 2.4f, 1.7f, 1.1f, 0.6f, 0.0f}
    

    Die Spitze liegt in diesem Fall auf Position 6, wenn man bei 0 anfängt zu zählen. Dies bedeutet, dass die Spitze bei den Punkt S((6+1); 2,4) liegt. Daraus folgt:

    x=7
    y=2,4

    Dies ist ein Beispiel dafür, dass die Spitze nicht immer der niedrigste oder höchste Wert eines Arrays sein muss!

    Nun stellt sich die Frage, wie man es programmiertechnisch oder mathematisch es trotzdem hinbekommt.



  • stefan2008 schrieb:

    Nun stellt sich die Frage, wie man es programmiertechnisch oder mathematisch es trotzdem hinbekommt.

    an den linken und den rechten teil eine gerade anfitten und den schnittpunkt bestimmen. du musst nur rausfinden, welche messwerte zur linken und welche zur rechten seite gehören.



  • Danke für den Tipp! Ich würde Euch sehr dankbar sein, wenn Ihr mir verraten könnt, wie man eine Gerade in C++ anfittet. Als Hobby-Programmier bin ich mit dieser Technik noch nicht vertraut. Aber ich bin einer der die Syntax schnell versteht, wenn einer mir ein Beispiel postet. Damit währe ich sehr geholfen. Den rest kann ich dann selbst ausknobeln.

    Danke! Wünsche euch noch ein frohes Fest! :xmas2:



  • Das ist kein syntaktisches Problem, sondern ein mathematisches. Wenn du das also mathematisch formulieren kannst, geht das alles mit : if else while.



  • Eindimensionales Array

    In Mathematik und Physik ...


Anmelden zum Antworten