5.22. Correção de lente e perspetiva¶
Duas classes de correção geométrica distorcem a imagem de formas que um mapeamento retângulo-a-retângulo não consegue reproduzir. A correção de lente desfaz a distorção radial introduzida por uma lente de grande angular real – o efeito de abaulamento fisheye que dobra linhas retas da cena em curvas visíveis junto aos cantos do fotograma. A correção de perspetiva desfaz o efeito de trapézio que ocorre quando a lente não está apontada perpendicularmente à cena – a distorção trapezoidal que transforma um retângulo conhecido no mundo numa mancha não retangular na imagem. Ambas as correções desfazem, após a captura, efeitos de origem ótica.
5.22.1. Distorção radial da lente¶
O material sobre efeitos de lentes reais descreve a distorção em barril que as lentes de grande angular económicas introduzem. Os pixels próximos do centro do fotograma estão aproximadamente onde o modelo de orifício prevê; os pixels próximos das arestas estão curvados para fora numa quantidade que cresce com o quadrado da distância radial ao eixo ótico. Uma linha reta na cena que passa perto da aresta do fotograma curva-se visivelmente na imagem capturada, e qualquer algoritmo clássico de visão por computador que assume que linhas retas permanecem retas – deteção de cantos AprilTag, seguimento de arestas, navegação com seguimento de linhas – obtém resultados errados perto dos cantos.
lens_corr() desfaz a distorção. O método executa o mapeamento inverso: cada pixel de saída é amostrado a partir da posição na entrada de onde a lente o teria curvado para fora, e o resultado é uma imagem geometricamente reta.
img.lens_corr(strength=1.8)
O parâmetro strength é o núcleo da correção. É um único número que descreve a intensidade com que a lente curva; um valor próximo de 1.0 é uma correção suave para uma lente de grande angular moderada, e valores até cerca de 2.0 são razoáveis para um fisheye forte. O valor predefinido de 1.8 é um bom ponto de partida para as lentes padrão da OpenMV Cam; o valor correto para uma lente específica é uma questão de experimentar alguns valores e observar a imagem.
Os dois parâmetros laterais estão geralmente bem com os seus valores predefinidos. zoom (predefinição 1.0) escala a saída – um valor superior a um recorta para fora para compensar a forma como a correção de lente empurra os cantos ainda mais para fora; valores menores deixam mais da cena corrigida visível ao custo de incluir pixels em branco nas arestas da imagem. x_corr e y_corr deslocam o centro da correção para longe do centro geométrico da imagem, o que é útil quando a lente não está centrada oticamente sobre o sensor (caso invulgar, mas vale a pena conhecer).
Um pipeline típico: captura, executa lens_corr() uma vez para retificar a geometria, depois executa o que a aplicação realmente faz com o resultado.
5.22.2. Correção de rotação 3D¶
A outra classe de distorção geométrica é a distorção de perspetiva que ocorre quando o plano do sensor não é paralelo ao plano da cena. O caso clássico é um sinal ou uma matrícula vista de baixo: o topo do sinal está mais longe da lente do que a base, pelo que se projeta menor, e a imagem capturada mostra o retângulo como um trapézio com a aresta superior mais curta do que a inferior.
A solução consiste em aplicar uma rotação 3D ao fotograma capturado que reorienta virtualmente o plano do sensor para ser paralelo ao plano da cena. A matemática é o mesmo mapeamento de perspetiva que a deteção de AprilTag usa para recuperar a pose de uma etiqueta a partir dos seus quatro cantos, executado ao contrário: dado uma rotação, a operação mapeia cada pixel de saída de volta à posição na entrada de onde a rotação teria vindo.
rotation_corr() executa essa correção:
img.rotation_corr(x_rotation=10.0, y_rotation=0.0, z_rotation=0.0)
Os três parâmetros de rotação estão em graus e descrevem rotações em torno dos eixos x, y e z de uma câmara virtual centrada na imagem. x_rotation inclina a câmara para cima ou para baixo (a correção natural para uma captura ao nível do chão de uma parede); y_rotation vira a câmara para a esquerda ou para a direita; z_rotation roda a câmara em torno do seu eixo ótico (a correção natural para uma montagem inclinada).
x_translation e y_translation movem a câmara virtual lateralmente sem a rodar. zoom (predefinição 1.0) escala a saída. fov (predefinição 60.0) descreve o campo de visão vertical da câmara, utilizado para calcular a projeção – o valor deve corresponder à lente real para manter a geometria consistente.
Para uma combinação arbitrária de inclinação e panorâmica, múltiplas rotações não nulas compõem-se numa única chamada. A ordem das operações é fixa dentro da implementação; a aplicação apenas fornece os ângulos e o resultado é obtido.
5.22.3. Retificação de um retângulo conhecido¶
A forma mais comummente útil de rotation_corr() é a palavra-chave corners=, que recebe uma lista de quatro tuplos (x, y) descrevendo os cantos de um retângulo conhecido na imagem de entrada. O método calcula a rotação 3D que teria mapeado um retângulo verdadeiro para esses quatro pontos específicos, aplica o inverso dessa rotação à imagem inteira, e devolve um resultado em que o retângulo conhecido volta a ser retangular:
plate_corners = [(45, 80), (300, 60), (310, 180), (40, 200)]
img.rotation_corr(corners=plate_corners)
O uso clássico é exatamente o que o nome sugere: uma matrícula (ou qualquer outra característica retangular) fotografada de um ângulo oblíquo. Uma fase a montante deteta a matrícula e reporta as posições dos seus quatro cantos na imagem capturada; passar esses cantos a rotation_corr() produz uma imagem em que a matrícula aparece como um retângulo verdadeiro, pronto para qualquer fase de reconhecimento de caracteres ou correspondência de modelos que se siga.
Quando a forma de quatro cantos resolve o problema que uma aplicação tenta resolver, é dramaticamente mais útil do que a forma de seis parâmetros. A aplicação não precisa de estimar quaisquer ângulos de rotação; basta fornecer quatro pontos ao método e deixar que este determine o resto. A forma de seis parâmetros é útil quando não há nenhum retângulo identificável visível na cena e a rotação tem de ser ajustada manualmente a partir de conhecimento externo (um ângulo de montagem calibrado, por exemplo).