Linienscanner Höhe Breite einen Produkts ermitteln

Korpos

Level-1
Beiträge
41
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich bin grade dabei eine Funktion zu schreiben die mir aus meinen X und Z Werten die ich durch meinen Linienscanner erhalte die Breite und Höhe eines Paketes zu bestimmen. Ich denke wenn meine Werte Linear wären und nicht Springen/Unebenheiten da wären würde der Code denn ich geschrieben habe funktionieren. Jetzt habe ich mir aber die Frage gestellt wie man eine bessere Lösung schreiben würde wenn das ganze nicht mehr Linear ist und meine Werte rauschen würden wie auf dem Bild. Vielleicht hat ja jemand eine Idee/Tipp, mir fällt im Moment keine wirkliche Lösung dazu ein.

Vielen Dank schon mal
Code:
#n := 0;
#Anfang_max := FALSE;
#Anfang_steigung := FALSE;
#merke_pos_anfang := 0;
#merke_pos_ende := 0;

WHILE #n < #Nutzdaten-1 DO
    IF "Datenpaket_Z_X".Messdaten.Z_Kordinaten[#n] = "Datenpaket_Z_X".Messdaten.Z_Kordinaten[#n + 1] AND NOT #Anfang_steigung THEN // "0 Punkt" ignorieren
        #n += 1;
    ELSIF "Datenpaket_Z_X".Messdaten.Z_Kordinaten[#n] < "Datenpaket_Z_X".Messdaten.Z_Kordinaten[#n + 1] AND NOT #Anfang_max THEN //Steigung fängt an
        #n += 1;
        #Anfang_steigung := TRUE;
    ELSIF #Anfang_steigung THEN // Anfang gefunden  
        #max_z := "Datenpaket_Z_X".Messdaten.Z_Kordinaten[#n];
        #merke_pos_anfang := #n;
        #Anfang_max := TRUE;
    ELSIF "Datenpaket_Z_X".Messdaten.Z_Kordinaten[#n] <= "Datenpaket_Z_X".Messdaten.Z_Kordinaten[#n + 1] AND #Anfang_max THEN // Nach ENDE des Paketes suchen
        #n += 1;
    ELSE //Ende gefunden
        #merke_pos_ende := #n;
        #Paket_Breite := "Datenpaket_Z_X".Messdaten.X_Kordinaten[#merke_pos_ende] - "Datenpaket_Z_X".Messdaten.X_Kordinaten[#merke_pos_anfang];
        #Paket_hoehe := #max_z - "Datenpaket_Z_X".Messdaten.Z_Kordinaten[0]; // Wenn das Paket natürlich genau am Rand liegt also am Anfang stimmt dies nicht mehr
        EXIT;
    END_IF;
END_WHILE;

//DB wird geleert
FOR #n := 0 TO #Nutzdaten-1 DO
    "Datenpaket_Z_X".Messdaten.Z_Kordinaten[#n] := 0;
    "Datenpaket_Z_X".Messdaten.X_Kordinaten[#n] := 0;
END_FOR;
Bild.PNG
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Sehen die Werte tatsächlich so "katastrophal" aus ?
Wie auch immer - ich nehme an, dass dein eingescanntes Paket keine Trapez-Form hat - oder ? Das heißt, dass du wissen möchtest wie weit die obere Linie des "Trapezes" von der Boden-Linie entfernt und wie breit sie oben ist - soweit korrekt ?
Um da näher an die eigentliche Form des Trapezes heran zu kommen würde die Kurve zunächst glätten und dann in der geglätteten Kurve die Ecken suchen. Die findest dadurch, dass du die Änderung des Anstiegswinkels suchst.

Gruß
Larry
 
Vielen Dank euch beiden
Sehen die Werte tatsächlich so "katastrophal" aus ?
Ich denke nicht, habe denn Linienscanner leider noch nicht. Und habe sie nur als Verdeutlichung so schlimm bearbeitet. Da ich noch nie mit einem Linienscanner gearbeitet habe, nutzte ich eine Grafik aus dem Handbuch(es wurde nicht gezeigt wie das Objekt ausgesehen hat). Ich dachte das Trapez könnte vielleicht durch eine Abschattung entstehen.
Das heißt, dass du wissen möchtest wie weit die obere Linie des "Trapezes" von der Boden-Linie entfernt und wie breit sie oben ist - soweit korrekt ?
korrekt

Um da näher an die eigentliche Form des Trapezes heran zu kommen würde die Kurve zunächst glätten und dann in der geglätteten Kurve die Ecken suchen. Die findest dadurch, dass du die Änderung des Anstiegswinkels suchst.
Gibt es dafür vielleicht sogar einen fertigen Baustein für Glättungen/Filter (cpu 1500er) ? Ich könnte es zwar auch Tippen aber wenn es so etwas schon gibt.
 
Zurück
Oben