INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Falschfarbenbild erstellen mit DLL und NiVision (Grau->Farbe)



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

28.08.2008, 12:39 (Dieser Beitrag wurde zuletzt bearbeitet: 28.08.2008 14:14 von jg.)
Beitrag #1

p3t3rpoe Offline
LVF-Neueinsteiger


Beiträge: 7
Registriert seit: Aug 2008

8.2
2008
de

23564
Deutschland
Falschfarbenbild erstellen mit DLL und NiVision (Grau->Farbe)
Hallo,

ich mache gerade ein Praktikum in einer Firma und soll ein Graubild farbig einfärben.
Mit LabVIEW wird das bisher schon gemacht, es dauert aber einfach zu lange!
Da ich (noch) informatik studiere und mit LabVIEW bisher noch nie gearbeitet habe, habe ich kurzerhand eine DLL in C
geschrieben, die von einem IMAQ (Bild) einen Speicherbereich bekommt und dann dort die Werte hineinschreibt.

Für einfaches Rot-Färben sieht dass dann so aus:
(Format des Bildes ist -RBG)
"niImage" ist dabei der besagte Speicherbereich

DLL_API void getSketchyRedImage(const float *const floatArray) {
uint32_t pixelIndex=0;
uint32_t value;
//für alle Pixel des Bildes
for (pixelIndex=0; pixelIndex<(image_height*image_width); pixelIndex++) {
//schiebe 'Wert einfach in Blauwert (RGB)
niImage[pixelIndex] = ((uint32_t) floatArray[pixelIndex])<<16;
}
}

[COMPILER ist Intel 10.2 mit allen Optimierungen, auch unpräzise floats erlaubt]

Soweit sehr einfacher Code, der auch nur für Werte des floatArrays zwischen 0 und 255 funktioniert (was auch gegeben ist).
Das Bild wird mit einem 'Image Display' dargestellt.

In der Hauptschleife des LabVIEW-Programms steht NUR der obige Code als DLL (     ),
bzw. der Intensitätsgraph (     )
(Anschlüsse davor irrelevant und der Übersichtlichkeit halber entfernt.
Andere Elemente dienen der Zeitmessung und dem Terminieren nach 10000 Durchläufen).
Will ich 10.000 Bilder mit 128kB einfärben, so dauert das 12 Sekunden.
Nehme ich einfach einen Intensitätsgraph, so dauert das nur ca. 2 Sekunden.

Woher kommt also die schlechte Leistung?
Dauert die Anzeige mit dem Image-Display so viel länger?
Ist die Anbindung an C so schlecht?
(Beide Anzeigen sind asynchron, Fehlererkennung ist bei der DLL unterdrückt)

Wenn wer ne Idee hat, oder spekulieren will, 'bescheid' sagen!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
28.08.2008, 13:46
Beitrag #2

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
Falschfarbenbild erstellen mit DLL und NiVision (Grau->Farbe)
Offtopic

Bitte Forenregeln durchlesen (s. Link oben in der Titelzeile). Screenshots werden bei uns hier im Forum hochgeladen und nicht auf externe Links wie Imageshack o.ä.!

Gruß, Jens

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.08.2008, 13:59
Beitrag #3

p3t3rpoe Offline
LVF-Neueinsteiger


Beiträge: 7
Registriert seit: Aug 2008

8.2
2008
de

23564
Deutschland
Falschfarbenbild erstellen mit DLL und NiVision (Grau->Farbe)
' schrieb:Offtopic

Bitte Forenregeln durchlesen (s. Link oben in der Titelzeile). Screenshots werden bei uns hier im Forum hochgeladen und nicht auf externe Links wie Imageshack o.ä.!

Gruß, Jens

Tut mir leid, wird in Zukunft nicht wieder vorkommen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.08.2008, 14:15
Beitrag #4

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
Falschfarbenbild erstellen mit DLL und NiVision (Grau->Farbe)
' schrieb:Tut mir leid, wird in Zukunft nicht wieder vorkommen.
Akzeptiert, Bild-Links geändert. Wink

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.08.2008, 15:29
Beitrag #5

Y-P Offline
☻ᴥᴥᴥ☻ᴥᴥᴥ☻
LVF-Team

Beiträge: 12.612
Registriert seit: Feb 2006

Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN

71083
Deutschland
Falschfarbenbild erstellen mit DLL und NiVision (Grau->Farbe)
Mach' mal eine Verzögerung von 1 ms in Deine Whileschleife. Ohne Verzögerung läuft Deine CPU am Maximum. Vielleicht bringt's was.
Mit C und DLLs kenne ich micht nicht so toll aus, als dass ich da einen Fehler finden würde. Ehrlich gesagt: Bahn.

Gruß Markus

