LabVIEWForum.de - Schleife hält sich nicht an Wartezeit

LabVIEWForum.de

Normale Version: Schleife hält sich nicht an Wartezeit
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo LabVIEW-Freunde,

ich hab ein Problem, eigentlich sind es zwei. Aber zunächst das Hauptproblem.
Ich nehme mit einer Videokamera Bilder auf, und speicher diese als Einzelbilder ab(ca. 3000). Als Dateiname nummeriere ich sie einfach aufsteigend durch. Nun möchte ich die gespeicherten Bilder laden und anzeigen. Ich erstelle mir also erst ne Liste mit allen Bitmaps aus dem gewünschten Verzeichnis und nutze sie zum Aufrufen der Bilder. In einer while-Schleife geh ich nun durch die Liste und lade die entsprechenden Bilder. Damit die Schleife nicht einfach mit maximaler Geschwindigkeit läuft, habe ich die "Armbanduhr" als Wartezeit eingesetzt. So soll die Ablaufzeit variiert werden können, von Slowmotion bis Zeitraffer. Die Schleife führe ich nun so oft aus, wie Bilder im Verzeichnis. Das Problem ist nun, dass die Schleife schneller läuft als ein Bild geladen wird. Die Schleife ist also zu ende, bevor alle Bilder geladen wurden, was doch eigentlich nicht sein dürfte!? Ich hab schon for-, while- und timed-loop verwendet, bei allen das gleiche Problem.
Das zweite Problem ist, dass ich von der Funktion zum Laden der Bitmap bei manchen Bildern einen Fehler bekomme (Fehler 7) oder auch bei ner ganzen Serie(Fehler 8). Bilder sind nicht schreibgeschützt o.ä....
Wacko
Also, wenn jemand einen Ansatz hat, wie ich diese Probleme in den Griff bekommen könnte, wär mir sehr geholfen!
Ich lad mal zwei Versionen des VIs hoch(LV 7.1).

Beste Grüße, Kai
' schrieb:Damit die Schleife nicht einfach mit maximaler Geschwindigkeit läuft, habe ich die "Armbanduhr" als Wartezeit eingesetzt. So soll die Ablaufzeit variiert werden können, von Slowmotion bis Zeitraffer.
Die Funktion "Metronom" (Warten auf Vielfaches von) macht genau das, was du programmiert hast: Eine Differenz berechnen und absolut Warten.

Zitat:Das Problem ist nun, dass die Schleife schneller läuft als ein Bild geladen wird. Die Schleife ist also zu ende, bevor alle Bilder geladen wurden, was doch eigentlich nicht sein dürfte!?
Ich glaube ich kann ohne es ausprobieren zu können, nachvollziehen was du meinst: Das, was du beobachtest kann sein. Das liegt an folgendem (wenn es denn das ist, was ich denke, mit Vision kenn ich micht nicht aus):
Ein Bild wird von Platte geladen, umgerechnet und an das Element "Image" übergeben - und nur übergeben. Mit dieser Übergabe ist der Sequenzrahmen dann aber auch schon beendet. Die tatsächliche Anzeige der übergebenen Daten im Frontpanel des Images geschieht im Hintergrund, also eigenlich parallel zum dritten, vierten und fünften Sequenzrahmen. Diese Anzeige aber dauert länger als das Nachladen des nächsten Bildes. Dieses Effekt würdest du minimieren können, wenn du deine Ablaufzeit erhöhen würdest.

Die Methode, die tatsächliche Anzeige im Hintergrund zu machen, hat druchaus seine Berechtigung. Bei Graphen gibt es ein ähnliches Phänomen.

Kuck mal im Kontextmenü des Images unter Fortgeschritten->Synchrone Anzeige. Klick da mal und kuck, was sich tut.

Zitat:Das zweite Problem ist, dass ich von der Funktion zum Laden der Bitmap bei manchen Bildern einen Fehler bekomme (Fehler 7) oder auch bei ner ganzen Serie(Fehler 8). Bilder sind nicht schreibgeschützt o.ä....
Kuck mal, wie der Dateiname heißt, bei dem ein Fehler auftritt. Gibt es diese Datei?
' schrieb:Also, wenn jemand einen Ansatz hat, wie ich diese Probleme in den Griff bekommen könnte, wär mir sehr geholfen!
Ich lad mal zwei Versionen des VIs hoch(LV 7.1).
Liegt mglw. / wahrscheinlich an der nicht-initalisierten Feedback-Node. Ersetze die einmal durch ein Shift-Register (Rechstklick, Replace with Shift-Register), dann siehst du (hoffentlich), was ich meine.

