Italia
Foro

Kurve glätten

 

Walter
Köhler
Hallo Profaner Ich habe ein Problem und noch keinen Lösungsansatz. Problembeschreibung: Ich nehme mit einer Kamera ein bewegtes Objekt auf, und registriere die X/Y Koordinaten davon in einer Liste. Dann bilde Io l' Weg des Objekt mittels "Lineto" nach. So weit so gut. Problem: Die Objektverfolgung ist nicht sehr genau, die Linie ist daher etwas zitterig. Ich habe einiges circa "glätten" gegoogelt, (Bezier etc, ) aber das ist mir von der Matte her zu hoch; sorry. Hat Jemand eine Idee wie ich eine unregelmäßige "zitterige" Kurve glätten kann Walter Profan 11.2

127 kB
Hochgeladen:21.09.2018
Downloadcounter107
Download
 
WKS Win XP Xprofan 10 AMD 1.6GHz 1GB Ram
21.09.2018  
 




RAW
Ciao,

ohne jetzt auf Execl o. ä. zu verweisen, bleibt mit profanen Mitteln nur die Möglichkeit, einen eigenen Filter zu schreiben. Um Kurvenwerte zu glätten (engl. smooth) wollen wir jetzt mal smoothen:

Der einfachste Weg ist ein gedachtes Quadrat, zum Beispiel 3 x 3 Kästchen (oder 5 x 5, usw.), ab dem aktuellen Wert nach vorne auf die mögliche Kurve zu legen und den Mittelwert der linken Reihe - der mittleren Reihe und der rechten Reihe auszurechnen. So werden Ausreißer (nach +y / -y) geglättet. In diesen Kästchen können auch noch spezielle Filterwerte hinzugerechnet werden (z. B. -2,-1,0,+3,+3), so das allg. Prinzip. Den aktuellen Mittelwert erhält man, wenn z.B. die letzten (hinteren) 3 Werte gemittelt werden.

Filter können mehrmals verwendet werden. Je glatter wird die Kurve...
 
21.09.2018  
 




p.specht

Ist weit entfernt davon, eine Lösung per das Problem zu sein, weil man da viel anpassen muss, z.B. x und y vertauschen. Aber das Prinzip würde denke ich passen. Das Teil ist nicht von mir, und allfällige Rechte Dritter müssten erst geprüft werden. Also: Ohne jedwede Garantie und rein zu Demonstrationszwecken:
WindowTitle "Interpolation zw. Stützwerten durch Polynomkoeffizienten-Anpassung"
WindowStyle 24:randomize:CLS rnd(8^8):font 2:set("decimals",18)
'{********************************************************
'*       Polynomial Interpolation or Extrapolation       *
'*              of a Discreet Function F(x)              *
'* ----------------------------------------------------- *
'* SAMPLE RUN:                                           *
'* (Example: Function sin(x) - 2*cos(x) is given by 12   *
'*          points from x=0 to x=1.1.                    *
'*          Extrapolate for x=1.255).                    *
'*                                                       *
'*  For X             =  1.255                           *
'*  Estimated Y value =  .3294023272245815               *
'*  Estimated Error   = -8.273064603451457E-11           *
'*  Exact Y value     =  .3294023272200048               *
'*                                                       *
'* ----------------------------------------------------- *
'* REFERENCE: "Numerical Recipes, The Art of Scientific  *
'*             Computing By W.H. Press, B.P. Flannery,   *
'*             S.A. Teukolsky and W.T. Vetterling,       *
'*             Cambridge University Press, 1986"         *
'*                                                       *
'*                  Basic Release By J-P Moreau, Paris.  *
'*                           (www.jpmoreau.fr)           *
'*********************************************************
'*                                                       *
'*      XProfan-Version  2014-10 by P.Specht, Wien       *
'*                                                       *
'*********************************************************
'}
' PROGRAM TEST_POLINT
Var n&=12' Number of points
Declare X![N&],Y![N&],C![N&],D![N&]
Declare i&,x1!,xx!,fct!,yy!,DY!

REPEAT

    ' Die Stützwerte müssten NICHT unbedingt in gleichen Abständen liegen!
    ' define tables X and Y 'ACHTUNG: ARRAY WIRD MIT BASISINDEX 1 GEFÜHRT!
    X![1] = 0.0
    X![2] = 0.1
    X![3] = 0.2
    X![4] = 0.3
    X![5] = 0.4
    X![6] = 0.5
    X![7] = 0.6
    X![8] = 0.7
    X![9] = 0.8
    X![10]= 0.9
    X![11]= 1.0
    X![12]= 1.1

    Whileloop n&:i&=&Loop

        X1! = X![I&]
        FCT!=FCT(X1!)
        Y![I&] = FCT!

    Endwhile

    proc FCT :parameters x1!

        ' FUNCTION FCT(X1) ' Statt Tabelleneingabe der Y-Stützwerte
        ' wird hier eine bekannte Funktion herangezogen.
        ' Das erlaubt eine Prüfung der Genauigkeit der Interpolation
        FCT! = SIN(X1!) - 2.0 * COS(X1!)
        RETURN FCT!

    endproc

    ' ANWENDUNG DES GEFUNDENEN POLYNOMS
    ' Vorgabe eines X-Wertes und Abfrage der intern gefundenen Interpolationsformel
    print "\n EINGABE:  X-Wert, per den Y zu interpolieren ist "
    print " (Bei X=0 wird eingebauter Testwert 1.255 verwendet) X = ";
    input xx! : case xx!=0 : XX! = 1.255
    ' INTERPOLATION
    yy!=POLINT(X1!,N&,XX!,YY!)
    ' AUSGABE
    case %csrlin>20:cls rnd(8^8)
    PRINT
    PRINT "     Für das gesuchte X = ";format$("%g",XX!)
    PRINT "  Interpolierter Y-Wert = ";format$("%g",YY!)
    PRINT "       Letzte Korrektur = ";format$("%g",DY!)
    X1! = XX! : FCT!=FCT(X1!)
    PRINT " Exakter Vergleichswert = ";format$("%g",FCT!)
    PRINT "--------------------------------------------------\n"