--------------------------------------------------------------------------
Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.08.2008, 17:29
Beitrag #6

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.698
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Falschfarbenbild erstellen mit DLL und NiVision (Grau->Farbe)
' schrieb:In der Hauptschleife des LabVIEW-Programms steht NUR der obige Code als DLL ( [attachment=41639:v2dllniimagene0.png] ),
In diesem Bild steht ein DLL-Knoten - den kannst du weglassen. Solange da kein Ausgang angeschlossen ist, ist die Arbeit im DLL-Knoten umsonst. Der Pointer, der in der Funktion übergeben wird, zeigt auf den Datenfluss, der in den DLL-Knoten hinein/heraus geht - nicht dorthin, wo der Wire herkommt.

Zitat:Will ich 10.000 Bilder mit 128kB einfärben, so dauert das 12 Sekunden.
Naja, 1.2ms pro 128kB, die 2mal kopiert werden müssen (Speichermanager!) - was bei der anderen Methode entfällt.

Zitat:Nehme ich einfach einen Intensitätsgraph, so dauert das nur ca. 2 Sekunden.
Ich kenn mich in den Tiefen von LV nicht aus. Aber es besteht die Möglichkeit, dass in der gezeigten Schleife der Graph die Daten nur ein einziges Mal neu berechnet. Der könnte nämlich so schlau sein, sich die alten Daten zu merken und nur zu arbeiten, wenn neues gekommen ist.

Zitat:Dauert die Anzeige mit dem Image-Display so viel länger?
Kann ich nicht beurteilen.

Zitat:Ist die Anbindung an C so schlecht?
Bestimmt nicht.
Wenn dann hält das Sicherungskonzept um den DLL-Knoten (bedenke: bei AV in der DLL sollte LV selbst nicht abstürzen) herum etwas auf.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
29.08.2008, 08:21 (Dieser Beitrag wurde zuletzt bearbeitet: 29.08.2008 08:23 von p3t3rpoe.)
Beitrag #7

p3t3rpoe Offline
LVF-Neueinsteiger


Beiträge: 7
Registriert seit: Aug 2008

8.2
2008
de

23564
Deutschland
Falschfarbenbild erstellen mit DLL und NiVision (Grau->Farbe)
' schrieb:In diesem Bild steht ein DLL-Knoten - den kannst du weglassen. Solange da kein Ausgang angeschlossen ist, ist die Arbeit im DLL-Knoten umsonst. Der Pointer, der in der Funktion übergeben wird, zeigt auf den Datenfluss, der in den DLL-Knoten hinein/heraus geht - nicht dorthin, wo der Wire herkommt.

Naja, 1.2ms pro 128kB, die 2mal kopiert werden müssen (Speichermanager!) - was bei der anderen Methode entfällt.

Ich kenn mich in den Tiefen von LV nicht aus. Aber es besteht die Möglichkeit, dass in der gezeigten Schleife der Graph die Daten nur ein einziges Mal neu berechnet. Der könnte nämlich so schlau sein, sich die alten Daten zu merken und nur zu arbeiten, wenn neues gekommen ist.

Kann ich nicht beurteilen.

Bestimmt nicht.
Wenn dann hält das Sicherungskonzept um den DLL-Knoten (bedenke: bei AV in der DLL sollte LV selbst nicht abstürzen) herum etwas auf.

Ich habe in ein paar Variationen herumgespielt. Dabei habe ich die Anzeige 'synchron' laufen lassen und nicht synchron.
Daten beziehen sich wieder auf das Färben von 10.000 Bildern:
ASYNCHRON:DLL=0:12 / Intensitätsgraph=0:02
SYNCHRON: DLL=0:27 / Intensitätsgraph=3:50

Um auszuschließen, dass das Bild nur einmal neu gezeichnet wird, habe ich einen Pixel zufällig belegt.
Das ganze dauert dann je Version circa eine Sekunde länger Undecided
(Man sieht den Pixel auch flackern)

@'IchSelbst':
-Speichermanager?
Wo wird denn zwei mal kopiert?
Wie kann man das verändern?

-DLL-Knoten
Hab ich nicht ganz verstanden. Ne, ehrlich gesagt garnicht :-)
Der doppelt grüne Draht sind die Daten, die in die DLL gehen, also das 'floatArray'.
Die werden in der DLL von diesem Float-Array in eine Darstellung gebracht, die NI-Vision-Konform ist und an der reservierten Speicherstelle geschrieben.
Das Funktioniert auch, in den DLL-Einstellungen ist der Parameter als 'Array-Datenzeiger' angegeben.

@Jens:
Vielen Dank für das Einstellen der Bilder, es werde Licht :-)

