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!