LabVIEWForum.de - Matrixelemente auslesen

LabVIEWForum.de

Normale Version: Matrixelemente auslesen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

wie nicht anders zu erwarten, wenn ich hier schreibe, habe ich grade einen Hänger bei einem Projekt.

Grundbeschreibung:
Ich baue gerade einen SLA Drucker dessen Ansteuerung ich über LV verwirklichen will.
Für die einzelne Ebenen lese ich einzelne Bilder ein. Davon erstelle ich dann ein Graubild. Von diesem Graubild wird ein Binärbild erzeugt, wovon wiederum die Kontur bestimmt wird.

An diesem Punkt habe ich dann 2 2D Matrizen. Eine nur für die Kontur und eine für die restliche Fläche.

Nun zu meinem Problem:

Ich will nun die Koordinaten der einzelnen Pixel in ein 2*x Array auslesen, um somit meinen Laser ansteuern zu können. Dabei sind die beiden Spalten einmal die Spalten und einmal die Zeilen der beiden Binärbildmatrizen. In diesen 2*x Array will ich also die Koordinaten der jeweiligen high Pixel einlesen. Allerdings schein ich grade zu blöd um von den jeweiligen Pixeln die Spalte und Zeile auslesen zu können.

Die entsprechende Funktion befindet sich im Case 4 der Casestruktur.

Besten Dank schon mal im Vorraus
Beste Grüße
Patrick

P.S. leider hat meine Suche hier im Forrum in dieser Richtung nicht wirklich gefruchtet. Deswegen verzeiht bitte wenn ich ein dazupassendes Thema übesehen habe.
Hallo Patrick,

Zitat:Ich will nun die Koordinaten der einzelnen Pixel in ein 2*x Array auslesen, um somit meinen Laser ansteuern zu können.
Es wäre schon mal hilfreich, wenn du von "Arrays" reden würdest, wenn du damit arbeitest - und nicht von "Matrizen"! Das ist in LabVIEW nämlich was anderes…

Ich habe mal ein Beispiel mit LV2017 gemacht, inkl. ConditionalTunnel und ConcatenatingTunnel:
[attachment=58814]

Bei LV2014 nimmst du halt Case-Strukturen und BuildArray-Funktionen…
Hallo Gerd,

ich danke dir. Jetztb hab ich einen Ansatz wo ich weiter ansetzen kann. Smile
Hallo zusammen,

erstmal noch mals vielen Dank an dich Gerd. Deine Lösung hat mich bis kurz vor die Vollendung des Projekts gebracht. Big Grin

Nun steh ich grade vor einem (hoffentlich) kleinen Problemchen. Ich habe jetzt das eingelesene Bild in 2 1D Arrays aus Clusterelementen. Array für die Kontur und eines für die Fläche des zu druckenden Elements. Jedes Cluster besteht aus zwei Elementen. Einmal die Pixelkoordinate in X und einmal in Y.

Jetzt zum momentanen Problem. Das Cluster Array ist immer nach dem ersten Element, also der X Koordinate sortiert. Gibt es eine Möglichkeit die Cluster nach dem zweiten Element zu sortieren ohne, dass ich die beiden Elemente tausche?

Und noch eine Frage. Gibt es eine schnellere Möglichkeit Daten an meine NI USB 6001 Karte zu schicken als das DAQmx Schreiben VI? Nach einigen Tests hab ich hier meinen aktuellen Flaschenhals, was die Geschwindigkeit angeht gefunden. Leider können die Daten nicht so schnell übergeben werden.

beste Grüße
Patrick
Hallo AirRaider,

Zitat:Gibt es eine Möglichkeit die Cluster nach dem zweiten Element zu sortieren ohne, dass ich die beiden Elemente tausche?
Wenn du mit der Funktion SortArray arbeitest, dann wird ein Array of clusters immer die Reihenfolge der Elemente im Cluster beachten. Wenn du nach dem zweiten Element sortieren willst, musst du den Cluster selbst umsortieren…

