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.
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.
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