WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Messdaten auslesen und auswerten

 

maxmaxmax
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 11.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.03.2016, 13:56     Titel: Messdaten auslesen und auswerten
  Antworten mit Zitat      
Hallo Zusammen,

ich schreibe momentan eine Studienarbeit und bin leider noch relativ unerfahren mit Matlab.
Meine Aufgabe ist mit einer 3D-Kamera die genaue Lage einer Schnur relativ zur Kamera zu bestimmen. Die Kamera liefert mir zu jedem Bildpixel(92928) die Position (dh. X-,Y-,Z-Koordinate). Die Daten liefert mir die Kamera über Ethernet, jeweils aufgeteilt in Low- und Highbyte in einem Vektor mit der Länge 557696.

Inhalt des Datenvektors:
[Header X-Werte Header Y-Werte Header Z-Werte]

Nach dem Auslesen bitshifte ich in einer For-Schleife jedes Highbyte (vorzeichenbehaftet) und addiere es mit dem zugehörigem Lowbyte und teile gleichzeitig den Rohdatenvektor in X-, Y- und Z-Vektoren auf.



Code:

%--- Initialisieren der Verbindung zur Kamera
t = tcpip('169.254.45.111',50010);

%--- Benötigte Länge des auszulesenden Vektors
laenge = 557696;
t.inputbuffersize = laenge;
t.outputbuffersize = laenge;


%--- Herstellen der Verbindung
fopen(t);

%--- Lesen der Kamera Daten
rohdata = fread(t);


%---  Zusammenfügen von High- und Lowbyte + Aufteilung der Rohdaten
for i = 1:92928

        x(i) = typecast(bitshift(uint16(rohdata(2*i+56)),8,'uint16')+
rohdata(2*i-1+56),'int16');
 
        y(i) = -1*(typecast(bitshift(uint16(rohdata(2*i+185948)),8,'uint16')+
rohdata(2*i-1+185948),'int16'));

        z(i) = typecast(bitshift(uint16(rohdata(2*i+371840)),8,'uint16')+
rohdata(2*i-1+371840),'int16');
       
end;

%--- Trennen der Verbindung
fclose(t);

 


Das funktioniert soweit auch, nur benötigt die for-Schleife zu viel Rechenzeit. Gibt es eine Möglichkeit schon beim auslesen der Kamera, Low- und Highbyte zusammenzufügen?

Des Weiteren muss ich noch die Pixel herausfiltern, die die Schnur erfasst haben und aus diesen Pixeln eine Linie fitten, die idealerweise mit der realen Schnur übereinstimmt.
Die Schnur verläuft vom linken zum rechten Bildrand und ist ziemlich dünn, sodass sie teileweise nur von einem Pixel erfasst wird.
Jemand eine Idee wie man das bewerkstelligen kann?

Schönes Wochenende und Besten Dank.
Private Nachricht senden Benutzer-Profile anzeigen


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 11.03.2016, 14:01     Titel:
  Antworten mit Zitat      
Nach meiner Erfahrung gehen die Kameraanbindungen mit der Data Acquisition Toolbox sowie die Algorithmen der Computer Vision Systems Toolbox (auch Simulink, nicht nur MATLAB) super schnell. Das hier sieht mehr so selbst gebastelt aus, oder?

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.03.2016, 15:01     Titel: Re: Messdaten auslesen und auswerten
  Antworten mit Zitat      
Hallo maxmaxmax,

Pre-allocation und/oder Vectorization beschleudingen den Code dratsisch:
Code:

rohdatenD = freat(t);  % Oder fread(t, '*uint16')?
rohdaten = uint16(rohdatenD);

x = zeros(1, 92928, 'int16');  % Pre-allocation
y = zeros(1, 92928, 'int16');
z = zeros(1, 92928, 'int16');
for i = 1:92928
        x(i) = typecast(bitshift(rohdata(2*i+56),8)+
rohdata(2*i-1+56),'int16');
        y(i) = -1*(typecast(bitshift(rohdata(2*i+185948),8)+
rohdata(2*i-1+185948),'int16'));
        z(i) = typecast(bitshift(rohdata(2*i+371840),8)+
rohdata(2*i-1+371840),'int16');
end

Vectorisiert wäre es noch deutlich schneller: Einfach "i" durch "1:92928" ersetzen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
dmjr
Forum-Century

Forum-Century


Beiträge: 199
Anmeldedatum: 02.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.03.2016, 11:16     Titel:
  Antworten mit Zitat      
Das ganze bitshiften ist hier absolut unnötig. Wenn uint16 gelesen werden soll, lies das direkt so ein:

Code:
%--- Initialisieren der Verbindung zur Kamera
t = tcpip('169.254.45.111',50010);

%--- Benötigte Länge des auszulesenden Vektors
laenge = 557696;
t.inputbuffersize = laenge;
t.outputbuffersize = laenge;


%--- Herstellen der Verbindung
fopen(t);

%56 bytes die bisher nicht verwendet wurden
header = fread(t,28,'int16');
%lesen direkt mit richtigem Datentyp und in die richtigen Variablen
x=fread(t,laenge,'int16');
%gap von 37 bytes, die im original code nicht verwendet werden
a=fread(t,37);
y=fread(t,laenge,'int16');
%gap von 37 bytes, die im original code nicht verwendet werden
b=fread(t,37);
z=fread(t,laenge,'int16');
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.