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!
02.06.2011, 14:32 (Dieser Beitrag wurde zuletzt bearbeitet: 02.06.2011 19:15 von jg.)
Ich habe folgendes Problem. Ich habe eine Kamera, die aus Labview angesteuert wird und ein Livebild erzeugt. Dieses Bild besteht aus einem Laserstrahl und einem Körper, der einen Teil des Linien-Laserstrahls unterbricht. Jetzt möchte ich die Anzahl der Pixel bestimmen, die durch die Verschattung entsteht. Das Bild sollte zuerst in ein Schwarz-Weiß-Bild umgewandelt werden. Kann mir jemand helfen?
Die Ansteuerung der Kamera funktioniert, nur das auslesen der Pixel nicht. Ich hab ein Beispielbild und das verwendete Sub-Vi, falls es hilfreich ist.
Falls jemand ein besseres Sub-Vi hat, wäre ich ihm sehr dankbar.
Oha. Erstmal: Schön "breit" dein VI. Das aber kein schöner Programmierstil. Warum machst du es denn so? Das ist ja in dem Sinne immer wieder das selbe was du da hintereinander abarbeitest ...
02.06.2011, 18:20 (Dieser Beitrag wurde zuletzt bearbeitet: 02.06.2011 18:22 von b.p.)
Hallo,
zum Binarisieren gibt es verschiedene Funktionen, je nachdem welche Bedürfnisse man hat (habe mich mit dem Thema mal längere Zeit beschäftigt, und selber eine Reihe programmiert).
Die ganz einfache Variante ist ein Threshold, also einfach nur eine Schwelle. Dazu verwandelt man erst das Bild in Graubilder (ebenfalls viele Algorithmen, oft kann man auch einfach nur eine Farbebene nehmen - für Bild mit rotem Licht evtl. Grün). Dann legt man einen Wert für die Schwelle fest, notfalls dynamisch.
Ich hab das Ganze für dich im IMAQ Vision Assistant gemacht und in LV-Code umgewandelt.
Gruß,
Birgit
PS: Die Breite und der Code kommt ziemlich sicher vom Vision Assistant. :-)
Gibt es denn kein fertiges VI dafür? Ich habe den Code dafür nicht geschrieben. Hat jemand anderes gemacht. Ich verstehe das auch nicht ganz. Vor allem, was hinten der Caliper macht.
Ich denke auch, dass das vom Vision Assistant kommt.
Mein Hauptproblem ist ja: Der Laserstrahl ist nicht unbedingt immer derselbe, wenn das Bild erzeugt wird. Das muss ich berücksichtigen. (Deswegen waren auch vermutlich so viele Blöcke hintereinandergeschaltet). Ich muss ja die Höhe der Abschattung bzw. die Pixel messen. und das möglichst genau).
Das Bild wird ja hinten ausgegeben, jedoch kriege ich keine Werte raus. geht das irgendwie einfacher und besser?
Wir haben dir gezeigt, wie man ein Bild binarisiert.
Was dann passiert, musst du dir selber ausdenken - und kannst ja gerne konkrete Fragen stellen. Bildverarbeitung ist so - da kommen komische Variationen raus, und man muss nachdenken, wie man sie in den Griff kriegt. Das Programmieren ist in der Regel schneller, als das Nachdenken.
So würde ich an deiner Stelle vorgehen, wenn du nicht einmal versuchen willst, "richtig" zu programmieren: Es gibt einen halbwegs funktionierenden Kantendetektor im Vision Assistant. Edge Detector, Simple. Da du nur 2 ausgeprägte Linien hast, kannst du einfach einen horizontalen Strich in der Mitte (an Stelle des Lasers?) als ROI machen. Dann wählst du "erste und letzte" oder "alle" oder so, und bekommst ein Clusterarray mit 2 Kanten. Du greifst mit "Array indizieren" auf Teil 0 und 1 des Clusterarrays zu, und schlüsselst dann den Cluster nach Namen auf. Dann hast du zwei y-Koordinaten, die du subtrahierst und ausgibst.
Ich weiß nicht, wie deine Bilder sich variieren, ich weiß nicht, wo genau man bei deinen Bildern messen muss, aber mit den gegebenen Informationen ist das die einfachste Lösung, die du hinkriegst.
Aber nein, es gibt kein magisches vi, dem man die Probleme füttern kann, wenn man selber nicht einmal klar definieren kann, was sie sind. Und fremder, undokumentierter, und nicht funktionierender Code ist so gut wie wertlos.
Wenn man es übersichtlicher machen will, vielleicht mal eine gestapelte Sequenzstruktur nehmen (wenn die Daten aufeinander aufbauen und eine Abhängigkeit untereinander haben, was hier der Fall ist, soweit ich das richtig gesehen habe, evtl. mit lokalen Sequenzvariablen arbeiten).
Bei sich wiederholenden Sachen: Evtl. eine Schleife durchlaufen lassen und die Werte dynamisch anpassen. Für die verschiedenen ROI-Cluster's ein Array anlegen und bei entsprechenden Schleifen-Index an die "Edge-Tool"-Blöcke legen ...!?
Die "Edge-Options" sind jedesmal gleich. Da reicht dann ein Konstanten-Block.
*Hust* ok da kommt man hier ins Forum und dann das =)
Studienarbeit beim Harzer ... schön wenn man sein "Werk" ( wenn man es so bezeichnen kann ) mal wiedersieht ^^
Ja das VI ist mit dem Vision Assistant erstellt ... schick mir mal deine Email-Add per Pm ... müsste noch ein paar Daten für den Assistant rumliegen haben ... da siehst du am besten was das Programm macht
Wenn sonst noch Fragen sind ... wie gesagt schick mir ne Pm =)