Laser-Licht-Erkennung mit OpenCV und C++
Ich verfolgen möchten ein laser-Licht-dot(das ist an einer Wand) mit eine webcam, und ich bin mit openCV zu tun diese Aufgabe. kann jemand empfehlen, mir einen Weg, es zu tun mit C++.
Danke !
- Ist es möglich, eine Art filter vor der webcam wenn ja, was sind diese Filter?
- Ist es die Tatsache, dass die Lichtquelle ein laser ist eigentlich wichtig für Sie, oder sind Sie nur mit, weil es ein bequemer Weg, um eine helle Punkt? Das heißt, Sie haben einen Grund für sorgen, dass die Quelle monochromatisch und phase abgestimmt? Wenn ja, was sind die optischen Eigenschaften der Oberfläche den Punkt projiziert (Ebenheit, etc...)?
- Sie können nur Scannen Sie das Bild für die kleine Fläche mit rot-Komponente deutlich verstärkt im Vergleich zu den benachbarten Bereich?
- Beachten Sie, dass billige dioden-Laser kommen in einer Vielzahl von Farben jetzt. So
s/red/you laser's color/
. - ich habe eine Wand und ich projizierte mein computer an der Wand und ich will, das filtern der laser-Punkt(wenn ich Punkt ein laser dot es) aus, die Oberfläche.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie drei Optionen, je nach der Stabilität von Ihrem hintergrund, und die Dinge, die Sie wollen mit dem Bild.
Können Sie Ihr Bild so dunkel, dass die einzige Sache, die Sie sehen können, ist das laser-Punkt. Sie können dies tun, durch die Schließung der Membran und/oder Verringerung der Verschlusszeit. Sogar mit Billig webcams dieses kann normalerweise getan werden, in den Treiber. Sobald Sie dies getan haben, den job zu finden, der laser-Punkt ist sehr einfach. Sie machen das Bild so dunkel wie möglich, weil in der Regel der Punkt, wo der laser strahlt ist viel zu hell für die Kamera zu Holen. Dies bedeutet (wie du erlebt hast), dass man nicht unterscheiden zwischen dem Licht-laser-Punkt und andere helle Objekte im Bild. Indem es dunkler wird Sie jetzt tun können.
Wenn Sie andere Verwendungen für das Bild (zeigt es an Menschen) und Ihr hintergrund ist stabil, Sie können auch den Durchschnitt der letzten paar video-Bilder als "hintergrund" und dann finden Sie die Stelle, wo es ist ein großer Unterschied zwischen dem hintergrund und dem neuesten Bild. Dies ist in der Regel, wo der laser ist Spitze (auch wenn Ihr hintergrund ist stabil genug) .
Schließlich, wenn Ihr hintergrund ist nicht stabil, und Sie wollen nicht, um Ihr Bild sehr dunkel Ihre Letzte option ist, für alle Pixel, die sind beide sehr hell, und heller im rot-Kanal, als Sie in blau und grün (wenn Sie mit einem roten laser). Dieses system wird noch abgelenkt werden, die durch weiße Flecken, aber nicht so viel, nur als Feststellung, die hellen Pixel. Wenn sich die Mitte des laser-pointer-Punkt ist in der Tat zeigt sich als helle, weiße, unabhängig von der laser-Farbe, dann ist diese Technik finden Sie die "Ringe" um diesen hellen Fleck (der äußere Teil von dem Punkt, wo der laser ist nicht so hell wie es ist in der Mitte so, dass es zeigt, bis die tatsächliche Farbe des Lasers im Bild). Sie können dann nutzen Sie einfach morphologische Operationen, (wahrscheinlich schließen genug ist) zu füllen, diese Kreise.
Lassen Sie sagen, Sie verwenden einen laser, der eine dieser Farben: rot, grün, blau.
Wenn der Laserpunkt erscheint sehr hell (zumindest auf einem Kanal, z.B. rot) dann einfach schwellenwertbestimmung das Bild/Kanal auf, sagen greyvalue von 200, verlassen Sie mit ein paar Kandidaten für die laser-Licht. Wenn die anderen Kanäle sind dunkel(er) in diesem Bereich, dann wissen Sie, es ist ein helles Licht von der richtigen Farbe. Ein wenig filtern nach Größe, und Sie haben eine gute chance, die Stelle.
Wenn Sie stick ein IR-filter auf Ihr webcam, Ihre Projektion nicht abgeholt werden, so dass die Erkennung des Laserpunktes viel einfacher (mit einfachen hintergrund-Subtraktion e.t.c) das setzt Voraus, Dass die laser-pointer strahlt IR-Licht...
Wie bereits in anderen Antworten, die Suche nach der Farbe könnte eine gute Idee sein.
Sie sollten die Suche nach einem bestimmten Farbbereich. Beste Weg, dies zu tun ist, konvertieren Sie das Bild, um die HSL-oder HSV-Farbraum.
Mehr Informationen auf Wikipedia.
Dann haben Sie drei Kanäle:
Farbton (Hue=Farbe), die Sättigung und die Helligkeit( oder den Wert).
Mit
cv::inRange(hsv, cv::Scalar(159, 135, 165), cv::Scalar(179, 255, 200), inRange);
jetzt können Sie erzeugen eine Schwarz-weiß-Bild, das zeigt, welche Pixel in der Farbe Palette.Die Skalare werden die niedrigen und hohen Werte für jeden Kanal.
In diesem Beispiel erhalten Sie Pixel mit einer Farbe zwischen 159 und 179 (hue), Sättigung zwischen 135 und 255 und den Wert zwischen 165 und 200.
Vielleicht kann verbessern Sie Ihre tracking.
Wie wäre es mit diesem code
https://www.youtube.com/watch?v=MKUWnz_obqQ
https://github.com/niitsuma/detect_laser_pointer
In diesem code, beobachtet HSV Farbe ist im Vergleich zu registrierten Farbe mit Hotelling t-Quadrat-test
versuchen Vorlage Maching.
ersten Sie "den Zeiger", um eine bestimmte Stelle, damit der Tempel getan werden kann. Dann müssen Sie nur suchen.
Oder, als jilles de wit sagte, Sie können nehmen Sie die Differenz der letzten 2 frames, vermutlich der Unterschied wird Ihnen zeigen, den Mauszeiger.
Konvertieren Sie die letzten 2 Bildern zu tun, Graustufen, dann die SUB-Funktion.