Com o XNA, estou exibindo um retângulo simples que é projetado no chão. O projetor pode ser colocado em uma posição arbitrária. Obviamente, o retângulo projetado fica distorcido de acordo com a posição e o ângulo do projetor. Um Kinect examina o chão procurando os quatro cantos. Agora, meu objetivo é transformar o retângulo original para que a projeção não seja mais distorcida, basicamente pré-deformando o retângulo.
Minha primeira abordagem foi fazer tudo em 2D: primeiro, calcule uma transformação de perspectiva (usando OpenCVs warpPerspective()
) dos pontos digitalizados para os pontos do retângulo interno e aplique o inverso ao retângulo. Isso parecia funcionar, mas era muito lento, pois não podia ser renderizado na GPU.
A segunda abordagem foi fazer tudo em 3D para usar os recursos de renderização do XNA. Primeiro, eu exibia um avião, digitalizava seus cantos com o Kinect e mapeia os pontos 3D recebidos para o plano original. Teoricamente, eu poderia aplicar o inverso da transformação de perspectiva no plano, como fiz na abordagem 2D. No entanto, como o XNA trabalha com uma matriz de exibição e projeção, não posso simplesmente chamar uma função como warpPerspective()
e obter o resultado desejado. Eu precisaria calcular os novos parâmetros para a visão e a matriz de projeção da câmera.
Pergunta: É possível calcular esses parâmetros e dividi-los em duas matrizes (visualização e projeção)? Caso contrário, existe outra abordagem que eu poderia usar?
warpPespective
? Não estou familiarizado com o OpenCV, mas ler o documento parece que essa função apenas aplica uma perspectiva a uma imagem. Ou estou confuso? De qualquer forma, talvez adicionar mais detalhes sobre sua primeira implementação ajudaria.