Meine Frage bezieht sich auf die Verarbeitung von Laserscannerdaten:
Ein Laserscanner wird über eine Simulinkschnittstelle ausgelesen und liefert ein Signal mit Frames von je 1000 Distanzwerten.
Durch Einbezug weiterer geometrischer Informationen werden aus jedem Distanzscan Punktwolkenwerte in einem 3D-Koordinatensystem berechnet.
Jeder Frame liefert damit 1000 Punkte mit einer X, Y und Z Koordinate.
Diese Daten stehen in Simulink als Signal oder durch den Export mittels einer Matlab Lvl. 2 Fkt im Workspace zur Verfügung.
Derzeit werden die X, Y und Z Frames fortlaufend in 3 Arrays X, Y und Z geschrieben.
Gewünscht ist jetzt zur Datenreduktion eine Clusterung der Werte in ein definiertes Gitter (meshgrid) der XY Ebene mit gröberer Auflösung. Die Werte für Z sollen diesen Säulen direkt zugeordnet werden ohne interpoliert zu werden. Im Anschluss soll ein 3D-Array oder Struct entstehen, in dem alle Z-Werte eines XY Clusters zu finden sind.
Beispiel:
Ein Frame ergibt
X = (1x1000 double)
Y = (1x1000 double)
Z = (1x1000 double)
Folgende Funktion ordnet die Z-Werte einem XY Cluster zu:
Code:
Code:
% Clusterwerte für x und y festlegen
xCluster = ceil(x/100);
yCluster = ceil(y/100);
for m=min(xCluster):1:max(xCluster) for n=min(yCluster):1:max(yCluster)
temp_z=z(xCluster==m & yCluster==n);
% temp_z enthält alle Werte [Wert1, Wert2, Wert3, ... ] % des Cluster (m,n) % temp_z kann dann in ein Struct oder 3D Array geschrieben werden end end
Dieses Verfahren funktioniert, ist aber, vermutlich aufgrund der Schleifen, viel zu langsam. Wünschenswert wäre eine Onlinedatenverarbeitung. (Die Frames werden mit etwa 20 Hz geliefert.)
vq = griddata(x,y,v,xq,yq); liefert z.B. eine Interpolation der Werte in ähnlichem Format. Eine Interpolation der Werte ist jedoch nicht gewünscht, sondern nur die Rohwerte in einem Array für jedes definierte Cluster.
Ich bin relativ neu in Matlab und bitte daher um Rücksicht.
das klingt so, als könnte man da mit accumarray() oder histc() was machen.
Bitte stell dafür ein funktionierendes Beispiel zur Verfügung (mit konkreten Werten für x, y, z) und dem, was rauskommen soll.
% Alle z-Werte in Clusterarray schreiben for m=min(xCluster):1:max(xCluster) for n=min(yCluster):1:max(yCluster)
temp_z=z(xCluster==m & yCluster==n);
if(~isnan(temp_z) & size(temp_z, 1)>0)
laenge = sum(Raster(m,n,:)~=0);
Raster(m,n,laenge+1:laenge+size(temp_z,2))=temp_z;
end end end
Diese Abfolge funktioniert, ist aber zu langsam (vermutlich aufgrund der Schleifen). Wünschenswert wäre eine "MATLAB-Lösung", die ohne Schleifen auskommt.
Ein Struct anstelle eines Arrays für die Cluster ist übersichtlicher, aber meiner Erfahrung nach auch umständlicher auszuwerten.
Sinn ist eine Grundlage für eine spätere statistische Auswertung der z-Werte je Cluster zu bekommen.
Zum Beispiel:
Code:
% Berechnung der Maxima der Cluster [Raster_max,I] = max(Raster(:,:,:),[],3);
leider noch nichts neues soweit. Über weitere Tipps würde ich mich sehr freuen!
Viele Grüße
Jared
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.