1 RESUMO 2
2 METODOLOGIA 3
2.1 Calibração de Câmera e Remoção de Distorções . . . . . . . . . . . . . . . . . 3
2.2 Projeção de Sistemas de Coordenadas em Imagens . . . . . . . . . . . . . . . . 5
2.3 Projeção de Linhas Epipolares em Imagens Obtidas num Sistema de Duas
Câmeras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4 Mapa de Disparidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3 RESULTADOS 10
3.1 Calibração de Câmera e Remoção de Distorções . . . . . . . . . . . . . . . . . 10
3.2 Projeção de Sistemas de Coordenadas em Imagens . . . . . . . . . . . . . . . . 12
3.3 Projeção de Linhas Epipolares em Imagens Obtidas num Sistema de Duas
Câmeras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.4 Mapa de Disparidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4 CONCLUSÕES 15
BIBLIOGRAFIA 17
1
1. RESUMO
2
2. METODOLOGIA
√ 2
onde r = x + y2 .
As distorções tangenciais resultam da diferença entre o alinhamento do plano da
imagem com a lente utilizada, e seus efeitos são notados como a errada captura da profundidade
de objetos, que podem parecem mais distantes na região em que a lente mais se afasta do
plano da imagem. A distorção tangencial pode ser modelada pelas equações: [1]:
3
O vetor coefDist apresenta os 5 coeficientes necessários para as correções das distorções
em uma imagem:
coefDist = [k1 , k2 , p1 , p2 , k3 ] (5)
fx 0 cx
Matriz da Câmera = 0 fy cy
0 0 1
Uma vez que os parâmetros intrínsecos foram determinados, eles podem ser utilizados
para qualquer imagem capturada por esta câmera, pois como são parâmetros relacionados a
construção da câmera, eles não se alteram.
Os parâmetros extrínsecos fazem a relação entre a posição e orientação da câmera
com um objeto da cena.
A câmera utilizada para a calibração foi uma câmera USB padrão modelo Logitech
c270. Para realizar a calibração das câmeras, foi utilizado o método descrito por Zhang [2]
onde diversas imagens são tomadas de um objeto que possua padrão facilmente reconhecível
e com cantos específicos, por exemplo um tabuleiro de xadrez [3]. Todas as imagens devem
ser tomadas em um único plano de imagem XY para que a relação de profundidade seja
simplificada e apenas as coordenadas X e Y necessitem ser identificadas. Sabendo quais
pontos de cantos o padrão real apresenta é possível relacioná-los com os contos encontrados
na imagem e computar as distorções que a câmera apresenta.
No programa desenvolvido, para que a calibração das câmeras seja realizada, o
primeiro passo é obter as imagens do padrão do tabuleiro de xadrez. Um loop mostra
continuamente a cena capturada pela câmera enquanto o tabuleiro pode ser posicionado
de forma correta para ser totalmente capturado. Ao apertar a tecla ’s’ um frame é salvo
utilizando a função FilesNames(preName, ext) para nomear o nome do arquivo. Esta função
foi desenvolvida para que a captura de imagens não sobrescrevessem imagens já salvas, portado
realiza uma iteração em seu índice de acordo com o número de arquivos no diretório para
salvar a imagem em um novo arquivo.
4
def FilesNames (preName , ext ):
numFiles = len(os. listdir (’.’)) − 1
val = numFiles /2
newFileNameR = preName + ’R_’ + str(val) + ’.’ + ext
newFileNameL = preName + ’L_’ + str(val) + ’.’ + ext
return [ newFileNameR , newFileNameL , val]
Após tomadas as 15 fotos que serão usadas para a calibração, a função da biblioteca
OpenCV cv.findChessboardCorners() [4] identifica em cada uma das imagens tomadas seus
cantos e os salva em um array. Os cantos salvos passam por uma detecção mais fina através da
função cv.cornerSubPix() [5], que aumenta a precisão dos pontos detectados. Após confimados
os pontos identificados como cantos do tabuleiro a função cv.drawChessboardCorners() [4]
conecta os pontos detectados e desenha sobre a imagem as conexões e os pontos detectados.
Uma por vez, as imagens obtidas com os cantos detectados e destacados são exibidas em uma
janela Linux rapidamente.
A calibração da câmera em si é obtida pela utilização da função cv.calibrateCamera()
[4], que retorna a matriz da câmera (3x3) e o vetor de coeficientes de distorção da imagem.
Para afinar os resultados da matriz e dos coeficientes, os dados são processados pela
função do OpenCV cv.getOptimalNewCameraMatrix() [4] que retorna a matriz da câmera
baseada em um parâmetro de escala livre α. Se α=0 a função retorna a matriz para correção
da distorção com o mínimo de pixels indesejados; se α=1 todos os pixels da imagem distorcida
serão mantidos quando corrigidos, e os pixels adicionais serão preenchidos com valores igual a
zero (pixel preto). No programa a função foi utilizada com o parâmetro α=1.
A correção de uma imagem de acordo com os parâmetros modelados é realizada com
a função cv.undistort() [4]. Esta função utiliza as matrizes e coeficientes de distorção para
corrigir as distorções radiais e tangenciais, e é responsável por preencher com zeros (pixels
pretos) as bordas da imagem para adequação do formato retangular.
O resultado da correção das distorções é apresentado em uma janela, que compara
uma das imagens originais tiradas do tabuleiro de xadrez com a correspondente imagem
corrigida.
5
Utilizando os dados da matriz de caracterização da câmera salvos pelos programa
anterior e assumindo que um conjunto de fotos de um mesmo objeto estão sendo tiradas
em um plano XY fixado, pode-se encontrar um sistema de coordenadas correspondente à
orientação do objeto com relação à câmera.
Foram utilizadas as mesma imagens do tabuleiro de xadrez para terem seus cantos
identificados pela função cv.findChessboardCorners(). A informação de rotação e orientação do
objeto são obtidas através da função do OpenCV cv.solvePnP() [4] que relaciona o objeto entre
os planos 2D-3D. A função cv.projectPoints() é utilizada para projetar pontos 3D no plano
da imagem dados os parâmetros instrínsecos e extrínsecos da câmera. Para desenhar sobre a
imagem os pontos projetados pela função citada, foi utilizada a subfunção draw_Coord(), que
está apresentada abaixo:
6
Figura 1: Plano epipolar definido pelo objeto observado X e os centros ópticos das duas
câmeras. Extraído de [6].
capturada de outro ângulo de vista já que para a câmera da direta diferentes profundidades
do objeto em X sobre o eixo óptico da câmera esquerda representam pontos distintos em
seu próprio plano de imagem. O plano XOO’ é chamado de plano epipolar e os pontos e
são chamados epipólos, representando a intersecção entre os centros ópticos e os planos de
imagem das câmeras.
No programa para encontrar a melhor correspondência entre os pontos iguais captu-
rados nas duas imagens foi utilizada a função cv.xfeatures2d.SIFT_create(). Em seguida é
calculada a matriz fundamental.
As linhas epipolares encontradas em uma imagem são desenhadas sobre a outra
imagem, e para realizar o desenho, foi utilizada a subfunção :
7
O resultado das linhas epipolares sobre as imagens das câmeras esquerda e diretita
são mostrados em uma janela, utilizando a bilbioteca Matplotlib.
Bf
disparity = x − x 0 = (6)
Z
8
O programa exibe em uma janela uma das imagens originais capturadas da cena e o
mapa de disparidade para comparação.
9
3. RESULTADOS
Após a obtenção das imagens, é realizada a detecção dos cantos de cada uma das
imagens tomadas. Em uma janela Linux são apresentadas em sequência as imagens com os
cantos identificados, e para passar pela sequência de imagens basta apertar a tecla ’q’. A
Figura 4 apresenta um exemplo de uma janela apresentando os cantos identificados:
10
Figura 4: Janela exibindo os cantos detectados no tabuleiro de xadrez.
Figura 5: Comparação entre uma imagem capturada original e sua correspondente com
remoção de distorções.
11
3.2 Projeção de Sistemas de Coordenadas em Imagens
O segundo programa lab04_ex02.py tem como objetivo projetar na imagem dos
padrões de tabuleiro de xadrez sistemas de coordenadas ou cubos que representem a posição
e orientação do objeto com relação ao plano da câmera. Este programa utiliza os dados
gravados em memória da matriz da câmera e coeficientes de distorção para utilizar em suas
próprias operações.
O resultado da projeção de cubos sobre os tabuleiros de xadrez para representar sua
posição e orientação no espaço esá apresentado na Figura 6:
12
Figura 7: Imagens capturadas pelo lado esquerdo e direito em um sistema de captura estéreo.
Figura 8: Projeção das linhas epipolares do sistema de câmeras de acordo com pontos
identificados nas imagens.
13
Figura 9: Imagem da câmera da direita e correspondente mapa de disparidade da cena
capturada.
Para a correta obtenção do mapa de disparidade deste par de imagens, ambas deveriam
passar pelo processo de transformação geométrica ditado pelos coeficientes das matrizes que
relacionam os sistemas de coordenadas das câmeras, para que elas apresentassem suas imagens
em um planos de imagem paralelos. Ou, as câmeras deveriam estar dispostas com seus
eixos ópticos aproximadamente paralelos, para que apenas pequenas correções e distorções
necessitassem ser removidas.
14
4. CONCLUSÕES
15
detecção de bordas e segmentação de objetos são a base para o início de qualquer projeto de
visão computacional e a partir do resultado dessas operações são iniciadas as classificações e
tomadas de decisões de uma aplicação.
16
BIBLIOGRAFIA
[2] Z. Zhang, “A flexible new technique for camera calibration,” IEEE Transactions on Pattern
Analysis and Machine Intelligence, vol. 22, no. 11, pp. 1330–1334, Nov 2000. Citado na
página 4.
[7] ——. (2018, Jul.) Depth map from stereo images. Citado na página 8.
17