@Y-P:
Die CPU SOLL doch gerade am Maximum laufen ;-)
Naja, probiert ohne (positives) Ergebnis.
Der C-Code nimmt einfach nur die float-Werte (Fließkommawerte),
schneidet die Nachkommastellen ab und bringt die Zahl in das Ni-Vision Format eines RGB-Bildes
(--------/ROTWERT/GRÜNWERT/BLAUWERT), schiebt also den Ganzzahlenwert um 16-Stellen nach links.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.08.2008, 08:46
Beitrag #8

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.698
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Falschfarbenbild erstellen mit DLL und NiVision (Grau->Farbe)
' schrieb:Wo wird denn zwei mal kopiert?
Einmal zum Knoten rein, einmal zum Knoten raus. Jeder Wire ist eine Kopie.
Zitat:Wie kann man das verändern?
Bestimmt nicht. Hintergrund: LV kennt keine von außen manipulierbare Pointer.

Zitat:Der doppelt grüne Draht sind die Daten, die in die DLL gehen, also das 'floatArray'.
Die werden in der DLL von diesem Float-Array in eine Darstellung gebracht, die NI-Vision-Konform ist und an der reservierten Speicherstelle geschrieben.
Das Funktioniert auch, in den DLL-Einstellungen ist der Parameter als 'Array-Datenzeiger' angegeben.
Du meinst, der DLL-Knoten ohne Ausgangsbeschaltung funktioniert? Das wäre mir neu!
Ein Wire ist immer eine Kopie. Und zwar ab dem Anfang und ab jeder Verzweigung. Laut NI etc. D.h. ein Schreiben auf eine Verbindung kann keine Auswirkungen haben auf eine Verbindung, die aus einer Verzweigung entsteht. Wäre dem so, was passierte, wenn zwei VIs/DLLs gleichzeitig auf den "gleichen/selben" Wire schrieben?
Wenn du aber sagst, dass es funktioniert, glaub ich dir das gerne. Nur: Ich kann das nicht verifizieren. Da fehlen mir die Möglichkeiten und ab morgen auch die Zeit.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.08.2008, 09:21
Beitrag #9

p3t3rpoe Offline
LVF-Neueinsteiger


Beiträge: 7
Registriert seit: Aug 2008

8.2
2008
de

23564
Deutschland
Falschfarbenbild erstellen mit DLL und NiVision (Grau->Farbe)
' schrieb:Einmal zum Knoten rein, einmal zum Knoten raus. Jeder Wire ist eine Kopie.
Bestimmt nicht. Hintergrund: LV kennt keine von außen manipulierbare Pointer.

Du meinst, der DLL-Knoten ohne Ausgangsbeschaltung funktioniert? Das wäre mir neu!
Ein Wire ist immer eine Kopie. Und zwar ab dem Anfang und ab jeder Verzweigung. Laut NI etc. D.h. ein Schreiben auf eine Verbindung kann keine Auswirkungen haben auf eine Verbindung, die aus einer Verzweigung entsteht. Wäre dem so, was passierte, wenn zwei VIs/DLLs gleichzeitig auf den "gleichen/selben" Wire schrieben?
Wenn du aber sagst, dass es funktioniert, glaub ich dir das gerne. Nur: Ich kann das nicht verifizieren. Da fehlen mir die Möglichkeiten und ab morgen auch die Zeit.

Ich habe keinen blassen Schimmer, wie LabVIEW intern das grafische Programm kompiliert,
aber optimierungen der Art, dass wenn bestimmte Operationen nur lesen, dass dann keine Kopie erstellt wird,
sind offensichtlich.
Da ich alles andere als ein LabVIEW experte bin, lehne ich mich weit aus dem Fester, wenn ich sage, dass
das sicher gemacht wird. Außerdem sind DLLs ein besonderes Konstrukt.
Was mit den Daten geschieht, kann LabVIEW nicht sagen, daher die Kopie, eingesehen.
Aber aus eben jenem Grund wird doch ein Ausgang garnicht benötigt.

Kann mich jetzt gerne einer noch schubsen oder aber eben festhalten, des Fensters halber.
Auf jeden Fall flackert mein lieber Pixel (oder auch mehr).

Die Erklärung mit den Kopien, die bei einem Intensitätsgraph nicht benötigt werden, da nur lesend, finde ich aber logisch in meinem LabVIEW-Weltbild :-)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.08.2008, 09:39
Beitrag #10

RoLe Offline
LVF-Guru
*****


Beiträge: 1.236
Registriert seit: Jul 2007

-
1997
en

0
Schweiz
Falschfarbenbild erstellen mit DLL und NiVision (Grau->Farbe)
Also ich sehe da nicht ganz durch, gebe aber trotzdem mal meinen Senf dazuUnsure

Verstehe ich richtig, dass die DLL eine Ersatzfunktion ist?
Warum rufst du diese dann 10'000 mal auf und nicht nur 1mal.
Die Daten (der orange Doppeldrath) hat ja immer denselben Wert.

.·´¯)--> Leben ist das, was dir passiert, wenn du eifrig dabei bist andere Pläne zu machen <--(¯`·.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Numeric Control nach Case deaktivieren und grau sanjo 2 5.755 26.04.2012 11:50
Letzter Beitrag: sanjo

Gehe zu: