Aprenda OpenCV

A Torre de Babel, de acordo com um conto mítico da Bíblia, foi o primeiro desastre de engenharia dos humanos. O projeto tinha todas as grandes qualidades de ter uma missão clara, muita força humana, sem restrições de tempo e tecnologia adequada ( tijolos e argamassa ). No entanto falhou espectacularmente porque Deus confundiu a linguagem dos trabalhadores humanos e eles não conseguiam mais comunicar.

Termos como “Homografia” muitas vezes lembram-me como ainda lutamos com a comunicação. Homografia é um conceito simples com um nome estranho!

O que é Homografia ?

Considerar duas imagens de um plano (topo do livro) mostradas na Figura 1. O ponto vermelho representa o mesmo ponto físico nas duas imagens. No jargão de visão por computador, chamamos estes pontos correspondentes. A Figura 1. mostra quatro pontos correspondentes em quatro cores diferentes – vermelho, verde, amarelo e laranja. Uma Homografia é uma transformação ( uma matriz 3×3 ) que mapeia os pontos de uma imagem para os pontos correspondentes na outra imagem.

Figure 1 : Duas imagens de um plano 3D ( topo do livro ) estão relacionadas por uma Homografia

Agora como uma homografia é uma matriz 3×3, podemos escrevê-la como

Deixe-nos considerar o primeiro conjunto de pontos correspondentes – na primeira imagem e na segunda imagem. Depois, a Homografia mapeia-os da seguinte forma

Alinhamento de Imagem Usando a Homografia

A equação acima é verdadeira para TODOS os conjuntos de pontos correspondentes desde que se encontrem no mesmo plano no mundo real. Em outras palavras, você pode aplicar a homografia à primeira imagem e o livro na primeira imagem ficará alinhado com o livro na segunda imagem! Ver Figura 2.

Figure 2 : Uma imagem de um plano 3D pode ser alinhada com outra imagem do mesmo plano usando Homography

Mas e os pontos que não se encontram no plano ? Bem, eles NÃO serão alinhados por uma homografia, como você pode ver na Figura 2. Mas espere, e se houver dois planos na imagem ? Bem, então você tem duas homografias – uma para cada plano.

Panorama : Uma Aplicação de Homografia

Na seção anterior, aprendemos que se uma homografia entre duas imagens é conhecida, podemos empenar uma imagem para a outra. No entanto, houve uma grande ressalva. As imagens tinham que conter um plano ( o topo de um livro ), e apenas a parte planar estava alinhada corretamente. Acontece que se você tirar uma foto de qualquer cena ( não apenas um plano ) e depois tirar uma segunda foto girando a câmera, as duas imagens estão relacionadas por uma homografia! Em outras palavras, você pode montar sua câmera em um tripé e tirar uma foto. Em seguida, faça uma panorâmica sobre o eixo vertical e tire outra foto. As duas imagens que você acabou de tirar de uma cena 3D completamente arbitrária estão relacionadas por uma homografia. As duas imagens vão compartilhar algumas regiões comuns que podem ser alinhadas e costuradas e bingo você tem um panorama de duas imagens. É realmente assim tão fácil? Não! (desculpe desapontar) Muito mais vai para a criação de um bom panorama, mas o princípio básico é alinhar usando uma homografia e costurar com inteligência para que você não veja as costuras. Criar panoramas será definitivamente parte de um futuro post.

Como calcular uma Homografia ?

Para calcular uma homografia entre duas imagens, você precisa saber pelo menos 4 correspondências de pontos entre as duas imagens. Se você tiver mais de 4 pontos correspondentes, é ainda melhor. OpenCV irá estimar de forma robusta uma homografia que melhor se ajuste a todos os pontos correspondentes. Normalmente, estas correspondências de pontos são encontradas automaticamente através da correspondência de características como SIFT ou SURF entre as imagens, mas neste post vamos simplesmente clicar nos pontos à mão.

Vejamos primeiro o uso.

C++

Python

Vejamos um exemplo mais completo tanto em C++ como em Python.

Exemplo de Homografia em C+++OpenCV

Imagens na Figura 2. podem ser geradas usando o seguinte código em C++. O código abaixo mostra como obter quatro pontos correspondentes em duas imagens e imagem warp sobre a outra.

Exemplo de Homografia Python OpenCV

