Pergunta

Quero rastrear um ponto de luz a laser (que está em uma parede) com uma webcam e estou usando o OpenCV para fazer essa tarefa. Alguém pode me sugerir uma maneira de fazer isso com C ++.

Obrigada !

Foi útil?

Solução

Você tem três opções, dependendo da estabilidade do seu plano de fundo e das coisas que você deseja fazer com a imagem.

Você pode deixar sua imagem tão escura que a única coisa que você pode ver é o ponto a laser. Você pode fazer isso fechando o diafragma e/ou reduzindo o tempo do obturador. Mesmo com webcams baratos, isso geralmente pode ser feito no motorista. Depois de fazer isso, o trabalho de encontrar o ponto a laser é muito fácil. Você torna a imagem o mais escura possível, porque geralmente o ponto em que o laser brilha é muito brilhante para a câmera pegar. Isso significa (como você experimentou) que você não pode discernir entre o ponto de laser leve e outros objetos de luz na imagem. Ao torná -lo mais sombrio, você agora pode fazer isso.

Se você tem outros usos para sua imagem (mostrando -a para as pessoas) e seu plano de fundo é estável, você também pode usar a média das últimas imagens de vídeo como um "fundo" e, em seguida, encontre o local onde há uma grande diferença entre esse fundo e a imagem mais recente. Geralmente é onde o laser é apontado (novamente, se seu plano de fundo estiver estável o suficiente).

Por fim, se seu plano de fundo não estiver estável e você não quiser tornar sua imagem muito escura, sua opção final é procurar todos os pixels que são muito brilhantes e mais brilhantes no canal vermelho do que em verde e azul (se você está usando um laser vermelho). Esse sistema ainda será distraído por manchas brancas, mas não tanto quanto encontrar os pixels brilhantes. Se o centro do seu ponto de ponto a laser estiver realmente aparecendo como branco brilhante, independentemente da cor do laser, essa técnica permitirá que você encontre "anéis" em torno desse ponto brilhante (a parte externa do ponto em que o laser não é tão brilhante quanto Está no centro para que apareça com a cor real do laser na imagem). Você pode então usar simples operações morfológicas, (provavelmente fechamento é suficiente) para preencher esses círculos.

Outras dicas

Digamos que você use um laser de uma dessas cores: vermelho, verde, azul. Se o ponto do laser parecer muito brilhante (pelo menos em um canal, por exemplo, vermelho), basta limitar a imagem/canal em, digamos Greyvalue de 200, deixará você com alguns candidatos à luz do laser. Se os outros canais estiverem escuros (ER) nesta área, você sabe que é uma luz brilhante da cor certa. Um pouco de filtragem por tamanho e você tem uma boa chance de encontrar o local.

Se você colar um filtro de IR em sua webcam, sua projeção não será recolhida, facilitando muito a detecção do ponto do laser (usando subtração de fundo simples etc.) que assume que o ponteiro do laser emite luz IR ...

Conforme sugerido em outras respostas, procurar a cor pode ser uma boa ideia. Você deve considerar procurar uma faixa de cores específica. A melhor maneira de fazer isso é converter a imagem em espaço de cores HSL ou HSV.

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

Mais informações sobre Wikipedia.

Então você tem três canais: Hue (= cor), saturação e leveza (ou valor).

Com cv::inRange(hsv, cv::Scalar(159, 135, 165), cv::Scalar(179, 255, 200), inRange); Agora você pode gerar uma imagem em preto e branco, que mostra quais pixels estão na faixa de cores. Os escalares são os valores baixos e altos para cada canal.

Neste exemplo, você receberá pixels com uma cor entre 159 e 179 (matiz), saturação entre 135 e 255 e valor entre 165 e 200.

Talvez isso possa melhorar seu rastreamento.

Que tal este código

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

https://github.com/niitsuma/detect_laser_pointer

Neste código, a cor HSV observada é comparada à cor registrada usando o teste quadrado da hotelling

Experimente o Matplate Maching. Primeiro, você "aponta o ponteiro" para um local específico para que o templo possa ser feito. Então você apenas procura por isso.

Ou, como disse Jilles de Wit, você pode levar a diferença dos últimos 2 quadros, provavelmente a diferença mostrará o ponteiro.

Converta os dois últimos quadros em escala de cinza e aplique a sub -função.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top