www.mikrocontroller.net

Forum: PC-Programmierung LabVIEW & Vision Laserpunkterkennung


Autor: D D (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ;-)

Autor: max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: D D (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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 ^^

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: max (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch ein Verbesserungsvorschlag:

Bilt mit eingeschalteten Laser aufnehmen. Danach Bild ohne Laser 
aufnehmen.

Beide Bilder subtrahieren.

Autor: D D (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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????

Autor: albert (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: JojoS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Bandpassfilter mit der Wellenlänge des Lasers vereinfacht die 
Auswertung auch sehr stark.

Autor: Michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: D D (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: max (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: D D (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)

Autor: D D (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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:
if(tempb==((Aktpos-1)~(Aktpos+1)))  //Wenn die gesp. Position ungef. der neuen entspricht
{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

Autor: D D (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok bin draufgekommen, so nen C-Buch is doch nicht so schlecht, hier der 
Code, der sollte schon stimmen:
if((tempb<(Aktpos+1)) && (tempb>(Aktpos-1)))  //Wenn die gesp. Position ungef. der neuen entspricht
{errei=1;}                     //speichere dass Position erreicht wurde

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.