Imagens na Figura 2. também podem ser geradas usando o seguinte código Python. O código abaixo mostra como obter quatro pontos correspondentes em duas imagens e uma imagem warp na outra.

Aplicações da Homografia

A aplicação mais interessante da Homografia é sem dúvida fazer panoramas ( a.k.a image mosaicing and image stitching ). Panoramas será o tema de um post posterior. Vamos ver algumas outras aplicações interessantes.

Perspective Correction using Homography

Figure 3. Correção de perspectiva

Vamos dizer que você tem uma foto mostrada na Figura 1. Não seria legal se você pudesse clicar nos quatro cantos do livro e rapidamente obter uma imagem que se pareça com a mostrada na Figura 3. Você pode obter o código para este exemplo na seção de download abaixo. Aqui estão os passos.

  1. Escreva uma interface de usuário para coletar os quatro cantos do livro. Vamos chamar estes pontos pts_src
  2. Precisamos de saber a relação de aspecto do livro. Para este livro, a relação de aspecto ( largura / altura ) é de 3/4. Assim podemos escolher o tamanho da imagem de saída para ser 300×400, e os nossos pontos de destino ( pts_dst ) para ser (0,0), (299,0), (299,399) e (0,399)
  3. Obter a homografia usando pts_src e pts_dst .
  4. Aplicar a homografia à imagem de origem para obter a imagem na Figura 3.
Você pode baixar o código e as imagens usadas neste post assinando a nossa newsletter aqui.

Página Billboard virtual

Em muitos eventos esportivos televisivos, propaganda em praticamente inserida em feed de vídeo ao vivo. Por exemplo, no futebol e no beisebol, os anúncios colocados em pequenos painéis publicitários mesmo fora dos limites do campo podem ser virtualmente alterados. Em vez de exibir o mesmo anúncio para todos, os anunciantes podem escolher quais anúncios mostrar com base na demografia, localização, etc. da pessoa. Nestas aplicações, os quatro cantos do quadro de anúncios são detectados no vídeo que servem como pontos de destino. Os quatro cantos do anúncio servem como os pontos de origem. Uma homografia é calculada com base nestes quatro pontos correspondentes e é utilizada para empenar o anúncio no quadro do vídeo.

Depois de ler este post você provavelmente tem uma idéia de como colocar uma imagem em um outdoor virtual. A Figura 4. mostra a primeira imagem carregada na internet.

Figure 4. Primeira imagem enviada para a internet.

E a Figura 5. mostra The Times Square.

Figure 5. The Times Square.
Pode baixar o código (C++ & Python) e as imagens usadas neste exemplo e outros exemplos neste post, assinando nossa newsletter aqui.

Pode substituir um dos outdoors do The Times Square pela imagem de nossa escolha. Aqui estão os passos.

  1. Escreva uma interface de usuário para coletar os quatro cantos do outdoors na imagem. Vamos chamar estes pontos pts_dst
  2. Deixe o tamanho da imagem que você quer colocar no outdoors virtual ser w x h. Os cantos da imagem ( pts_src ) devem portanto ser (0,0), (w-1,0), (w-1,h-1) e (0,h-1)
  3. Obtenha a homografia usando pts_src e pts_dst .
  4. Aplique a homografia à imagem de origem e misture-a com a imagem de destino para obter a imagem na Figura 6.

Nota na Figura 6. inserimos a imagem mostrada na Figura 4. em The Times Square Image.

Figure 6. Painel de Avisos Virtual. Um dos outdoors do lado esquerdo foi substituído por uma imagem de nossa escolha.

Subscribe & Download Code

Se você gostou deste artigo e gostaria de baixar o código (C++ e Python) e imagens de exemplo usadas neste post, por favor, assine a nossa newsletter. Você também receberá gratuitamente um guia de recursos Computer Vision. Em nossa newsletter nós compartilhamos tutoriais do OpenCV e exemplos escritos em C++/Python, e algoritmos de Computer Vision e Machine Learning e notícias.

Subscribe Now

Créditos de Imagem

  1. A imagem na Figura 4. foi a primeira imagem fotográfica enviada para a internet. Ela se qualifica como uso justo.
  2. A imagem usada na Figura 5. ( O Time Square ) é licenciado sob a GFDL.

Deixe uma resposta

O seu endereço de email não será publicado.