Zitat:Gibt es eine schnellere Möglichkeit Daten an meine NI USB 6001 Karte zu schicken als das DAQmx Schreiben VI? Nach einigen Tests hab ich hier meinen aktuellen Flaschenhals, was die Geschwindigkeit angeht gefunden. Leider können die Daten nicht so schnell übergeben werden.
Nein: das Problem ist aber auch nicht DAQmxWrite!
Das Problem ist vielmehr, dass du in der Schleife andauernd einen Task anlegst, kurz beschreibst und gleich wieder löschst. Warum machst du so etwas? Wird das in den BeispielVIs genau so gezeigt?
Und warum überhaupt zwei Tasks für zwei Kanäle? Warum nicht nur ein Task?

Zu deinem VI:
- Warum verwendest du eine WHILE-Loop für den Druckvorgang? Warum nicht einfach eine autoindizierende FOR-Loop? Viel weniger Overhead beim Array-Handling! (Und weniger Fehler: was passiert wohl, wenn das Array in der letzten Iteration schon leer ist?)
- Beim "Arrays auslesen" brauchst du nichts an den "N"-Eingängen der FOR-Loops anschließen: AUTOINDIZIERUNG!
Hallo Gerd,

zuerst noch mal vielen Dank. Du hast mir wieder sehr weiter geholfen.
Ich sehe gerade ich hatte es bisher noch nicht erwähnt, aber dies ist das erste wirklich ausführliche Projekt, welches ich erstelle. Und ich bin mir ziemlich sicher, dass andere hier nicht wirklich von einem großen Projekt sprechen würden.

Zitat:Wenn du nach dem zweiten Element sortieren willst, musst du den Cluster selbst umsortieren…
Das hatte ich schon versucht, aber dann hatte es mir die Werte dann vertauscht. Habe jetzt nochmal etwas Anderes versucht und jetzt macht es was es soll.

Zitat:Nein: das Problem ist aber auch nicht DAQmxWrite!
Das Problem ist vielmehr, dass du in der Schleife andauernd einen Task anlegst, kurz beschreibst und gleich wieder löschst. Warum machst du so etwas? Wird das in den BeispielVIs genau so gezeigt?
Wie schon gesagt, hatte ich einige Tests bezüglich der Geschwindigkeit gemacht. Darunter war auch, dass ich alles aus der Schleife rausgenommen hatte außer DAQmxWrite. Dies hatte eine kaum merkliche Wirkung.
Warum ich das so mache? Ich habe bisher noch nie ein so ausführliches Projekt mit LabVIEW verwirklicht und hatte ein VI von einem ehemaligen Komolitonen zur Verfügung, auf das ich was den DAQ teil angeht aufgebaut habe.


Zitat:Und warum überhaupt zwei Tasks für zwei Kanäle? Warum nicht nur ein Task?
Zwei Tasks hatte ich deswegen eingebaut, weil ich übersehen hatte, dass ich in dem Dropdown über "suchen" beide Ausgänge anwählen kann. Blush


Zum Thema Autoindizierung:
Davon hatte ich in deiner Antwort leider zum ersten Mal gehört. Jetzt ist der ganze Auslese- und Druckvorgang sehr viel einfacher und übersichtlicher geworden danke dir Big Grin

Da jetzt erstmal wieder alles tut bedanke ich mich nochmals für die Hilfe und versuche mich dann jetzt erstmal wieder selbst.

Beste Grüße
Patrick
Hallo zusammen,

Ich habe das Programm nun nochmal ein wenig abgeändert und es funktioniert nun fast einwandfrei. Die Hauptänderung besteht darin, dass ich die Bestimmung des Konturarrays so angepasst habe, dass die Anordnung der einzelnen Koordinaten nun via Kettencode sortiert wird und der Laser ohne Sprünge einmal die Kontur abfährt. Das Problem welches ich jetzt noch habe besteht darin, dass in manchen Fällen nun vom Programm die Konturlinie genommen wird und davon dann quasi die Äußere und die innere Kante im Array ausgegeben wird. Ich hab dazu mal zwei Bilder zur Verdeutlichung in angehängt.

Weiß da eventuell jemand woran es liegen könnte?

vielen Dank schon mal im Vorraus
beste Grüße
Patrick
Referenz-URLs