Estou trabalhando no desenvolvimento de um sistema de controle autônomo para helicópteros de controle remoto IR de brinquedo (como o Syma s107, por exemplo) usando uma webcam e um Arduino com alguns LEDs IR. Estou usando C ++ com OpenCV em um laptop rodando a cerca de 2Ghz e preciso manter o sistema o mais próximo possível do tempo real.
Não tenho certeza de como determinar efetivamente a rotação do helicóptero na imagem 2D (mais precisamente sua guinada em relação ao plano de imagem da câmera). Esta informação é importante para poder estabilizar o helicóptero na tela porque, caso contrário, ele fica fora de vista.
Eu considerei, e pelo menos parcialmente tentei determinar a localização do corpo e da cauda e usar alguns truques de geometria e perspectiva para obter uma estimativa da forma, mas encontrar com precisão o rabo e o corpo com ruído baixo o suficiente foi difícil. Também considerei usar marcadores coloridos de algum tipo em determinados pontos do helicóptero, mas não sei como obter uma estimativa mais precisa do que a esquerda e a direita aproximadamente.
fonte
Respostas:
Para guiar, basta ter três pontos de dados distintos fixados ao helicóptero em um plano paralelo à rotação do rotor: leds de cores diferentes, por exemplo. Você pode colocá-los em três braços radiais finos fixados no trem de pouso. Talvez os materiais refletores coloridos funcionassem também, mas você teria que compensar as mudanças de luz ambiental.
Então, obter o ângulo da guinada é simples. Suponha que as luzes estejam vermelhas, verdes e azuis separadas por 120 graus e ccw quando vistas de cima.
Então, na imagem, você verá essas luzes em várias ordens de coordenadas x. À medida que o helicóptero gira a partir da posição mostrada no diagrama:
(Obviamente, nas fronteiras dessas regiões, duas luzes se fundirão em um único ponto. Elas podem ser tratadas como casos especiais.)
Assim, com 3 luzes, você dividiu todas as garras possíveis em segmentos de 6 x 60 graus.
Você pode reduzir ainda mais a resolução de 30 graus apenas comparando as larguras esquerda e direita da "folga". Se apontar diretamente para fora da câmera estiver em azimute teta zero graus e a luz vermelha estiver no nariz (como na imagem), o algoritmo é:
Os graus
X+-15
médios acima,X
mais ou menos 15: um segmento de 30 graus. Para obter o deslocamento exato, você pode construir uma tabela pré-processada que converte a taxaem um deslocamento exato de azimute entre -15 e 15. Isso é bastante simples de trigonometria, e o bom é que ele funciona independentemente da distância do helicóptero, desde que nunca vire de cabeça para baixo!
Outro benefício colateral: a distância da imagem entre as duas luzes externas oferece uma distância inversa à da câmera.
fonte
A ideia dos marcadores poderia funcionar.
Imagine colocar marcadores no lado mais distante do helicóptero e bloqueá-los no lado mais próximo. Quando o helicóptero gira, o marcador no lado que se aproxima será exposto à câmera.
fonte
A localização e a orientação completas do helicóptero podem ser calculadas com: 4 pontos conhecidos em um avião + câmera calibrada ou com 6 pontos conhecidos (determinadas configurações 3D não funcionarão, por exemplo, os pontos não devem estar no mesmo plano). Veja esta pergunta para o algoritmo de 6 pontos. Para o algoritmo de 4 pontos, achei a tese de mestrado de Liljequist - Aviões, Homografias e Realidade Aumentada muito útil, mas não consigo encontrá-la on-line. Um papel mais conciso, focado na calibração, é escrito por Zhang - Uma nova técnica flexível para calibração de câmera.
Bom livro sobre o tema: Hartley, Zisserman - Geometria de múltiplas visões em visão computacional.
fonte