Question

Je veux suivre un point de lumière laser (qui se trouve sur un mur) avec une webcam et j'utilise OpenCV pour effectuer cette tâche. quelqu'un peut-il me suggérer une façon de le faire avec C ++.

Merci!

Était-ce utile?

La solution

Vous disposez de trois options en fonction de la stabilité de l'arrière-plan, et les choses que vous voulez faire avec l'image.

Vous pouvez faire votre image si sombre que la seule chose que vous pouvez voir est le point laser. Vous pouvez le faire en fermant le diaphragme et / ou en réduisant le temps d'obturation. Même avec les webcams bon marché, cela peut généralement être fait dans le pilote. Une fois que vous avez fait le travail de trouver le point laser est très facile. Vous faites l'image aussi sombre que possible, car généralement le point où le laser brille est trop lumineux pour la caméra pour ramasser. Ce moyen (comme vous l'avez connu) que vous ne pouvez pas discerner entre le point de lumière laser et d'autres objets lumineux dans l'image. En vous rendant plus sombre peut maintenant le faire.

Si vous avez d'autres utilisations pour votre image (montrer aux gens) et votre arrière-plan est stable, vous pouvez également utiliser la moyenne des dernières images vidéo comme un « fond » et trouver le bon endroit où il y a une grande différence entre ce fond et la nouvelle image. Ceci est habituellement où est pointé le laser (encore une fois, si votre arrière-plan est assez stable).

Enfin, si votre arrière-plan est pas stable et vous ne voulez pas faire votre image très sombre de votre dernière option est de rechercher tous les pixels qui sont à la fois très lumineux et plus lumineux dans le canal rouge qu'ils ne le sont en vert et bleu (si vous utilisez un laser rouge). Ce système sera toujours se laisser distraire par des taches blanches, mais pas autant que juste de trouver les pixels lumineux. Si le centre de votre spot pointeur laser est en effet montrant comme blanc brillant quelle que soit la couleur laser alors cette technique vous permettra de trouver « anneaux » autour de ce point lumineux (la partie extérieure du point où le laser est pas aussi brillant que il est au centre de sorte qu'il se présente avec la couleur réelle du laser dans l'image). Vous pouvez alors utiliser simplement opérations morphologiques , (probablement fermeture suffit) pour remplir ces cercles.

Autres conseils

Disons que vous utilisez un laser d'une de ces couleurs: rouge, vert, bleu. Si le point laser apparaît très lumineux (au moins dans un canal, par exemple rouge) alors simplement seuillage l'image / canal, disons greyvalue de 200, vous laissera avec quelques candidats à la lumière laser. Si les autres canaux sont sombres (er) dans ce domaine, alors vous savez qu'il est une lumière brillante de la bonne couleur. Un peu de filtrage par taille, et vous avez une bonne chance de trouver l'endroit.

Si vous vous en tenez un filtre IR sur votre webcam, votre projection ne sera pas pris, ce qui rend la détection du point laser beaucoup plus facile (en utilisant de simples soustraction de fond, etc.) qui est en supposant que le pointeur laser émet de la lumière infrarouge ...

Comme suggéré dans d'autres réponses, la recherche de la couleur peut être une bonne idée. Vous devriez envisager de rechercher une gamme de couleurs spécifique. La meilleure façon de le faire est de convertir l'image pour HSL ou HSV espace couleur.

cv::cvtColor(src, hsv, COLOR_BGR2HSV);

Plus d'informations sur Wikipedia .

Ensuite, vous avez trois canaux: teinte (= couleur), la saturation et la luminosité (ou la valeur).

Avec cv::inRange(hsv, cv::Scalar(159, 135, 165), cv::Scalar(179, 255, 200), inRange); vous pouvez maintenant générer une image en noir et blanc, qui montre ce que les pixels sont dans la gamme de couleurs. Les scalaires sont les valeurs basse et haute de chaque canal.

Dans cet exemple, vous obtiendrez des pixels avec une couleur entre 159 et 179 (teinte), la saturation entre 135 et 255 et la valeur entre 165 et 200.

Peut-être que cela peut améliorer votre suivi.

Qu'en est-ce code

https://www.youtube.com/watch?v=MKUWnz_obqQ

https://github.com/niitsuma/detect_laser_pointer

Dans ce code, observé couleur HSV est comparée à la couleur enregistrée en utilisant le test carré t Hotelling

essayez Modèle Maching. D'abord, vous « pointez le curseur » à un endroit spécifique pour le temple peut être fait. Ensuite, vous regardez juste pour elle.

Ou, comme Jilles de l'esprit dit, vous pouvez prendre la différence des 2 dernières images, probablement la différence va vous montrer le pointeur.

Convertir les 2 dernières images font échelle de gris, puis appliquez la fonction SUB.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top