UNTIL 0

proc STOP :sound 2000,100: waitinput:END

endproc

Proc POLINT :parameters X!,N&,XX!,YY!

    '*****************************************************
    '  Origianl-Subroutine: POLINT(X,Y,N,XX,YY,DY)       *
    '*****************************************************
    '*     Polynomial Interpolation or Extrapolation     *
    '*            of a Discreet Function                 *
    '* ------------------------------------------------- *
    '* INPUTS:                                           *
    '*    X:    Table of abscissas (N)                   *
    '*    Y:    Table of ordinates (N)                   *
    '*    N:    Number of points                         *
    '*   XX:    Interpolation abscissa value             *
    '* OUTPUT:                                           *
    '*   YY:    Returned estimation of function for X    *
    '*   DY:    Estimated error for YY                   *
    '*****************************************************
    Declare NS&,dif!,dift!,C![n&],D![n&],m&,ho!,hp!,w!,den!
    NS& = 1
    DIF! = ABS(XX! - X![1])

    whileloop n&:i&=&Loop

        DIFT! = ABS(XX! - X![1])

        IF DIFT! < DIF!

            NS& = I&'index of closest table entry
            DIF! = DIFT!

        ENDIF

        C![I&] = Y![I&]'Initialize the C"s and D"s
        D![I&] = Y![I&]

    endwhile

    YY! = Y![NS&]'Initial approximation of Y
    NS& = NS& - 1

    whileloop n&-1:m&=&Loop

        whileloop n&-m&:i&=&Loop

            HO! = X![I&] - XX!
            HP! = X![I& + M&] - XX!
            W! = C![I& + 1] - D![I&]
            DEN! = HO! - HP!

            IF DEN! = 0

                PRINT
                PRINT " *** FEHLER: ZWEI STÜTZWERTE WIDERSPRECHEN SICH! *** "
                STOP

            ENDIF

            DEN! = W! / DEN!
            D![I&] = HP! * DEN!'Update the C's and D's
            C![I&] = HO! * DEN!

        endwhile

        IF (2*NS&) < (N&-M&)' After each column in the tableau XA is completed,

            DY! = C![NS&+1]' we decide which correction, C or D, we want to

        ELSE' add to our accumulating value of Y, i.e. which

            DY! = D![NS&]' path to take through the tableau, forking up or
            NS& = NS& - 1' down. We do this in such a way as to take the

        ENDIF' most "straight line" route through the tableau to

        ' its apex, updating NS accordingly to keep track
        YY! = YY! + DY!' of where we are. This route keeps the partial

    endwhile' approximations centered (insofar as possible) on

    ' the target X.The last DY added is thus the error
    RETURN YY!' indication.
    endpro

Wichtig: Nicht zu viele Stützwerte, sonst wird die Sache eher noch zittriger!
Die manuelle Input-Schleife wäre dann durch die gewünschten Zwischenwerte zu ersetzen und als Punkte mit kurzen Lineto-Stücken einzutragen. Alternativ potuto man auch einen "gleitenden Durchschnitt" aus 3 bis 5 Punkten bilden.
 
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
21.09.2018  
 




RAW
Hier ein einfaches Praxis-Beispiel aus obigem Beitrag, um Ausreißer in einer Kurve zu glätten:

Beispielwerte einer ansteigenden Kurve (y-Werte):
114, 116, 120, 123, 124, 127, 129, 150, 133, 136 / Ausreißer 150

Nehmen wir an, wir stehen am Punkt 127 (in x-Richtung der 6. Punkt).
Der Mittelwert der vorderen 3 Werte von 129, 150, 133 lautet: 137 / Ausreißer 150
Der größte Wert von 150 wird jetzt zu 137.
Wiederholung der vorderen 3 Werte von 129, 137, 133 ergibt 133.

Nun ersetzen wir die vorderen 3 Werte mit dem Wert 133 - voila... / glattere Kurve

Als Lösungsansatz potrebbe dieses Beispiel vollends genügen.
 
22.09.2018  
 



Unterthema: Kurve glätten gelöst  [...]  erzeugt.
 
24.09.2018  
 



Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

5.306 Views

Untitledvor 0 min.
ecki10.02.2023
Rolf Koch13.02.2022
Normann Strübli31.03.2020
p.specht05.09.2019
Di più...

Themeninformationen

Dieses Thema hat 3 subscriber:

Walter Köhler (2x)
RAW (2x)
p.specht (1x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie