Chcę śledzić kropkę światła lasera (która jest na ścianie) za pomocą kamery internetowej i używam openCV do wykonania tego zadania. Czy ktoś może zaproponować mi sposób to zrobić z C++.Wykrywanie światła lasera za pomocą OpenCV i C++
Dziękujemy!
Chcę śledzić kropkę światła lasera (która jest na ścianie) za pomocą kamery internetowej i używam openCV do wykonania tego zadania. Czy ktoś może zaproponować mi sposób to zrobić z C++.Wykrywanie światła lasera za pomocą OpenCV i C++
Dziękujemy!
Masz trzy opcje w zależności od stabilności tła i rzeczy, które chcesz zrobić z obrazem.
Możesz sprawić, że twój obraz będzie tak ciemny, że jedyne co zobaczysz to punkt laserowy. Możesz to zrobić, zamykając membranę i/lub zmniejszając czas otwarcia migawki. Nawet przy tanich kamerach można to zwykle zrobić w sterowniku. Kiedy już to zrobisz, zadanie znalezienia punktu laserowego jest bardzo łatwe. Robisz zdjęcie tak ciemne, jak to tylko możliwe, ponieważ zwykle punkt, w którym lasery świecą, jest zbyt jasny, aby kamera mogła je podnieść. Oznacza to (jak doświadczyłeś), że nie możesz odróżnić lekkiej kropki lasera od innych jasnych obiektów na obrazie. Robiąc to ciemniej, możesz to zrobić.
Jeśli masz inne zastosowania dla swojego obrazu (pokazywanie go ludziom) i twoje tło jest stabilne, możesz również użyć średniej z kilku ostatnich obrazów wideo jako "tła", a następnie znaleźć miejsce, w którym jest duży obszar różnica między tym tłem a najnowszym obrazem. Zazwyczaj jest to miejsce, w którym laser jest skierowany (ponownie, jeśli twoje tło jest wystarczająco stabilne).
Wreszcie, jeśli twoje tło nie jest stabilne i nie chcesz, aby obraz był bardzo ciemny, ostateczną opcją jest wyszukanie wszystkich pikseli, które są zarówno bardzo jasne, jak i jaśniejsze w kanale czerwonym, niż w kolorze zielonym. i niebieski (jeśli używasz czerwonego lasera). Ten system nadal będzie rozpraszany przez białe plamki, ale nie tak bardzo, jak po prostu znalezienie jasnych pikseli. Jeśli środek punktu wskaźnika laserowego rzeczywiście jest widoczny jako jasny biały, niezależnie od koloru lasera, technika ta pozwoli ci znaleźć "pierścienie" wokół tego jasnego punktu (zewnętrzna część kropki, w której laser nie jest tak jasny jak znajduje się pośrodku, dzięki czemu pojawia się wraz z faktycznym kolorem lasera na obrazie). Możesz wtedy użyć prostego morphological operations (prawdopodobnie wystarczy closing), aby wypełnić te kręgi.
Myślę, że lepiej wypróbować pierwsze dwie opcje i wydaje się, że jest to możliwe :). Dziękuję Ci bardzo. – Keshan
Powiedzmy, że używasz lasera w jednym z tych kolorów: czerwony, zielony, niebieski. Jeśli punkt lasera jest bardzo jasny (przynajmniej w jednym kanale, np. Czerwonym), to po prostu progowanie obrazu/kanału na, powiedzmy, wartość szesnasta 200, pozostawi Cię z kilkoma kandydatami na światło lasera. Jeśli inne kanały są ciemne (er) w tym obszarze, oznacza to, że jest to jasne światło o odpowiednim kolorze. Trochę filtrowanie według rozmiaru, i masz dużą szansę na znalezienie miejsca.
dziękuję za odpowiedź, mam ścianę i jest ona wyświetlana, więc gdy ustawię obraz i szukam czerwonego kanału, czasami czerwony kolor na rzutowanej powierzchni może powodować pewne problemy. – Keshan
Jeśli przykleisz filtr podczerwieni do kamery internetowej, projekcja nie zostanie pobrana, co znacznie ułatwia wykrywanie punktu lasera (za pomocą prostego odejmowania tła itp.) Zakładając, że wskaźnik laserowy emituje światło podczerwone ...
spróbuj Machnąć szablonem. najpierw "wskaż wskazówkę" w określone miejsce, aby świątynia mogła zostać wykonana. A potem po prostu go poszukaj.
Lub, jak jilles de wit powiedział, możesz wziąć różnicę z ostatnich 2 klatek, prawdopodobnie różnica pokaże ci wskaźnik.
Konwertuj ostatnie 2 klatki na skalę szarości, a następnie zastosuj funkcję SUB.
Jak sugerowano w innych odpowiedziach, poszukiwanie koloru może być dobrym pomysłem. Należy rozważyć wyszukanie określonego zakresu kolorów. Najlepszym sposobem jest przekształcenie obrazu w przestrzeń kolorów HSL lub HSV.
cv::cvtColor(src, hsv, COLOR_BGR2HSV);
Więcej informacji na temat Wikipedia.
Następnie masz trzy kanały: odcień (= kolor), nasycenie i jasność (lub wartość).
Dzięki cv::inRange(hsv, cv::Scalar(159, 135, 165), cv::Scalar(179, 255, 200), inRange);
możesz teraz generować czarno-biały obraz, który pokazuje, jakie piksele znajdują się w zakresie kolorów. Skalary to niskie i wysokie wartości dla każdego kanału.
W tym przykładzie dostaniesz pikseli o kolorze pomiędzy 159 i 179 (odcień, nasycenie) pomiędzy 135 a 255 i wartości między 165 a 200.
Może to poprawić śledzenie.
Jak o tym kodzie
https://www.youtube.com/watch?v=MKUWnz_obqQ
https://github.com/niitsuma/detect_laser_pointer
w tym kodzie, obserwowano HSV kolor jest porównywana do zarejestrowanego koloru za pomocą hotelingowe za próbę t kwadratowy
Czy można użyć jakiegoś filtr przed kamerą, jeśli tak, to jakie są te filtry? – Keshan
To, że źródłem światła jest laser, który rzeczywiście jest dla ciebie ważny, czy też używasz go, ponieważ jest to wygodny sposób na zrobienie jasnego punktu? To znaczy, czy masz jakiś powód do troski, że źródło jest monochromatyczne i dopasowane do fazy? Jeśli tak, jakie są właściwości optyczne powierzchni, na którą rzutowana jest kropka (płaskość itp.)? – dmckee
Czy możesz po prostu zeskanować obraz dla małego obszaru z czerwonym komponentem, który wyraźnie się nasilił w porównaniu z sąsiednim obszarem? – Dialecticus