Hallo Ich möchte gerne mittels einer USB Kamera ein Bild einlesen und auf diesem dann einen Laserpunkt erkennen. Die Kamera soll dann mittels 2 Servomotoren sich selber ausrichten. (In LabView 8.6) Zur Zeit funktioniert die USB Kameraeinlesung in LabVIEW und die Ansteuerung der Motoren. Nur wie kann man den Laserpunkt genau definieren? Die Bildfläche ist natürlich nicht 'klinisch Weiß' (^.^), also sind Objekte darauf (Tische, Fenster usw.). Ich habe schon diverse Filter von NI Vision probiert, allerdings brachte keines davon ein wirklich eindeutiges Ergebniss. Am besten währe die Erkennung des Punktes in einer xy Koordinate (^.^) aber nur wenn es geht. Ich hoffe ihr könnt mir helfen Achja, bin leider ein Programmierneuling ;-)
Falls der Punkt das Hellste im Nild ist, dürfte das kein Problem sein. 1. Schwellwert setzen 2. Bild in Zeilenweise durchsuchen und Maximum bestimmen 3. Bild in Y Duchsichen und der zeite Maximum durchsichen Oder auf diese Weise ein Schwarz- Weiß Bild (2 Helligkeitsstuefeb erzeugen und mit Patternmatchung2 arbeiten. Vielleicht kannst einemal ein derartuges Bild hochladen?
Danke schon mal für den Vorschlag ^^ Klar hier ist mal ein Beispielbild (is ein extremes ^^) Ich bin ja schon Froh wenn es auf einem mehr oder weniger weißem Untergrund funktioniert ^^ Leider is der Laserpunkt nicht das Hellste. Ein Laser sieht von der USB Kamera generell eher 'schwach' aus. Das macht mir auch Kopfzerbrechen. Auch ist die Bildwiederholrate der Kamera ein problem. Da kommt schon mal ein 'Strich' zusammen. mfg und Prosit Neujahr ^^
So eine Aufgabe sollte man ohne Kamera loesen koennen. Falls doch, sollte man das Problem vom Tool, dem Labview loesen. Das Problem bleibt dann die Bildverarbeitung. Ohne Kamera wuerde ich den Raum mit 2 gekreutzen Blechen in 4 Sektoren einteilen. Dann 4 Photodioden in die Ecken klemmen. Wenn man das Laserlicht moduliert und synchron demoduliert hat man wenig Probleme im Erkennen des Punktes.
Anbei die Lösung. 1)Das Muster und das Bild werden eingelesen und in ein U8 verwandelt. 2)Das Template wurde etwas größer gewählt, da der Punkt sich sonst nicht zu stark von anderen Bildteilen unterscheidbar ist. 3) Suchfunktion Für diejenigen, die kein LabVIEW auf Ihren Rechner haben - kann das Programm als .jpg angeschaut werden. LabVIEW ist wie ein zum Leben erwachtes Flußdiagramm. PS: Für LabVIEW-Benutzer: Alle Dateien in einen Ordner und das vi starten.
Noch ein Verbesserungsvorschlag: Bilt mit eingeschalteten Laser aufnehmen. Danach Bild ohne Laser aufnehmen. Beide Bilder subtrahieren.
WOW, ich bin echt begeistert, vielen Dank schon ein mal, das sind sehr gute Vorschläge. Ihr versteht echt euer Handwerk O.o aber bei dem Template, wird der Punkt dann eigentlich dann auch auf einer anderen Oberfläche erkannt, weil er sucht ja nur mit weißen Hintergrund. Aber ich bin echt begeistert wieviele Kompetente Leute hier sind ^^. Ich find LabVIEW echt toll zum Programmiern, denn es hat SEHR viele Optionen, nur kommt es mir etwas langsamer vor. Ist es denn langsamer als z.B.: VisualBasic????
Hallo, der Hintergrund ist natürlich ein Problem. Man müsste sich dieses Problem mit konkreten Mustern des Hintergrunds anschauen. Jedenfalls ist das Problem bei einem "Differnzbildverfahren" (mit und ohne Laserstrahl) robust lösbar. Zur Geschwindigkeit von LabVIEW. LabVIEW ist seher schnell, da es eine kompilierte Sparache ist. Siehe Beispiel: Eine For Schleife wird 1000000 mal durchlaufen. In der Schleife jeweils ein Sinus berechnet. Danach wird der letzte Sinuswert ausgegeben. Laufzeit (mit einem 2 Jahre alten Laptop) 105 ms. Also 105 ns pro Zyklus. Das ist mit Visual Basic meiner Meinung nicht zu schaffen. Java , schätze ich, braucht 100 mal länger.
Ein Bandpassfilter mit der Wellenlänge des Lasers vereinfacht die Auswertung auch sehr stark.
Wenn alles andere scheitern sollte, könntest du es mit einem Infrarotlaser versuchen und einen IR-Filter vor die Kamera hängen. Die Frage ist nur, ob sich dann der erhoffte Vorteil nicht aufhebt, da du den Strahl nicht mehr siehst. Und bevor wieder jeder motzt: Achtung, bei IR-Lasern reagiert der Lid-Effekt, der bei sichtbarem Laserstrahl dein Auge nach kurzer Zeit schließt nicht, d.h. du merkst erst, dass du reinsiehst, wenns zu spät ist! Gruß Michi
Hallo Die Auswertung mittels Template funktioniert zur Zeit, allerdings 'wackelt' der Motor dann zwischen 2 Positionen hin und her (er geht nur absolut anzusteuern). Wie kann man in LabVIEW eine Schleife machen, die nur z.B.: alle 100msek durchgeführt wird und während der Wartezeit das restliche Programm nicht stört bzw. blockiert? Denn der Motor braucht ein wenig bis er den Punkt erreicht. Hab es mit EINER zeitgesteuerten Schleife probiert, allerdings beendet er diese nie wieder und läuft daher ununterbrochen. Diverste wait/delay Bausteine hab ich auch schon probiert, diese stören aber auch das restliche Programm bzw. die Videoausgabe von den Kameras.
Man kann in Labview zwei Task erstellen. Das ist sehr einfach zu erreichen, indem man zwei getrennte "While Schleifen" macht. Die Daten bzw. die Kommunikation zwischen den Schleifen kann man mit "Lokalen Variablen" aufbauen. Falls man auf höherem Niveau programmieren will, steht auch eine "Notifikation" und auch "Semaphore" zur Verfügung.
Allerdings bei dem mit 2 Tasks, werden diese dann wirklich parallel ausgeführt? Ich dachte immer das er z.B.: 100msek wartet bis die Schleife vorbei ist und dann erst die mit 1msek startet oder macht er inzwischen ~100 mal die zweite Schleife??? (ist nur eine Verständnissfrage)
Zwar laufen die Tasks nicht direkt parallel (das geht erst bei LabVIEW 2009 und PC's mit mehreren Prozessoren). Falls aber eine Warteschleife von 100ms angegeben wird, wird der Task zurückgegeben und die andere Schleife wird ausgeführt. Eine Wartschleife in einem Task blockiert also den zweiten Task nicht. (Und das ist gut so)
also bis jetzt funktioniert die Erkennung und die Ansteuerung. Allerdings passt bei der Auswerung etwas nicht und wüsstet ihr vielleicht wie man einen ganzen Bereich deklariert? Es ist in Formular Format von LabVIEW erstellt (C ähnlich). Eine Überprüfung von einem Wert +-1 müsste doch irgendwie zu machen sein, also nach dem Prizip. WENN wertA ist zwischen wertB+-1 DANN mach das und das. Hier mal ein Auszug aus dem Formula Code:
1 | if(tempb==((Aktpos-1)~(Aktpos+1))) //Wenn die gesp. Position ungef. der neuen entspricht |
2 | {errei=1;} //speichere dass Position erreicht wurde |
Nach der Labviewhilfe sollte es funktionieren, aber der Kompiler sagt dauernd das in der if Position ein Fehler ist. Hier aus der LabVIEW Hilfe: keine Zahl: eine von _ a~z A~Z weis echt nicht weiter. thx schon mal
ok bin draufgekommen, so nen C-Buch is doch nicht so schlecht, hier der Code, der sollte schon stimmen:
1 | if((tempb<(Aktpos+1)) && (tempb>(Aktpos-1))) //Wenn die gesp. Position ungef. der neuen entspricht |
2 | {errei=1;} //speichere dass Position erreicht wurde |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.