Und diese Sequenz kannst du dir sparen. Das Wait-VI einfach parallel zu deinem Ladenvorgang platzieren, dann wird in jedem Durchgang der Schleife auf jeden Fall x Millisekunden gewartet.
[attachment=24714]

Gruß, Jens
Vielen Dank für die Antworten/Tipps! Leider war ich krank und hab mich heute erst wieder daran gemacht!
Ich hab die Vorschläge mal getestet.
Irgendwie ist die Geschichte vertrackt... Wenn das Sychronous Display aktiviert ist, läuft das Auslesen und Anzeigen mal fix(10ms) und dann wieder langsam(65ms) ab. Erst hab ich vermutet, dass es am Bildinhalt liegt, aber das hat sich nicht bestätigt. Das eigentliche Problem, dass die Schleife schneller läuft als vorgesehen, bleibt leider bestehen. Ich lasse mir ja unten im Blockdiagramm den Schleifenindex und parallel dazu den aktuellen "Dateinamen" anzeigen. Daran kann ich sehen, dass der Schleifenindex schneller wächst, als der Dateiname. Das Ergebnis ist, dass die Schleife nach der Hälfte der Bilder am Ende ist... Ich könnte ja auch auf die Wartezeit verzichten, aber irgendwie wärs schon ganz nett, wenn wenigstens alle Bilder wiedergegeben wurden.
:???:
Das kann eigentlich gar nicht sein. Das Wait-VI zwingt LabVIEW dazu, mindestens die eingestellte Zeit zu warten.

Bist du dir sicher, dass deine Sequenz-Nummern in den Bildernamen wirklich nur jeweils einmal vorkommen? Denn was du dir anzeigen lässt, ist nicht der komplette Dateiname, sondern nur die Nummer!

Mach mal die folgenden Vereinfachungen:
[attachment=24815]
und analysiere einmal in Ruhe, was im Array "sorted array" steht! Vielleicht tauchen da Zahlen mehrfach auf?!

Gruß, Jens
Ihr seid echt super! Rofl2
Vielen Dank für die schnelle und vor allem GUTE Hilfe!
Ich hab mich jetzt an mehr oder weniger an dem Bild von Jens orientiert. Funktioniert! Du hattest übrigens Recht damit, dass einige Werte doppelt oder x-fach vorkommen. Kam durch die ungeschickte Erzeugung meines Arrays mit den Dateinamen.
Das einzige Problem was bleibt, ist die Tatsache, dass ab einer zu kurzen Wartezeit die ganze Geschicht ins Stocken kommt und nicht schneller, sondern langsamer abläuft.
Aber so ist das schon super!Dais

Gruß, Kai
Um die Schleife schneller auszuführen, könntest du auch das Einlesen der Bitmaps auslagern.
Also vor deiner Anzeige-Schleife alle Bitmaps einlesen und in ein Array speichern. In der Anzeige-Schleife dann auf den entsprechenden Arrayindex zugreifen und das Bild darstellen.

Ist nur eine Idee, aus Mangel an vielen tausenden Bitmaps hab ich das jetzt nicht geprüft.


Gruß SeBa
Das wär in der Tat auch noch ein Ansatz! Ist dann nur die Frage, wie lange das Laden bei den ganzen Bildern dann dauert. Wär auch blöd, wenn man so lange Warten muss bevor man was sieht. Ich werds bei Gelegenheit mal probieren. Oder vllt. doch jetzt gleich?! Mal sehn.
Danke!

Gruß, Kai
Habs grad probiert. Die Idee ist gut, aber leider dauert das Laden dann schon recht lange, bevor man ein Bild bekommt. Bei über 2000 Bilder bekomme ich dann auch noch den netten Hinweis, dass der Speicher voll ist. Schade...
Trotzdem Danke!

Gruß, Kai
Ich hab auch eine Idee. Smile

Mach's gleichzeitig: Laden von Platte und anzeigen.

Mach ein paralleles SubVI, in dem du die Files nur einließt. Und zwar in eine Queue. Achte darauf, dass in der Queue nie mehr als 100 Bilder stehen. In einem zweiten, parallelen SubVI (oder paralleler Loop) liest du die Queue aus und zeigt die Bilder an. Auslesen tust du mit der Anzeigegeschwindigkeit. Wenn die Queue leer ist, wartest du bis was drinnen steht.

Abbrechen geht die Anzeige-Loop dadurch, in dem die Lese-Loop ein leeres Image in die Queue schreibt, wenn alle Files gelesen wurden.

Jetzt hast du sowas wie einen Stream wie beim Videokucken im Browser.
Seiten: 1 2
Referenz-URLs