Professional Documents
Culture Documents
, da plataforma de
programao Microsoft
e algumas bibliotecas abertas de auxlio anlise de imagens.
Palavras chave: Viso Computacional, Estereoscopia, Kinect
.
ABSTRACT
Although young, the science of computer vision have presented solutions to
numerous problems in the technology industry. Its dynamic enables a significant
reduction in the number of sensors to perform the various procedures. The great
success is mainly due to the proximity of this to the human interpretation of the world,
which mainly uses the sense of sight itself. As cameras and algorithms evolves,
systems that implement this take a much bigger piece of the market. Aiming at this,
this paper presents a method to remodel the three-dimensional environment seen by
two sets of sensors, each of which containing a color camera and other infrared to
measure the depth, in order to create from these a single image with significant gain
in the amount of data which can then return more refined analysis of the data. For
this work relies on the assistance of two Kinect
Visual Studio programming, environmental engineering and calculation Matlab
and
some libraries open to aid image analysis.
Keywords: Machine Vision, Stereo Vision, Kinect
.
Leva tempo para algum ser bem sucedido porque
o xito no mais do que recompensa natural pelo
tempo gasto em fazer algo direito.
(Joseph Ross)
LISTA DE ILUSTRAES
Figura 2.1 - Efeitos da iluminao. ............................................................................ 17
Figura 2.2 - A ocluso (ou obstruo visual) uma boa referncia para calcular o
posicionamento de cada um dos objetos. ................................................................. 17
Figura 2.3 - Representao de um sistema de viso estereoscpica. ...................... 18
Figura 2.4 - Relaes bidimensionais de vizinhana ................................................. 18
Figura 2.5 - Relaes tridimensionais de vizinhana ................................................ 19
Figura 2.6 - Exemplo de imagem monocromtica com diferentes tons de cinza em
cada ponto................................................................................................................. 20
Figura 2.7 - Exemplo de Imagem Binarizada ............................................................ 20
Figura 2.8 - a) Tcnica de Warping. b) Representao de Warping. ......................... 22
Figura 2.9 Exemplos da aplicao de operaes lgicas e aritmticas ................. 22
Figura 2.10 Exemplos de histogramas das mesmas imagens com contraste
diferenciado ............................................................................................................... 23
Figura 2.11 - Comparativo entre regies, linhas e esquinas para o algoritmo de
Moravec..................................................................................................................... 25
Figura 2.12 - Diferena entre ponto e esquina para o operador de Moravec ............ 26
Figura 2.13 - Limitaes do algoritmo de Moravec .................................................... 27
Figura 2.14 - Exemplo de janela gaussiana .............................................................. 27
Figura 2.15 - Demonstrativo da maior preciso do algortimo de Harris (azul) em
relao ao de Moravec (vermelho). ........................................................................... 29
Figura 2.16 - Representao dos eixos utilizados ao longo do trabalho ................... 30
Figura 2.17 - Transformaes geomtricas ............................................................... 31
Figura 2.18 - Regra da mo direita, exemplo para rotao no eixo X. ..................... 32
Figura 2.19 - (a) Cubo original. (b) Cubo com rotao de 35 graus em Y (aresta em
amarelo permanece inalterada). ................................................................................ 33
Figura 2.20 - Projeo dos pontos do mundo real em uma cmera pinhole. Em azul
plano focal. Em cinza plano da cmera. .................................................................... 34
Figura 2.21 Distoro radial. (a) Visvel deformao das linhas retas de um objeto
quadrado. (b) Demonstrao do aumento do efeito conforme nos distanciamos do
ponto principal da cmera (X
p
e Y
p
) em X
d
e Y
d
que deveriam ser projetados em X e
Y respectivamente. .................................................................................................... 35
Figura 2.22 - Ocorrncia da distoro tangencial. Matriz de sensores no
devidamente alinhada com as lentes da cmera ...................................................... 35
Figura 2.23 - (a) Nuvem de Pontos. (b) Imagem original. ......................................... 37
Figura 2.24 - Alinhamento de dois planos de imagem ............................................... 37
Figura 2.25 - Exemplo de figura utilizada em calibrao ........................................... 39
Figura 2.26 - Exemplo de pontos em comum entre duas nuvens de pontos sobre
ngulos diferentes de viso ....................................................................................... 45
Figura 2.27 Vetores em comum formados tomando-se o os pontos em amarelo
como origem, em seguida os verdes e por fim em magenta. .................................... 46
Figura 2.28 - Projeo de um vetor tridimensional .................................................... 46
Figura 2.29 - Procedimento para alinhar o vetor u ao eixo Y. (a) original. (b)
transladado. (c) e (d) rotao no eixo X. (e) e (f) rotao no eixo Z. ......................... 47
Figura 2.30 - Resultado da primeira nuvem de pontos ao final do alinhamento ........ 48
Figura 2.31 - Procedimento de alinhamento do eixo ao eixo Y da segunda nuvem de
pontos. (a) original. (b) transladado. (c) e (d) rotao no eixo X. (e) e (f) rotao no
eixo Z. ....................................................................................................................... 48
Figura 2.32 - Nuvens de ponto comuns alinhadas ao eixo base. .............................. 49
Figura 2.33 - Rotao no eixo base (Y), para alinhar o segundo par de vetores. ..... 49
Figura 2.34 - Nuvens de pontos alinhadas na origem do sistema. ............................ 49
Figura 2.35 - Processo inverso das transformaes aplicadas na primeira nuvem de
pontos. ...................................................................................................................... 50
Figura 2.36 - Sensor Kinect. ................................................................................... 51
Figura 2.37 - Imagem RGB; profundidade; e imagem obtida pelo sensor IR. ........... 51
Figura 2.38 - Comparativo entre trs drivers diferentes e a linearidade da obteno
dos dados de profundidade ....................................................................................... 52
Figura 2.39 - Comparativo entre trs drivers diferentes e a preciso de obteno dos
dados de profundidade .............................................................................................. 53
Figura 3.1 - Fluxograma principal .............................................................................. 54
Figura 3.2 - Cubo mgico .......................................................................................... 56
Figura 3.3 - Obstruo das faces limita a calibrao um nico plano (azul) na
maioria dos casos. .................................................................................................... 57
Figura 3.4 - Demonstrao da diferena de tamanho das arestas e a rea das
regies de uma imagem de calibrao inclinada. ...................................................... 58
Figura 3.5 - Objeto transparente de calibrao. Imagem RGB ( esquerda) e imagem
de profundidade ( direita). ....................................................................................... 58
Figura 3.6 - Algoritmo de Harris, sem ordenamento de pontos. ................................ 59
Figura 3.7 - Deteco de esquinas da biblioteca EmguCV com ordenamento de
pontos. ...................................................................................................................... 60
Figura 3.8 - Esquinas internas do xadrez utilizado na calibrao. ............................. 60
Figura 3.9 - Diferena entre erro mdio e quadrado. ................................................ 64
Figura 3.10 - Pontos utilizados na calibrao stereo (extremidades internas do
xadrez). ..................................................................................................................... 64
Figura 3.11 - Tamanho reduzido da imagem (direita) devido a remoo da distoro
das lentes. ................................................................................................................. 66
Figura 4.1 - Imagens de cor utilizadas na calibrao. ............................................... 71
Figura 4.2 - Imagens de profundidade utilizadas na calibrao. ............................... 72
Figura 4.3 - Esquinas invisveis. a) Imagem de profundidade. b) Imagem real. c) e d)
Detalhamento dos pontos.......................................................................................... 73
Figura 4.4 - Esquinas superdimensionadas. a) Imagem de profundidade. b) Imagem
real. c) e d) Detalhamentos. ...................................................................................... 73
Figura 4.5 - Imagens com grandes pontos de profundidade indeterminveis. .......... 74
Figura 4.6 - Parmetros intrnsecos da cmera 1 de profundidade. .......................... 74
Figura 4.7 - Parmetros intrnsecos da cmera 2 de profundidade. .......................... 74
Figura 4.8 - Coeficientes de Distoro Cmera 1. a) Cmera de Profundidade. b)
Cmera RGB. ............................................................................................................ 76
Figura 4.9 - Distoro Cmera 2. a) Cmera de Profundidade. b) Cmera RGB. ..... 76
Figura 4.10 - Parmetros intrnsecos da cmera de cores. ....................................... 76
Figura 4.11 - Parmetros intrnsecos da cmera 2 de cores. .................................... 77
Figura 4.12 - Nuvem de pontos para calibrao de 30 imagens ............................... 79
Figura 4.13 - Nuvem de pontos para calibrao de 3 imagens. ................................ 79
Figura 4.14 - Sobreposio das nuvens de pontos bem calibrada e mal calibrada
(direita). ..................................................................................................................... 80
Figura 4.15 - Comparativo entre duas nuvens de pontos alinhadas. ........................ 80
Figura 4.16 - Nuvem de pontos da cmera 1 (esquerda) e cmera 2 (direita). ......... 81
Figura 4.17 - Alinhamento das nuvens de pontos. .................................................... 81
Figura 4.18 - Erro de alinhamento em decorrncia da falta de preciso na calibrao.
.................................................................................................................................. 81
Sumrio
1 INTRODUO ............................................................................................... 14
2 FUNDAMENTAO TERICA ..................................................................... 16
2.1 FUNDAMENTOS DE IMAGENS DIGITAIS .................................................... 16
2.2 ESTEREOSCOPIA ......................................................................................... 16
2.3 VIZINHANA .................................................................................................. 18
2.4 CONECTIVIDADE .......................................................................................... 19
2.5 OPERAES ARITMTICAS ........................................................................ 20
2.6 FERRAMENTAS ESTATSTICAS DE ANLISE ............................................. 23
2.7 DETECO DE PONTOS INTERESSANTES ............................................... 24
2.7.1 Deteco de Esquinas de Harris & Stephens ................................................. 25
2.8 SISTEMAS DE COORDENADAS EM IMAGENS .......................................... 30
2.9 TRANSFORMAES GEOMTRICAS ......................................................... 30
2.10 CMERA ESTENOPEICA .............................................................................. 34
2.10.1 Distoro Das Lentes ..................................................................................... 34
2.11 NUVEM DE PONTOS .................................................................................... 36
2.12 HOMOGRAFIA ............................................................................................... 38
2.13 PARMETROS INTRNSECOS E EXTRNSECOS ....................................... 39
2.14 ALINHAMENTO DE IMAGENS ESTEREOSCPICAS TRIDIMENSIONAIS . 45
2.15 SENSOR KINECT
........................................................................................ 50
3 METODOLOGIA ............................................................................................ 54
3.1 AQUISIO DE IMAGENS ............................................................................ 54
3.2 CALIBRAO ................................................................................................ 56
3.3 NUVEM DE PONTOS .................................................................................... 64
3.4 ALINHAMENTO TRIDIMENSIONAL .............................................................. 67
13
4 RESULTADOS E DISCUSSO ...................................................................... 71
4.1 CALIBRAO ................................................................................................ 71
4.2 NUVEM DE PONTOS .................................................................................... 78
4.3 ALINHAMENTO TRIDIMENSIONAL .............................................................. 81
5 CONCLUSO ................................................................................................ 84
5.1 TRABALHOS SUGERIDOS ........................................................................... 85
REFERNCIAS BIBLIOGRFICAS ......................................................................... 87
ANEXO I Alinhamento de duas nuvens de pontos ................................................. 90
ANEXO II Soluo fechada de Zhang .................................................................... 91
ANEXO III Mapeamento por matriz de afinidade ................................................... 92
ANEXO IV Alinhamento interno das cmeras do Kinect
...................................... 93
ANEXO V Algoritmo de Calibrao ........................................................................ 94
ANEXO VI Funes de montagem dos vetores, h, v e matriz V (Captulo 2.12). .. 96
ANEXO VII Algoritmo de alinhamento das nuvens de pontos ................................ 97
ANEXO VIII Matrizes de rotao ............................................................................ 99
ANEXO IX Imagens do software de estudo ......................................................... 101
ANEXO X Funes de obteno e aquisio das imagens ................................. 103
ANEXO XI Rotinas de manipulao da biblioteca SharpGL ................................ 105
ANEXO XII Tabelas de calibrao das cmeras de profundidade ....................... 108
ANEXO XIII Tabelas de calibrao das cmeras de cores .................................. 112
14
1 INTRODUO
Os sistemas de viso computacional so capazes de retornar uma gama
ampla de informaes sobre uma nica imagem, diferentemente dos sensores
tpicos (capacitivos e indutivos por exemplo) que se baseiam em um nico tipo de
dado (cor, composio do material, tamanho, proximidade, etc...) [1].
Existem dispositivos no mercado capazes de retornar simultaneamente os
dados no s de cor e luminosidade de um determinado ponto, mas tambm a que
distncia cada um se encontra do aparelho. o caso, por exemplo, do popular
sensor Kinect
da Microsoft
ou o Microsoft
2
=
(
)
2
( 1)
25
= (
=
Por mais que as imagens estejam inclinadas ou com um determinado nvel de
distoro, as esquinas permanecem intactas [41], por este motivo so amplamente
utilizadas em processos de calibrao e reconstruo estereogrfica de imagens.
Se fossem utilizadas bordas, por exemplo, para obter os parmetros de
calibrao das cmeras, dificilmente obter-se-ia o sucesso visto que as cmeras
comumente apresentam distoro radial e tangencial por efeito das lentes e o
processo de fabricao destas. Assim, uma reta fotografada pela mquina, se
apresentaria de forma ligeiramente curva na imagem resultante [28]. Logo a
deteco de reta nestes casos no de fato o melhor a caminho a se seguir.
Alm do mais, uma esquina facilmente demonstra a transio de uma regio
ou objeto para outro, representando muitas vezes o fim de uma linha, ou a
extremidade de uma regio, sendo, portanto, um ponto especfico da imagem.
2.7.1 Deteco de Esquinas de Harris & Stephens
Moravec props a deteco de esquinas [40] a partir da variao do gradiente
de intensidade na escala de cinza de determinando ponto na imagem com relao a
seus vizinhos dentro de uma janela de tamanho pr-determinado. Na Figura 2.11,
pode-se ver a diferena bsica entre regies, bordas e esquinas.
Fonte: [40], traduzida pelo autor.
Figura 2.11 - Comparativo entre regies, linhas e esquinas para o algoritmo de Moravec
Quando a janela de observao movida para qualquer direo (vertical,
horizontal ou diagonal) se esta estiver dentro de uma regio o gradiente de cores
ter pequena variao. Ao sair desta regio (Figura 2.11b) identificada uma borda,
que possui grande variao de gradiente (G) perpendicular a ela, mas pouca
variao na mesma direo desta [40].
26
2.2
Onde:
G variao de intensidade ao longo da janela
N tamanho da janela e deve ser sempre mpar (3x3, 5x5, 7x7...)
A janela original
B janela movida vertical, horizontal ou diagonalmente
i pixel atual dentro da janela
Por fim, uma esquina localizada quando a variao de gradiente tem grandes
alteraes tanto horizontalmente quanto verticalmente. Na Figura 2.12 para o
primeiro caso se utilizada a equao 2.2 o resultado seria de:
2.3
Enquanto para o segundo caso, onde realmente h uma esquina de um objeto
tm-se como resultado:
2.4
Fonte: [40].
Figura 2.12 - Diferena entre ponto e esquina para o operador de Moravec
Esta funo apesar de simples e prtica apresenta o problema de no
conseguir detectar com eficincia esquinas em bordas que no sejam perfeitamente
horizontais ou verticais, isto significa que qualquer inclinao na imagem capaz de
reduzir significativamente a eficincia deste algoritmo.
Na Figura 2.13, evidenciada a ineficincia de Moravec, uma vez que ao girar
a imagem em 30 o algoritmo no s deixou de detectar alguns pontos de esquina
verdadeiros como tambm passou a detectar uma quantidade muito maior de pontos
falsos de esquina, principalmente na extremidade superior da imagem.
130050 = 255 * 2 = ) B - (A + ) B - (A = G
2 2
7 7
2
5 5
195075 = 255 * 3 = ) B - (A + ) B - (A = G
2 2
7 7
2
5 5
27
=
)
2
=1
Fonte: [40], traduzida pelo autor.
Figura 2.13 - Limitaes do algoritmo de Moravec
Pode-se utilizar ainda uma janela gaussiana (Figura 2.14), para prover
melhores resultados uma vez que a janela de varredura ser feita em crculos,
aumentando o peso do pixel em questo conforme sua proximidade com relao ao
centro da imagem (2.5):
Fonte: [40].
Figura 2.14 - Exemplo de janela gaussiana
Logo a frmula passa a ser:
2.5
Onde:
w o peso do pixel neste ponto da janela
Ex.: w(13) = 0.15
Harris & Stephens propuseram ento a expanso do mtodo [40][41] de
Moravec com a utilizao do gradiente de intensidade da imagem.
Mscara horizontal:
28
= [1 0 1]
(, )
[ ( +1, ) ( 1, )] = (, )
= [1 0 1]
(, )
[ (, 1) (, + 1)] = (, )
=
0 0 1
0 0 0
1 0 0
(, )
=
(, )
=
(, )
(, ) (, )
)
2
=1
)
2
=1
2.6
2.7
Mscara vertical:
2.8
2.9
Mscara diagonal:
2.10
2.11
Onde:
I intensidade do pixel
x linha da janela de pixels
y coluna da janela de pixels
operador gradiente
operador convoluo
Segundo os mesmos este gradiente pode ser aproximado pela seguinte
frmula:
2.12
Logo:
2.13
Onde:
i pixel atual dentro da janela
N tamanho da janela
A principal diferena entretanto de Moravec e Harris, que o segundo mtodo
obtm a auto-correlao de intensidade dos pixels em todas as direes
simultaneamente:
(, )
[ ( 1, 1) ( +1, +1)] = (, )
29
,
(, ) =
)
2
=1
=
(
2
2
+2
+
2
2
)
=1
,
(, ) =
2
+2 +
2
= [ ]
(
v
u
(
=
B C
C A
M
2.14
2.15
Substituindo os gradientes por coeficientes:
A =
B =
C =
2.16
2.17
Onde:
2.18
Pode-se solucionar a matriz acima da equao (x) atravs da obteno dos
auto-vetores. Entretanto, o processamento demasiadamente demorado para se
obter os auto-vetores a partir de um algoritmo de SVD (Singular Value
Decomposition Decomposio em Valores Singulares), da surge uma segunda
alternativa capaz de aproximar os mesmos valores, sugerida por Harris representado
na (Figura 2.15):
2.19
Onde:
M matriz 2x2, derivadas de intensidade do ponto
k constante surgerida por Harris (entre 0,04 e 0,06)
det determinante da matriz
trace soma da diagonal principal da matriz
Fonte: [40].
Figura 2.15 - Demonstrativo da maior preciso do algortimo de Harris (azul) em relao ao de
) ( . ) det(
2
M trace k M R =
30
Moravec (vermelho).
Esta funo est implementada na biblioteca EmguCV, bem como uma
variao especial dela para obter apenas as esquinas internas de um xadrez desde
que conhecida a quantidade de pontos internos a este, ignorando os demais [28].
2.8 SISTEMAS DE COORDENADAS EM IMAGENS
As imagens podem ser representadas em qualquer sistema de coordenadas
existente, entretanto comum se adotar o sistema de coordenadas homogneas
que apresentam algumas vantagens com relao ao processamento algbrico
destas.
Em coordenadas homogneas, existe um elemento adicional s coordenadas
cartesianas que representa um fator de escala w. Assim, um ponto determinado por
(x, y, z) passa a ser representado por (w.x, w.y, w.z, w), um vetor do tipo coluna [33].
Este sistema possibilita a combinao de vrias transformaes geomtricas
em uma quantidade menor de processos, o que reduz significativamente a
quantidade de clculos necessrios para se atingir o objetivo [33].
Os eixos X, Y e Z adotados durante todo o trabalho correspondem aos
demonstrados na Figura 2.16.
Fonte: o autor.
Figura 2.16 - Representao dos eixos utilizados ao longo do trabalho
2.9 TRANSFORMAES GEOMTRICAS
Existem trs transformaes bsicas, muito utilizadas no processamento de
imagens, so elas: rotao, translao e escalonamento (Figura 2.17). Estas
transformaes diferem das outras possveis por preservarem o ngulo entre retas.
31
| |
T
z y x
t t t T 1 =
| |
T
z y x o transladad
t Z t Y t X P + + + =
As duas primeiras ainda preservam outras propriedades como: distncia entre
pontos, esquinas, reas e volumes.
Fonte: [33].
Figura 2.17 - Transformaes geomtricas
A translao a simples movimentao da imagem de um ponto no espao a
outro [33]:
2.20
2.21
Onde:
t
x
, t
y
e t
z
- correspondem a distncia de translao no eixo X, Y e Z
respectivamente
T - indica um vetor transposto
Para facilitar composio de transformaes a translao pode ser
representada na forma de matriz homognea:
2.22
J a rotao representada na forma de uma matriz cujos valores de
transformao so baseados no seno e cosseno do ngulo () que se deseja
rotacionar a imagem naquele eixo, enquanto os demais conservam os valores atuais
[33].
As matrizes de rotao correspondentes aos eixos do sistema cartesiano
utilizado neste trabalho (Figura 2.16) so apresentadas abaixo (equaes 2.23, 2.24
(
(
(
(
=
1 0 0 0
1 0 0
0 1 0
0 0 0
z
y
x
t
t
t
T
32
(
(
(
(
=
1 0 0 0
0 1 0 0
0 0 cos
0 0 cos
o o
o o
sen
sen
R
z
(
(
(
(
=
1 0 0 0
0 cos 0
0 0 1 0
0 0 cos
o o
o o
sen
sen
R
y
(
(
(
(
=
1 0 0 0
0 cos 0
0 cos 0
0 0 0 1
o o
o o
sen
sen
R
x
e 2.25).
2.23
2.24
2.25
Fora convencionado o sentido de rotao anti-horrio, seguindo a regra da
mo direita (Figura 2.18), em que alinhado o polegar direito ao eixo de rotao e
apontado para sentido positivo deste, assim o sentido de rotao ser o mesmo que
o eixo normal palma da mo [34].
Fonte: [35].
Figura 2.18 - Regra da mo direita, exemplo para rotao no eixo X.
Estas transformaes so aplicadas em uma imagem multiplicando cada um
dos pontos pelas mesmas. Desta forma, se mais do que uma matriz de
transformao for utilizada, o processo se tornar bastante dispendicioso do ponto
de vista do processamento como citado anteriormente. Para sanar o problema,
pode-se unir previamente cada uma das transformaes a uma nica matriz de
homognea capaz de realizar todos os passos em um s. Faz-se isso multiplicando
estas na ordem em que aparecem, j que a multiplicao entre matrizes
33
assimtricas no possuem comutatividade, ou seja, a ordem dos fatores altera o
produto final.
Assim, ao invs de fazer uma varredura pelos pontos da imagem para cada
transformao, faz-se uma nica para um conjunto de transformaes [33].
Logo, a composio de uma rotao e uma translao tem dois resultados
possveis:
2.26
2.27
Vale ressaltar ainda, que as rotaes em um eixo especfico somente iro
alterar as coordenadas dos pontos nos demais eixos, exceto no caso em que o vetor
rotacionado esteja alinhado com este, logo suas coordenadas permanecero
inalteradas. Por exemplo, para a rotao de um cubo, se uma das arestas estiver
alinhada ao eixo Y esta independente da rotao neste eixo, possuir as mesmas
coordenadas para todos os pontos que envolvem, mas o mesmo no pode ser dito
para as demais arestas do cubo como na Figura 2.19.
Fonte: o autor.
Figura 2.19 - (a) Cubo original. (b) Cubo com rotao de 35 graus em Y (aresta em amarelo
permanece inalterada).
(
(
(
(
=
1 0 0 0
cos 0
0 1 0
0 cos
.
z
y
x
y
t sen
t
t sen
R T
o o
o o
(
(
(
(
+
=
1 0 0 0
. cos . cos 0
0 1 0
. cos . 0 cos
.
o o o o
o o o o
sen t t sen
t
sen t t sen
T R
x z
y
z x
y
34
2.10 CMERA ESTENOPEICA
O modelo de cmera estonepeica ou como comumente conhecida, cmera
pinhole, consiste num aparato de abertura muito pequena para a entrada de luz [24],
fazendo cada um dos feixes provenientes do ambiente visualizado convergirem para
um nico ponto cada um deles no plano focal da cmera. Em circunstncias
contrrias, aonde a abertura do aparato fosse maior, diversos feixes de luz
provenientes de pontos diferentes da imagem seriam projetados sobre o mesmo
ponto da matriz de sensores da cmera, o que causaria a sobreposio de cores e
consequentemente uma imagem borrada.
Devido pequena abertura para a entrada de luz, se faz necessria a
utilizao de uma lente parablica a frente desta abertura para aumentar o campo
de viso [26]. Uma lente ideal capaz de convergir todos os feixes de luz para um
nico ponto na abertura da cmera.
Fonte: [27], traduzida pelo autor.
Figura 2.20 - Projeo dos pontos do mundo real em uma cmera pinhole. Em azul plano focal. Em
cinza plano da cmera.
Pode-se na ver na Figura 2.20 que ao passarem pelo ponto de abertura da
cmera estes so projetados de forma inversa imagem capturada, isso se d
devido a disposio dos elementos.
2.10.1 Distoro Das Lentes
As lentes independentemente da qualidade do processo de fabricao e
montagem das cmeras, no so perfeitas, e sendo assim possuem um formato que
se aproximam ligeiramente de uma esfera [28], ao invs de uma perfeita parbola.
Isto causa um efeito de distoro na imagem projetada [29], e quanto mais distante o
35
ponto projetado estiver do centro da cmera, mais distorcido este ser. Assim, uma
linha reta registrada pela cmera prxima ao centro ptico pode ser fielmente
reproduzida na imagem, porm quanto mais distante do centro da mesma, mais
curva esta linha se tornar [29] conforme visto na Figura 2.21. Este efeito
conhecido como distoro radial.
Fonte: [28], traduzida pelo autor. Fonte: [29].
Figura 2.21 Distoro radial. (a) Visvel deformao das linhas retas de um objeto quadrado. (b)
Demonstrao do aumento do efeito conforme nos distanciamos do ponto principal da cmera (X
p
e
Y
p
) em X
d
e Y
d
que deveriam ser projetados em X e Y respectivamente.
Outro elemento de distoro muito comum a distoro tangencial [28] que
ocorre devido ao erro de alinhamento das lentes em relao ao plano de imagem
(Figura 2.22).
Fonte: [28], traduzida pelo autor
Figura 2.22 - Ocorrncia da distoro tangencial. Matriz de sensores no devidamente alinhada com
as lentes da cmera
Apesar de existirem outros elementos capazes de distorcer a imagem
capturada por uma cmera, as distores radial e tangencial, so as que
apresentam um maior efeito sobre o resultado final [28], alm de serem facilmente
36
= (
)
2
+(
)
2
corrigidos se conhecidos os coeficientes que regem essa distoro.
Sendo r (equao 4), a distncia a partir do ponto central da cmera at o
ponto desejado que se est mensurando:
2.28
Onde:
x pixels horizontais
y pixels verticais
x
p
ponto horizontal do centro da cmera
y
p
ponto vertical do centro da cmera
A distoro radial pode ser corrigida pelas equaes2.29 e 2.30 abaixo [28]:
2.29
2.30
Enquanto a distoro tangencial corrigida pelas equaes 2.31 e 2.32 [28]:
2.31
2.32
Pode-se ainda mesclar as equaes de ambos os efeitos a fim de obter uma s
frmula para correo dos efeitos de distoro das lentes, equao 2.33 para x e
equao 2.34 para y:
2.33
2.34
2.11 NUVEM DE PONTOS
A nuvem de pontos a representao dos pixels existentes em uma imagem
plana em outra imagem tridimensional com valores de posicionamento condizentes
com o observado, assim tem-se uma reconstruo do ambiente visualizado pela
cmera.
) 1 (
6
3
4
2
2
1
r k r k r k y y
corrigido
+ + + =
) 1 (
6
3
4
2
2
1
r k r k r k x x
corrigido
+ + + =
)] 2 ( 2 [
2 2
2 1
x r p y p x x
corrigido
+ + + =
] 2 ) 2 ( [
2
2 2
1
x p y r p y y
corrigido
+ + + =
) 2 ( 2 ) 1 (
2 2
2 1
6
3
4
2
2
1
x r p xy p r k r k r k x x
corrigido
+ + + + + + =
xy p y r p r k r k r k y y
corrigido 2
2 2
1
6
3
4
2
2
1
2 ) 2 ( ) 1 ( + + + + + + =
37
Fonte: [30].
Figura 2.23 - (a) Nuvem de Pontos. (b) Imagem original.
Na Figura 2.23a possvel ver esta nuvem de pontos, que pode ser obtida de
diversas formas, seja com a obteno de uma sequncia de imagens por pontos de
vista diferentes, a utilizao de mais de uma cmera [31], ou cmeras com
elementos sensores capazes determinar a profundidade de um determinado ponto
no espao [32], como o caso do sensor Kinect
1
,
2
fatores de escala
(
(
(
=
33 23 13
32 22 12
31 21 11
h h h
h h h
h h h
H
1 2
HX X =
1 1 1
X x =
2 2 2
X x =
1 1 2 2
x H x =
39
1
,
2
pontos no plano de imagem
Assumindo um fator de escala igual a 1 para ambos os casos, pode-se
deduzir a seguinte frmula:
2.40
Atravs da equao 15, tm-se a matriz H como a matriz capaz de
transformar os pontos reais do ambiente fotografado por uma cmera nos pontos do
plano de imagem desta, os pixels.
O caminho inverso [36], capaz de mapear os pontos reais a partir de uma
imagem qualquer possvel atravs da inversa da matriz homogrfica:
2.41
2.13 PARMETROS INTRNSECOS E EXTRNSECOS
Diz-se que h uma cmera calibrada, quando descobertos os coeficientes de
foco [28][42], ponto central e distoro da mesma.
Estes dados podem ser obtidos atravs da correta manipulao da matriz
homogrfica que alinhe os pixels da cmera ao sistema de coordenadas desejado.
Para tanto, diversas tcnicas foram desenvolvidas, e uma das mais utilizadas
envolve a utilizao de uma superfcie plana com um quadriculado estampado sobre
ela, similar a um tabuleiro de xadrez, como o exemplo a seguir:
Fonte: o autor
Figura 2.25 - Exemplo de figura utilizada em calibrao
Independente da posio que o plano de calibrao (Figura 2.25) que se
encontre em relao cmera, as suas formas so facilmente detectveis e a sua
simetria permite calcular com a mesma facilidade a relao entre os pontos reais de
um objeto (se previamente conhecidos) e a imagem gerada pela cmera.
1 2
HX x =
2
1
1
x H X
=
40
A matriz homogrfica pode ser divida em duas matrizes separadas de
transformao [42]:
2.42
Onde:
A matriz de afinidade
R matriz 3x3 de rotao
t vetor de translao
s fator de escala
A matriz de afinidade (equao 2.43) contm os parmetros intrnsecos
necessrios para calibrar a cmera.
2.43
Onde:
f
x
distncia focal horizontal (x)
f
y
distncia focal vertical (y)
skewness
u
p
ponto principal horizontal (x)
v
p
ponto principal vertical (y)
Enquanto a matriz de posicionamento, formada pelos parmetros de rotao e
translao a princpio uma matriz 4x4 (equao 2.44), que pode ser resumida em
uma matriz 3x3 (equao
2.45) eliminando-se a rotao em torno do eixo de profundidade (por
conveno eixo Z) e assim admitindo-se que o plano de calibrao corresponde ao
plano normal este eixo, ou seja, o plano formado pelos eixos horizontal (X) e
vertical (Y):
2.44
2.45
| |
1 2
X t R A sx =
(
(
(
=
1 0 0
0
p y
p x
v f
u f
A
| |
(
(
(
(
=
(
(
(
1
0
1
3 2 1
Y
X
t r r r A y
x
s
| |
(
(
(
=
(
(
(
1 1
2 1
Y
X
t r r A y
x
s
41
| | t r r A H
2 1 1
=
| | | | t r r A h h h
2 1 1 3 2 1
=
1
1
1
1 1 1 1
1
h A r Ar h
ou
= =
2
1
1
2 2 1 2
1
h A r Ar h
ou
= =
3
1
1
1 3
1
h A t At h
ou
= =
0
2 1
= r r
T
2 2 1 1 2 1
r r r r r r
T T ou
= =
T T T
a b ab . ) ( =
( ) ( ) 0 .
2
1
1
1
=
h M h M
T
A M para
1
1
:
=
0
1
.
1
2
1
1
1
1
1
=
(
(
|
|
.
|
\
|
|
|
.
|
\
|
h A h A
T
Se comparada a equao 2.42 equao 2.39, observa-se que s o mesmo
que a unio dos fatores de escala
1
e
2
(equao 2.46):
2.46
Logo, por semelhana [42] pode-se afirmar que a matriz homogrfica equivale
a ao conjunto de transformao formado pelas matrizes de afinidade, rotao e o
vetor de translao:
2.47
2.48
Da equao 2.48 derivam as equaes a seguir [28]:
2.49
2.50
2.51
Os eixos estabelecidos so ortogonais, portanto as rotaes especificadas
por r
1
e r
2
devem obrigatoriamente ser ortonormais [42]. Desta forma, o produto
escalar entre os dois vetores de rotao igual zero (equao 2.52). Bem como a
intensidade dos vetores deve ser a mesma (equao 2.53).
2.52
2.53
Se:
2.54
Sendo a e b dois vetores quaisquer, ento substituindo os vetores r
1
e r
2
pelas
equaes 2.49 e 2.50 respectivamente, obtm-se segundo a equao 2.52 que:
2.55
2.56
1 2
1
2
Hx x =
42
0
2
1
1
=
h M M h
T T
(
(
(
= =
33 23 13
32 22 12
31 21 11
1
B B B
B B B
B B B
M M B
T
(
(
(
(
(
(
(
(
+ +
=
1
) ( ) (
) (
1
1
2
2
2 2
2
2 2 2 2
2 2 2 2 2 2 2
2 2 2
y
p
y x
y p p
y
p
y x
y p p
y x
y p p
y
p
y x
y p p
y y x y x
y x
y p p
y x x
f
v
f f
f u u
f
v
f f
f u u
f f
f u u
f
v
f f
f u u
f f f f f
f f
f u u
f f f
B
(
(
(
= =
33 23 13
23 22 12
13 12 11
1
B B B
B B B
B B B
M M B
T
( ) ( ) ( ) ( )
2
1
2
1
1
1
1
1
. . h M h M h M h M
T T
= A M para
1
1
:
=
(
(
|
|
.
|
\
|
|
|
.
|
\
|
=
(
(
|
|
.
|
\
|
|
|
.
|
\
|
2
1
1
2
1
1
1
1
1
1
1
1
1
.
1 1
.
1
h A h A h A h A
T T
2
1
2 1
1
1
h M M h h M M h
T T T T
=
0
2
1
2 1
1
1
=
h M M h h M M h
T T T T
2.57
E segundo a equao 2.53 que representa outra propriedade de vetores
ortonormais [42]:
2.58
2.59
2.60
Ou ainda:
2.61
Zhang apresentou uma soluo [42] para o conjunto M
-T
M
-1
:
2.62
2.63
Analisando a matriz B (equao 2.63), fcil observar que se trata de uma
matriz simtrica, ou seja: B
21
= B
12
; B
31
= B
13
; e B
32
= B
23
. Logo a matriz da equao
2.64 pode ser resumida pelo vetor b (equao 2.65) atravs da fatorizao de
Cholesky:
2.64
43
(
(
(
(
(
(
(
(
=
33
23
13
22
12
11
B
B
B
B
B
B
b
i
T
j j
T
i
Bh h Bh h =
b v Bh h Bh h
T
ij i
T
j j
T
i
= =
T
T
j i
j i j i
j i j i
j i
j i j i
j i
T
ij
B
B
B
B
B
B
h h
h h h h
h h h h
h h
h h h h
h h
b v
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
+
+
+
=
33
23
13
22
12
11
3 3
3 2 2 3
3 1 1 3
2 2
1 2 2 1
1 1
( )
0 = =
(
(
Vb b
v v
v
T
jj ii
T
ij
2.65
Logo, a equao 2.53 passa a ser:
2.66
Onde e i e j so colunas da matriz homogrfica.
Devido a simetria de B, a equao pode ser rearranjada de forma a unir os
vetores h
i
T
e h
j
e substituir a matriz simtrica B pelo vetor de 6 dimenses b da
equao 2.65. Assim, a equao 2.66 simplificada na equao abaixo:
2.67
2.68
Onde:
v
ij
T
equivale a h
i
T
.h
j
Assim utilizando as equaes 2.57 e 2.61, chega-se finalmente ao vetor V.
2.69
44
2
12 22 11
23 11 13 12
B B B
B B B B
v
p
=
( )
11
23 11 13 12
2
13
33
B
B B B B v B
B
p
+
=
11
B
f
x
=
2
12 22 11
11
B B B
B
f
y
y x
f f B
2
12
=
2
13 x
y
p
p
f B
f
v
u =
Onde:
V matriz 2n
x
6 em que n indica a quantidade de homografias utilizadas para
solucionar a funo.
Assim, para se encontrar os parmetros intrnsecos da cmera que
correspondem a matriz simtrica B, basta encontrar os coeficientes que solucionam
o vetor b. Entretanto, para encontrar todos os 6 coeficientes, se faz necessria a
incluso de mais duas homografias na matriz V.
Com apenas duas imagens (ou seja, duas homografias) e assumindo o
skewness como sendo igual a zero, pode-se adicionar o vetor [0, 1, 0, 0, 0, 0]
matriz V possibilitando assim encontrar a soluo para b. Mas, uma soluo eficiente
s ser encontrada se uma grande quantidade homografias for utilizada,
minimizando os erros j que a soluo encontrada atravs de um algoritmo de
aproximao do resultado, denominado SVD (Single Value Decomposition
Decomposio de Valor Singular), que ir associar os auto-vetores de V
T
V ao menor
auto-valor destes [28].
Isolando ento os valores da matriz B tm-se as equaes a seguir:
2.70
2.71
2.72
2.73
2.74
2.75
Onde:
corresponde ao fator de escala
45
2 1 3
r r r =
Aps a obteno da matriz de afinidade, pode-se utilizar as equaes
anteriores para obtermos os vetores r
1
, r
2
e t, enquanto r
3
definido como sendo o
vetor ortogonal a r1 e r2 [42]:
2.76
Seja qual for o objeto de calibrao utilizado, deve-se considerar uma
quantidade mnima de pontos comuns entre cada imagem durante o processo.
2.14 ALINHAMENTO DE IMAGENS ESTEREOSCPICAS TRIDIMENSIONAIS
Uma vez apresentadas as transformaes geomtricas no Captulo 2.9
possvel alinhar duas nuvens de pontos obtidas sobre pontos de vistas diferentes.
Conhecendo pontos em comum entre ambas as nuvens (Figura 2.26), deve-
se primeiramente decidir qual ser o ponto de origem do sistema. O mais comum
adotar o prprio ponto de origem destas, e obter o vetor de translao de um ponto
interessante em comum entre estas at a origem.
Fonte: o autor.
Figura 2.26 - Exemplo de pontos em comum entre duas nuvens de pontos sobre ngulos diferentes
de viso
Um dos mtodos mais rpidos de fazer o clculo, tendo um ponto em comum
destas nuvens de pontos j na origem do sistema de coordenadas escolhido,
calcular o ngulo de rotao entre outros pontos em comum a partir da origem.
Em outras palavras, cada ponto interessante de cada uma das imagens
servir de base para um vetor [44] com incio na origem. Assim, ao invs de termos
pontos em comum, temos agora vetores em comum.
46
v u
v u.
cos = u
Fonte: o autor.
Figura 2.27 Vetores em comum formados tomando-se o os pontos em amarelo como origem, em
seguida os verdes e por fim em magenta.
As rotaes como j citadas anteriormente so facilmente obtidas desde que
realizadas em um plano de cada vez, ou seja, mais fcil rotacionar um vetor de
duas dimenses do que um vetor de trs [34].
Para aproveitar esta praticidade, faz-se a rotao dos vetores em um eixo por
vez, assim ao invs de considerarmos o vetor tridimensional para o clculo do
ngulo em determinado plano, podemos considerar apenas a projeo destes sobre
este plano [34] e posteriormente aplicar a rotao ao vetor tridimensional (Figura
2.28).
Fonte: o autor.
Figura 2.28 - Projeo de um vetor tridimensional
Na Figura 2.28 o vetor u a projeo do vetor u no plano Y
1
. Neste caso, o
vetor de projeo possui intensidade nula no eixo Y j que est sobre o prprio plano
deste, mas mantm os valores dos demais eixos.
O ngulo entre dois vetores bidimensionais determinado pelo arco cosseno
do: produto escalar entre os dois vetores dividido pelo produto da magnitude [44] de
cada um destes (equao 2.78):
2.77
1
Plano perpendicular ao eixo Y, nada mais do que o plano formado pelos eixos X e Z.
47
|
|
.
|
\
|
=
v u
v u.
cos
1
u
2.78
Onde:
u e v vetores bidimensionais
ngulo ()
Para se alinhar dois conjuntos de pontos bidimensionais, basta apenas um
vetor em comum de cada, enquanto para alinhar dois conjuntos de pontos
tridimensionais so necessrios dois pares de vetores, e assim por diante.
Neste caso, com apenas dois vetores pode-se alinhar as nuvens de pontos,
aonde apenas trs pontos so necessrios para obter esses dois vetores, em que o
primeiro, movido para a origem servir de base para os demais.
Entretanto, por se tratar de um alinhamento tridimensional a partir de rotaes
bidimensionais (com o intuito de simplificar o desenvolvimento), se faz necessrio
que um dos vetores do par de nuvens base
2
do alinhamento esteja alinhado a um
dos eixos do sistema de coordenadas [34]. Isso ocorre porque ao rotacionar um dos
vetores, os outros so movidos juntamente com este caso no estejam alinhados ao
mesmo eixo da rotao como j fora demonstrado no captulo 2.9 e evidenciado na
figura Figura 2.19b do mesmo.
Fonte: o autor.
Figura 2.29 - Procedimento para alinhar o vetor u ao eixo Y. (a) original. (b) transladado. (c) e (d)
rotao no eixo X. (e) e (f) rotao no eixo Z.
2
Nuvem de pontos da cmera que permanecer esttica, enquanto a outra que deve ser movida e
rotacionada para se alinhar a ela.
48
Para alinhar um vetor a um eixo do sistema (Figura 2.29), so necessrias
duas rotaes nos demais eixos do sistema tridimensional. Assim, se o objetivo
alinhar um vetor ao eixo Y, deve-se fazer primeiramente a rotao necessria no
eixo X ou Z e em seguida a rotao necessria dos novos pontos no eixo
remanescente (Figura 2.30).
Fonte: o autor.
Figura 2.30 - Resultado da primeira nuvem de pontos ao final do alinhamento
A segunda nuvem de pontos segue o mesmo procedimento com o vetor em
comum quele alinhado a um dos eixos do sistema (Figura 2.31).
/
Fonte: o autor.
Figura 2.31 - Procedimento de alinhamento do eixo ao eixo Y da segunda nuvem de pontos. (a)
original. (b) transladado. (c) e (d) rotao no eixo X. (e) e (f) rotao no eixo Z.
Na sequncia os pontos dessa segunda nuvem so novamente rotacionados
(Figura 2.32 e Figura 2.33), porm no eixo adotado anteriormente como base e em
funo do ngulo entre os outros dois vetores em comum formado o plano
perpendicular a este eixo.
49
Fonte: o autor.
Figura 2.32 - Nuvens de ponto comuns alinhadas ao eixo base.
Fonte: o autor.
Figura 2.33 - Rotao no eixo base (Y), para alinhar o segundo par de vetores.
Ao final, deve-se obter dois vetores alinhados ao eixo base e portanto entre si,
enquanto os outros dois estaro alinhados entre si mas no necessariamente a
outro eixo do sistema, porm o alinhamento est concludo (Figura 2.34).
Fonte: o autor.
Figura 2.34 - Nuvens de pontos alinhadas na origem do sistema.
Dependendo dos pontos tomados como referncia, a necessidade de se
rotacionar e mover a primeira nuvem de pontos faz com que os sistemas apesar de
alinhados estejam fora dos pontos reais obtidos pela cmera. Deste modo,
necessrio fazer o caminho inverso dos procedimentos realizados sobre a primeira
nuvem de pontos, para ambas as nuvens, e teremos estas nuvens alinhadas e nos
pontos reais ao sistema de coordenadas utilizado.
50
Para desfazer uma transformao geomtrica [34][42], basta aplicar a inversa
da transformao original. E neste caso, necessrio retornar de duas rotaes
comeando pela ltima (Figura 2.35), depois a primeira e por fim retornar ao ponto
original da nuvem atravs da inversa da translao.
Fonte: o autor.
Figura 2.35 - Processo inverso das transformaes aplicadas na primeira nuvem de pontos.
Vale lembrar que estas transformaes podem ser mescladas em uma nica
transformao desde que sejam aplicadas na ordem em que ocorrem.
O fluxograma resumindo o procedimento encontra-se no Anexo I.
2.15 SENSOR KINECT
Kinect um dispositivo criado pela Microsoft primeiramente com o objetivo
exclusivo de servir como sensor para interagir com o console de videogame Xbox
360 (tambm de propriedade desta), substituindo os controles convencionais.
Com isto os comandos passaram a ser enviados segundo movimentos do jogador e
no mais pela combinao do pressionar de teclas.
Entretanto aps a popularizao deste hardware em outras aplicaes que
no envolvessem o console de videogame, a Microsoft desenvolveu uma biblioteca
aberta para facilitar a criao de aplicativos com uso do Kinect.
Fonte: [3].
51
Figura 2.36 - Sensor Kinect.
O conjunto possui dois receptores, sendo um deles uma cmera do padro
RGB de imagens (Figura 2.36.2) e o outro uma cmera sensvel ao infravermelho
(IR) para capturar os pontos projetados por seu terceiro componente, um emissor de
raios infravermelho. Os demais componentes do sensor representados na Figura
2.36 por 3 e 4, referem-se especificamente ao conjunto de microfones, e inclinao
mecanizada [3].
Diferentemente das cmeras utilizadas para esta funo de varredura de
profundidade de pontos no espao que utilizam os sistemas conhecidos como ToF
Time of Flight (tempo de voo em portugus), o Kinect
j associado a ela
(reconhecido pelo driver, linha 3), ento adota-se o primeiro sensor como sendo o
referente aos Dados1 (linha 5), e caso exista mais do que 1 (linha 10) disponvel o
sensor seguinte ser associado a classe Dados2 (linha 12).
Verifica-se o status de cada um destes para evitar a quebra do sistema por
utilizao indevida (linhas 6 e 13), por exemplo enquanto o sensor no estiver
energizado com a fonte externa, se tudo estiver como o esperado inicializa, caso
contrrio retorna mensagem informando o tipo de erro encontrado (linhas 9 e 16).
O cdigo fonte das principais funes utilizadas pelo programa se encontra no
Anexo IX.
Entretanto, alguns cuidados devem ser tomados que envolvem principalmente
a iluminao do ambiente. Qualquer fonte luminosa que emita grande quantidade de
luz infravermelha pode afetar a preciso das imagens de profundidade do Kinect
j
que este interpreta os dados de um sensor infravermelho para retornar estes dados.
Os objetos que pretendem ser visualizados na imagem devem estar a uma
distncia maior que 0,8 metros e menor que 3,5 metros, que a distncia de
operao do sensor de profundidade para o driver utilizado.
Por fim os objetos que forem utilizados na calibrao devem obedecer os
limites de preciso da cmera, sendo este em torno de 3 mm nos sentidos de altura
e comprimento, e em mdia de 1 cm para a profundidade.
As imagens obtidas para estudo utilizaram elementos dispostos no ambiente de
56
forma a dar maior contraste aos pontos interessantes a este, utilizando muitas vezes
de fundo de cor nica e facilmente distinguvel um nico objeto visvel a elas, o
objeto de calibrao.
3.2 CALIBRAO
Esta etapa do processo consiste na obteno dos parmetros intrnsecos e
extrnsecos do Kinect
.
O ltimo passo a obteno da rotao e translao entre as duas cmeras
do sensor Kinect
.
Primeiramente a distoro das lentes deve ser removida de ambos os
sensores.
A funo abaixo utiliza as imagens originais, o vetor com os coeficientes de
distoro (k1, k2, p1, p2, k3 nesta ordem) e a respectiva matriz de afinidade.
feita uma varredura por todos os pixels da imagem, os pixels so primeiramente
definidos como pretos (linha 18) e posteriormente caso a posio corrigida seja
65
maior que 0 (linha 30) e esteja dentro dos limites da imagem (linha 31), sobrescrito
este pixel com a cor original para o ponto (linha 33 e 34).
1. public static Bitmap RemoverDistorcao(Bitmap original, double[] CoeffsDistorcao,
double[,] MatrizAfinidade)
2. {
3. double fx = MatrizAfinidade[0, 0];
4. double fy = MatrizAfinidade[1, 1];
5. double x0 = MatrizAfinidade[0, 2];
6. double y0 = MatrizAfinidade[1, 2];
7. double k1 = CoeffsDistorcao[0];
8. double k2 = CoeffsDistorcao[1];
9. double p1 = CoeffsDistorcao[2];
10. double p2 = CoeffsDistorcao[3];
11. double k3 = CoeffsDistorcao[4];
12. Bitmap resultado = new Bitmap(original); // instancializa nova imagem
13. for (int yd = 0; yd < original.Height; yd++) // varre por todo o eixo Y
14. {
15. double y = (yd - y0)/fy, y2 = y*y; // reprojeo ao ponto real de Y
16. for (int xd = 0; xd < original.Width; xd++) // varre por todos os pixels
17. {
18. resultado.SetPixel(xd, yd, Color.Black); // estabelece este ponto da
imagem primeiramente como preto
19. // ponto real de X no espao
20. double x = (xd - x0)/fx,
x2 = x*x,
r2 = x2 + y2,
_2xy = 2*x*y;
21. // quantidade de distoro radial
22. double kr = 1 + ((k3*r2 + k2)*r2 + k1)*r2;
23. // correo de X e Y
24. double _x = fx*(x*kr + p1*_2xy + p2*(r2 + 2*x2)) + x0;
25. double _y = fy*(y*kr + p1*(r2 + 2*y2) + p2*_2xy) + y0;
26. // arredondamento, Bitmaps s aceitam indices inteiros
27. int xp = (int)Math.Floor(_x + 0.5);
28. int yp = (int)Math.Floor(_y + 0.5);
29. // se estiver dentro dos limites da imagem, estabelecer a nova cor
30. if ((xp > 0) && (yp > 0))
31. if ((xp < original.Width) && (yp < original.Height))
32. {
33. Color cor = original.GetPixel(xp, yp);
34. resultado.SetPixel(xd, yd, cor);
35. }
36. }
37. }
38. return resultado;
39. }
Em resumo, os pixels da imagem so alinhados com o sistema de
coordenadas original, calculada a correo de distoro e reprojetados cmera.
Removida a distoro de ambas as imagens feito o mapeamento dos pixels
66
de cor aos de profundidade.
As imagens so cortadas, de forma a eliminar as extremidades reduzidas
(Figura 3.11) pela distoro.
Fonte: o autor.
Figura 3.11 - Tamanho reduzido da imagem (direita) devido a remoo da distoro das lentes.
RGBD uma classe criada para armazenar simultaneamente o ponto 3D e a
cor deste.
Atravs da matriz de afinidade do sensor de profundidade (linhas 3, 4, 5 e 6 do
algoritmo a seguir), o ponto na imagem mapeado at o ponto original da cmera
(linhas 8 e 9), e retornado com a profundidade j conhecida por este sensor (linhas 7
e 10).
1. private Point3D uvToXYZ(PointF xy, double[,] CameraDepthMatrix, int[,] mapDepth)
2. {
3. double fx = CameraDepthMatrix[0, 0];
4. double fy = CameraDepthMatrix[1, 1];
5. double cx = CameraDepthMatrix[0, 2];
6. double cy = CameraDepthMatrix[1, 2];
7. double Z = Profundidade(xy, mapDepth); // macro para retornar a
profundidade de determinado ponto, faz o arredondamento do ponto
especificado, e traduz as cores da imagem de profundidade em valores
inteiros
8. double X = (xy.X - cx) * Z / fx; // X no sistema de coordenadas real
9. double Y = (xy.Y - cy) * Z / fy; // Y no sistema de coordenadas real
10. return new Point3D(X, Y, Z); // novos X e Y associados a Z, que j
representa o valor real
11. }
Aps, com o auxlio do Matlab
, que plota
pontos no espao cada qual com sua cor e tamanho determinados. Deste modo
fcil visualizar a localizao de cada pixel no espao.
As cores so dividas em trs vetores, contendo o vermelho, o verde e o azul
(linhas 12, 13 e 14) do RGB e novamente mescladas no Matlab
(linha 23).
Devido as diferenas entre o sistema de coordenadas adotado por este
software, o eixo Y e Z (linhas 17 e 18) devem ser trocados.
1. X = new List<double>();
2. Y = new List<double>();
3. Z = new List<double>();
4. Cr = new List<double>();
5. Cg = new List<double>();
6. Cb = new List<double>();
7. foreach (RGBD p in PontoNoEspaco3)
8. {
9. X.Add(p.Ponto.X); // separa os pontos em listas com os valores de cada eixo para
cada ponto
10. Y.Add(p.Ponto.Y);
11. Z.Add(p.Ponto.Z);
70
12. Cr.Add(p.Cor.R);//divide as cores em 3 componentes para permitir o envio ao
matlab
13. Cg.Add(p.Cor.G);
14. Cb.Add(p.Cor.B);
15. }
16. matlab.PutWorkspaceData("X3", "base", X.ToArray()); // envia todos as listas ao
matlab
17. matlab.PutWorkspaceData("Z3", "base", Y.ToArray());
18. matlab.PutWorkspaceData("Y3", "base", Z.ToArray());
19. matlab.PutWorkspaceData("Cr", "base", Cr.ToArray());
20. matlab.PutWorkspaceData("Cg", "base", Cg.ToArray());
21. matlab.PutWorkspaceData("Cb", "base", Cb.ToArray());
22. matlab.Execute("S3(1:length(X3),1) = 2;"); // cria um vetor definindo o tamanho
de cada ponto no espao
23. matlab.Execute("C3 = [Cr(:)/255 Cg(:)/255 Cb(:)/255];"); // une os valores de cor
24. matlab.Execute("figure"); // inicia nova janela de imagem
25. matlab.Execute("scatter3(X3,Y3,Z3,S3,C3,'filled')"); // plota a nuvem de pontos
Entretanto, a utilizao deste sistema para a visualizao dos dados
demasiadamente lenta e pouca dinmica quando se pretende analisar os dados
sobre outros pontos de vista. Assim, fora adicionado tambm um mtodo de
representao destes dados com auxlio do sistema de OpenGL implementado em
C# pela biblioteca SharpGL de licena aberta. No Anexo XI so exibidas as rotinas
utilizadas para manipular as nuvens de pontos atravs desta biblioteca.
Para facilitar a visualizao dos resultados, as cmeras foram posicionadas
sempre com foco em um objeto centralizado para ambas, estando estas em um
ngulo de aproximadamente 90 a partir do objeto.
O Anexo VII apresenta o algoritmo desta etapa na ntegra.
71
4 RESULTADOS E DISCUSSO
Durante todos os testes fora utilizado um netbook Acer
2
foram utilizadas duas imagens difceis de se determinar o ponto exato das esquinas
(Figura 4.5 e Figura 4.9), tal efeito pode ser percebido a partir da diferena entre a
calibrao dos dois sensores. Na bateria de testes a seguir, com 25 imagens, estas
duas imagens problemticas foram removidas e os resultados convergiram para
muito prximo do primeiro Kinect
1 (Figura 4.6),
mesmo considerando-se o fato de os pontos obtidos para os clculos serem feitos
de forma manual.
O mesmo no ocorre, entretanto, quando se reduz ainda mais a quantidade
de imagens. A partir de 20 imagens (at 3) observa-se a variao mais expressiva
dos parmetros intrnsecos encontrados. Neste momento fica clara a falta de
preciso na coleta dos pontos manualmente, uma vez que os parmetros
encontrados com 15 imagens de calibrao foram mais prximos da efetuada com
30 imagens do que de 20 imagens como possvel ver nas tabelas do AnexoXII.
Os testes que se seguem, utilizaram menos que 10 imagens para calibrao e
os efeitos so rapidamente percebidos, visto que os parmetros encontrados variam
significativamente, chegando a obter um desvio de quase 50% se comparada a
calibrao com 30 imagens e 3 imagens (Tabela 8). To logo se pode concluir que
so parmetros totalmente descartveis, e sem confiabilidade alguma.
Em todos os testes (Figura 4.8 e Figura 4.9 - comeando de 3 imagens para
30 imagens de calibrao de cores e na sequncia as de profundidade) os valores
dos coeficientes de distoro variam com intensidade significativa, mas, vale lembrar
que estes so valores estimados atravs de tentativa e erro. E sendo estes
dependentes uns dos outros, podem variar fortemente porm de modo a
continuarem tendendo ao mesmo ponto de estabilidade.
Porm cabem algumas observaes como, os valores dos coeficientes de
distoro tangencial estiveram a todo momento abaixo de 0,01 pixels. Sendo p1
sempre negativo e p2 sempre positivo. O mesmo vale para k3 que esteve sempre
muito prximo de 1 o que por si s j denota sua influncia na correo. Enquanto
os valores de k1 e k2 variaram com maior intensidade, demonstrando que possuem
maior influncia sobre o resultado, um tendendo a equilibrar o outro enquanto os
demais representam ajustes finos.
76
Fonte: o autor.
Figura 4.8 - Coeficientes de Distoro Cmera 1. a) Cmera de Profundidade. b) Cmera RGB.
Fonte: o autor.
Figura 4.9 - Distoro Cmera 2. a) Cmera de Profundidade. b) Cmera RGB.
A baixssima variao entre os trs primeiros testes na calibrao da cmera
de cores (Figura 4.10) mostra no s a eficincia na localizao automtica de
esquinas mas tambm a maior confiabilidade nos resultados das cmeras de cores
se comparadas as cmeras de profundidade.
Fonte: o autor.
Figura 4.10 - Parmetros intrnsecos da cmera de cores.
0
100
200
300
400
500
600
30 25 20 15 10 6 3
P
i
x
e
l
s
Parametros intrnsecos -
Kinect 1
fx
fy
cx
cy
77
Fonte: o autor.
Figura 4.11 - Parmetros intrnsecos da cmera 2 de cores.
Nestes testes, os coeficientes de p1 e p2 encontrados foram sempre muito
semelhantes entre eles. Isto pode ser resultado direto da forma como a captura da
imagem acontece. Nos sensores de profundidade existem dois elementos distantes
um do outro e formando um certo ngulo com relao ao ponto de foco. J a cmera
de cores obtm de forma autnoma e os efeitos de distoro tangencial tendem a ter
uma diferena de distoro entre um eixo e outro.
Ao contrrio cmeras de profundidade, as cmeras de cores por possurem
deteco automtica de esquinas, conseguem realizar a calibrao dos parmetros
com pequena variao nos valores reais dos parmetros at uma quantidade
mnima de 15 imagens. A partir da os valores comeam a variar para mais ou para
menos com maior intensidade dependendo das imagens utilizadas.
A calibrao estreo a simples comparao entre pontos das imagens
anteriores. Logo, sofre com os mesmo problemas da calibrao de profundidade,
existindo pontos mal selecionados pelo operador, a calibrao entre cmera de cor e
cmera de profundidade ser comprometida.
Ao final da obteno da nuvem de pontos estes erros vo se acumulando a
ponto de dificultar significativamente o alinhamento das nuvens.
0
200
400
600
800
1000
1200
1400
30 25 20 15 10 6 3
P
i
x
e
l
s
Paramtros intrnsecos -
Kinect 2
fx
fy
cx
cy
78
Tabela 4.1 - Parmetros de calibrao estereo intrnseca dos sensores.
KINECT
1 30 imagens
R1 R2 R3 T
-0,0004174562 m 4,33831271671 m 1,52425034854 m 0,1825257463 m
-7,9575576016 m -0,00040655033 m -2,10502180514 m 0,3239107990 m
3,6431199999 m -5,42109920773 m 1,70062199854 m -0,837898761 m
KINECT
1 25 imagens
0,0008275381 m -5,9912642469 m 3,96181442193 m -0,392141428 m
1,4545447811 m 0,0008228668 m -6,48044424832 m -0,316901990 m
-4,8001514642 m 8,1785189798 m 6,81040844901 m 1,152422900 m
KINECT
2 30 imagens
0,0009100381 m -5,8712642469 m 4,025318983300 m -0,353215680 m
1,4723100290 m 0,0004067980 m -6,47052221200 m 0,3021330214 m
-4,599999987 m 8,0000175000 m 7,01040864200 m 1,1223652300 m
KINECT
2 25 imagens
0,0001419795 m -6,2925489481 m -1,29233223556 m -0,321554383 m
3,4170301553 m 0,0001967349 m -3,00042708404 m -0,016040520 m
6,6005239045 m 1,8207457754 m 2,79538339846 m 1,083997455 m
Fonte: o autor.
4.2 NUVEM DE PONTOS
As nuvens de pontos so exibidas tanto com a utilizao da ferramenta
scatter3 do Matlab
private PointF P3DmapToP2D(Point3D XYZ, double[,] CameraRGBMatrix, double[,]
RotationStereo, double[] TranslationStereo)
{
double[] xyz = new double[3] { XYZ.X, XYZ.Y, XYZ.Z };
matlab.PutWorkspaceData("XYZ", "base", xyz);
double fx = CameraRGBMatrix[0, 0];
double fy = CameraRGBMatrix[1, 1];
double cx = CameraRGBMatrix[0, 2];
double cy = CameraRGBMatrix[1, 2];
matlab.PutWorkspaceData("fx", "base", fx);
matlab.PutWorkspaceData("fy", "base", fy);
matlab.PutWorkspaceData("cx", "base", cx);
matlab.PutWorkspaceData("cy", "base", cy);
matlab.PutWorkspaceData("R", "base", RotationStereo);
matlab.PutWorkspaceData("T", "base", TranslationStereo);
matlab.Execute("P3Dlinha = XYZ*R + T");
matlab.Execute("P2Dx = (P3Dlinha(1) * fx / P3Dlinha(3)) + cx");
matlab.Execute("P2Dy = (P3Dlinha(2) * fy / P3Dlinha(3)) + cy");
matlab.Execute("P2D = [P2Dx P2Dy]");
Object retorno;
matlab.GetWorkspaceData("P2D", "base", out retorno);
double[,] P2D = (double[,])retorno;
return new PointF((float)P2D[0, 0], (float)P2D[0, 1]);
}
94
ANEXO V Algoritmo de Calibrao
Size patternSize = new Size(5, 6);
Size squareSize = new Size(40, 40);
List<PointF[]> Corners = new List<PointF[]>();
foreach (Bitmap bmp in bmps)
{
Image<Gray, byte> img = new Image<Gray, byte>(bmp);
PointF[] corners = CameraCalibration.FindChessboardCorners(img, patternSize,
Emgu.CV.CvEnum.CALIB_CB_TYPE.ADAPTIVE_THRESH |
Emgu.CV.CvEnum.CALIB_CB_TYPE.FILTER_QUADS);
Corners.Add(corners);
}
foreach (PointF[] pCorner in Corners)
{
Hmatrizes.Add(CameraCalibration.FindHomography(pontosReais1, pCorner,
Emgu.CV.CvEnum.HOMOGRAPHY_METHOD.DEFAULT, 1.3));
}
List<double[,]> matrizesV = new List<double[,]>();
foreach (HomographyMatrix h in Hmatrizes)
{
matrizesV.Add(HomografiaParaMatrizV(h, 0, 1));
}
matlab.Execute("clear all");
matlab.Execute("cls");
matlab.Execute("V = []");
for (int i = 0; i < Hmatrizes.Count; i++)
{
string varHMatlab = "H" + (i + 1).ToString();
string varVMatlab = "V" + (i + 1).ToString();
matlab.PutWorkspaceData(varHMatlab, "base", Hmatrizes[i].Data);
matlab.PutWorkspaceData(varVMatlab, "base", matrizesV[i]);
string varVetorMatlab = "V = [V; " + varVMatlab + "]";
matlab.Execute(varVetorMatlab);
}
matlab.Execute("[u,d,v] = svd(V)");
matlab.Execute("b = v(:,6)");
matlab.Execute("B11 = b(1)");
matlab.Execute("B12 = b(2)");
matlab.Execute("B22 = b(3)");
matlab.Execute("B13 = b(4)");
matlab.Execute("B23 = b(5)");
matlab.Execute("B33 = b(6)");
matlab.Execute("v0 = (B12*B13-B11*B23)/(B11*B22-B12^2)");
matlab.Execute("l = B33 - (B13^2 + v0*(B12*B13 - B11*B23))/B11");
matlab.Execute("a = sqrt(l/B11)");
matlab.Execute("B = sqrt(l*B11/(B11*B22 - B12^2))");
matlab.Execute("y = -B12*(a^2)*(B/l)");
matlab.Execute("u0 = y*v0/B-B13*(a^2)/l");
matlab.Execute("A = [ a y u0; 0 B v0; 0 0 1]");
matlab.Execute("A = abs(A)");
95
List<double[,]> rotationANDtranslation = new List<double[,]>();
foreach (HomographyMatrix H in Hmatrizes)
{
double[] h1 = Vetorh(H.Data, 0);
double[] h2 = Vetorh(H.Data, 1);
double[] h3 = Vetorh(H.Data, 2);
matlab.PutWorkspaceData("h1", "base", h1);
matlab.PutWorkspaceData("h2", "base", h2);
matlab.PutWorkspaceData("h3", "base", h3);
matlab.Execute("r1 = (1/l)*inv(A)*h1'");
matlab.Execute("r2 = (1/l)*inv(A)*h2'");
matlab.Execute("r3 = cross(r1,r2)");
matlab.Execute("t = (1/l)*inv(A)*h3'");
matlab.Execute("Rt = [r1 r2 r3 t]");
retorno = null;
matlab.GetWorkspaceData("Rt", "base", out retorno);
double[,] matriz = (double[,])retorno;
rotationANDtranslation.Add(matriz);
}
Object retorno;
matlab.GetWorkspaceData("V", "base", out retorno);
double[,] V = (double[,])retorno;
retorno = null;
matlab.GetWorkspaceData("b", "base", out retorno);
double[,] b = (double[,])retorno;
retorno = null;
matlab.GetWorkspaceData("A", "base", out retorno);
double[,] A = (double[,])retorno;
return A;
96
ANEXO VI Funes de montagem dos vetores, h, v e matriz V (Captulo 2.12).
private double[] Vertoh(double[,] H, int i)
{
double[] h = new double[3] { H[0, i], H[1, i], H[2, i] };
return h;
}
private double[] Vetorv(double[,] H, int i, int j)
{
double[] h1 = Vertoh(H, 0);
double[] h2 = Vertoh(H, 1);
double[] h3 = Vertoh(H, 2);
List<double[]> h = new List<double[]>();
h.Add(h1);
h.Add(h2);
h.Add(h3);
double[] v = new double[6]
{
h[i][0] * h[j][0],
h[i][0] * h[j][1] + h[i][1] * h[j][0],
h[i][1] * h[j][1],
h[i][2] * h[j][0] + h[i][0] * h[j][2],
h[i][2] * h[j][1] + h[i][1] * h[j][2],
h[i][2] * h[j][2]
};
return v;
}
private double[,] MatrizV(double[] va, double[] vb, double[] vc)
{
double[,] V = new double[2, 6]
{
{ va[0], va[1], va[2], va[3], va[4],
va[5]},
{vb[0] - vc[0], vb[1] - vc[1], vb[2] - vc[2], vb[3] - vc[3], vb[4] - vc[4],
vb[5] - vc[5]}
};
return V;
}
private double[,] HomografiaParaMatrizV(HomographyMatrix homografia, int i, int j)
{
double[,] H = homografia.Data;
double[] va = Vetorv(H, i, j);
double[] vb = Vetorv(H, i, i);
double[] vc = Vetorv(H, j, j);
double[,] V = MatrizV(va, vb, vc);
return V;
}
97
ANEXO VII Algoritmo de alinhamento das nuvens de pontos
private Matrix3D Varredura3dAlinhamento(List<Point3D> pontosCamFonte, List<Point3D>
pontosCamDest)
{
int pontosCount = pontosCamFonte.Count;
List<Point3D> pontosCam1 = new List<Point3D>();
pontosCam1.AddRange(pontosCamFonte.ToArray());
List<Point3D> pontosCam2 = new List<Point3D>();
pontosCam2.AddRange(pontosCamDest.ToArray());
double tx1 = -pontosCam1[0].X;
double ty1 = -pontosCam1[0].Y;
double tz1 = -pontosCam1[0].Z;
double tx2 = -pontosCam2[0].X;
double ty2 = -pontosCam2[0].Y;
double tz2 = -pontosCam2[0].Z;
matlab.Execute("pi = []");
matlab.Execute("po = []");
for (int i = 0; i < pontosCount; i++)
{
pontosCam1[i] = new Point3D(pontosCam1[i].X + tx1,
pontosCam1[i].Y + ty1,
pontosCam1[i].Z + tz1
);
pontosCam2[i] = new Point3D(pontosCam2[i].X + tx2,
pontosCam2[i].Y + ty2,
pontosCam2[i].Z + tz2
);
double[] pi = new double[3] { pontosCam1[i].X, pontosCam1[i].Y,
pontosCam1[i].Z };
double[] po = new double[3] { pontosCam2[i].X, pontosCam2[i].Y,
pontosCam2[i].Z };
matlab.PutWorkspaceData("p1", "base", pi);
matlab.PutWorkspaceData("p2", "base", po);
matlab.Execute("pi = [pi; p1]");
matlab.Execute("po = [po; p2]");
}
Point3D VetorY = new Point3D(0, 1, 0);
Matrix3D matrizZ1 = Matrix3D.Identity;
Matrix3D matrizX1 = Matrix3D.Identity;
Matrix3D matrizRot1 = Matrix3D.Identity;
Matrix3D matrizT1 = Matrix3D.Identity;
//############# TRANSLAO
matrizT1.OffsetX = tx1;
matrizT1.OffsetY = ty1;
matrizT1.OffsetZ = tz1;
//############# PLANO Z
double angZ1 = AlinharVetores(VetorY, pontosCam1[1], Eixo.Z);
matrizZ1 = MatrizRotacao(Eixo.Z, angZ1);
for (int k = 1; k < pontosCount; k++)
{
pontosCam1[k] = Point3D.Multiply(pontosCam1[k], matrizZ1);
98
}
//############# PLANO X
double angX1 = AlinharVetores(VetorY, pontosCam1[1], Eixo.X);
matrizX1 = MatrizRotacao(Eixo.X, angX1);
for (int k = 1; k < pontosCount; k++)
{
pontosCam1[k] = Point3D.Multiply(pontosCam1[k], matrizX1);
}
matrizRot1 = Matrix3D.Multiply(matrizT1, matrizZ1); // Mz*Mt
matrizRot1 = Matrix3D.Multiply(matrizRot1, matrizX1); // Mx*ans
matrizRot1.Invert();
double anguloX = 0;
double anguloY = 0;
double anguloZ = 0;
Matrix3D matrizY = Matrix3D.Identity;
Matrix3D matrizZ = Matrix3D.Identity;
Matrix3D matrizX = Matrix3D.Identity;
Matrix3D matriz = Matrix3D.Identity;
Matrix3D matrizT = Matrix3D.Identity;
//############# TRANSLAO
matrizT.OffsetX = tx2;
matrizT.OffsetY = ty2;
matrizT.OffsetZ = tz2;
//############# PLANO Z
double angZ = AlinharVetores(VetorY, pontosCam2[1], Eixo.Z);
matrizZ = MatrizRotacao(Eixo.Z, angZ);
for (int k = 1; k < pontosCount; k++)
{
pontosCam2[k] = Point3D.Multiply(pontosCam2[k], matrizZ);
}
//############# PLANO X
double angX = AlinharVetores(VetorY, pontosCam2[1], Eixo.X);
matrizX = MatrizRotacao(Eixo.X, angX);
for (int k = 1; k < pontosCount; k++)
{
pontosCam2[k] = Point3D.Multiply(pontosCam2[k], matrizX);
}
//############# PLANO Y - Com os segundos vetores de cada lista de pontos
double angY = AlinharVetores(pontosCam1[2], pontosCam2[2], Eixo.Y);
matrizY = MatrizRotacao(Eixo.Y, angY);
for (int k = 1; k < pontosCount; k++)
{
pontosCam2[k] = Point3D.Multiply(pontosCam2[k], matrizY);
}
// invM1*My*Mx*Mz*Mt
matriz = Matrix3D.Multiply(matrizT, matrizZ); // Mz*Mt
matriz = Matrix3D.Multiply(matriz, matrizX); // Mx*ans
matriz = Matrix3D.Multiply(matriz, matrizY); // My*ans
matriz = Matrix3D.Multiply(matriz, matrizRot1); // invM1*ans
return matriz;
}
99
ANEXO VIII Matrizes de rotao
private Matrix3D MatrizRotacao(Eixo eixo, double ang)
{
Matrix3D rotacao = Matrix3D.Identity;
double radAng = (Math.PI * ang) / 180;
switch (eixo)
{
case Eixo.STATIC:
rotacao = calibracaoAlinhamento;
break;
case Eixo.X:
rotacao = new Matrix3D();
rotacao.M11 = 1;
rotacao.M12 = 0;
rotacao.M13 = 0;
rotacao.M14 = 0;
rotacao.M21 = 0;
rotacao.M22 = Math.Cos(radAng);
rotacao.M23 = Math.Sin(radAng);
rotacao.M24 = 0;
rotacao.M31 = 0;
rotacao.M32 = -Math.Sin(radAng);
rotacao.M33 = Math.Cos(radAng);
rotacao.M34 = 0;
rotacao.OffsetX = 0;
rotacao.OffsetY = 0;
rotacao.OffsetZ = 0;
rotacao.M44 = 1;
break;
case Eixo.Y:
rotacao = new Matrix3D();
rotacao.M11 = Math.Cos(radAng);
rotacao.M12 = 0;
rotacao.M13 = -Math.Sin(radAng);
rotacao.M14 = 0;
rotacao.M21 = 0;
rotacao.M22 = 1;
rotacao.M23 = 0;
rotacao.M24 = 0;
rotacao.M31 = Math.Sin(radAng);
rotacao.M32 = 0;
rotacao.M33 = Math.Cos(radAng);
rotacao.M34 = 0;
rotacao.OffsetX = 0;
rotacao.OffsetY = 0;
rotacao.OffsetZ = 0;
rotacao.M44 = 1;
break;
case Eixo.Z:
rotacao = new Matrix3D();
rotacao.M11 = Math.Cos(radAng);
rotacao.M12 = Math.Sin(radAng);
rotacao.M13 = 0;
rotacao.M14 = 0;
100
rotacao.M21 = -Math.Sin(radAng);
rotacao.M22 = Math.Cos(radAng);
rotacao.M23 = 0;
rotacao.M24 = 0;
rotacao.M31 = 0;
rotacao.M32 = 0;
rotacao.M33 = 1;
rotacao.M34 = 0;
rotacao.OffsetX = 0;
rotacao.OffsetY = 0;
rotacao.OffsetZ = 0;
rotacao.M44 = 1;
break;
}
return rotacao;
}
101
ANEXO IX Imagens do software de estudo
102
103
ANEXO X Funes de obteno e aquisio das imagens
private void ProfundidadePronta(object sender, DepthImageFrameReadyEventArgs e)
{
bool recebidoDados = false;
if (Dados1.SensorKinect.UniqueKinectId == ((KinectSensor)sender).UniqueKinectId)
{
using (Dados1.DepthImageFrame = e.OpenDepthImageFrame())
{
if (Dados1.DepthImageFrame != null)
{
short[] shorts = new short[Dados1.DepthImageFrame.PixelDataLength];
Dados1.DepthImageFrame.CopyPixelDataTo(shorts);
Dados1.PixelDepthData = shorts.ToList();
recebidoDados = true;
}
}
if (recebidoDados)
{
if (Kinect1Frame1Concluido)
{
Kinect1Frame1Concluido = false;
Dados1.SensorKinect.Stop();
}
else
Kinect1Frame1Concluido =true;
Dados1.SensorKinect.DepthFrameReady -= new
EventHandler<DepthImageFrameReadyEventArgs>(ProfundidadePronta);
}
}
else
{
using (Dados2.DepthImageFrame = e.OpenDepthImageFrame())
{
if (Dados2.DepthImageFrame != null)
{
short[] shorts = new short[Dados2.DepthImageFrame.PixelDataLength];
Dados2.DepthImageFrame.CopyPixelDataTo(shorts);
Dados2.PixelDepthData = shorts.ToList();
recebidoDados = true;
}
}
if (recebidoDados)
{
if (Kinect2Frame1Concluido)
{
Kinect2Frame1Concluido = false;
Dados2.SensorKinect.Stop();
}
else
Kinect2Frame1Concluido = true;
Dados2.SensorKinect.DepthFrameReady -= new
EventHandler<DepthImageFrameReadyEventArgs>(ProfundidadePronta);
}
}
}
private void CoresPronto(object sender, ColorImageFrameReadyEventArgs e)
{
if (Dados1.SensorKinect.UniqueKinectId == ((KinectSensor)sender).UniqueKinectId)
104
{
using (Dados1.ColorImageFrame = e.OpenColorImageFrame())
{
if (Dados1.ColorImageFrame != null)
{
bool novoFormato = Dados1.LastImageFormat !=
Dados1.ColorImageFrame.Format;
byte[] bytes = new byte[Dados1.ColorImageFrame.PixelDataLength];
if (novoFormato)
{
unsafe
{
fixed (void* p = bytes)
{
IntPtr ptr = new IntPtr(p);
PixelFormat format = PixelFormat.Format32bppRgb;
Dados1.BitmapImage = new
Bitmap(Dados1.ColorImageFrame.Width,
Dados1.ColorImageFrame.Height, (4 *
Dados1.ColorImageFrame.Width), format, ptr);
}
}
}
Dados1.ColorImageFrame.CopyPixelDataTo(bytes);
Dados1.PixelData = bytes.ToList();
pictureBox1.Image = Dados1.BitmapImage;
Dados1.LastImageFormat = Dados1.ColorImageFrame.Format;
}
}
if (Kinect1Frame1Concluido)
{
Kinect1Frame1Concluido = false;
Dados1.SensorKinect.Stop();
}
else
Kinect1Frame1Concluido = true;
Dados1.SensorKinect.ColorFrameReady -= new
EventHandler<ColorImageFrameReadyEventArgs>(CoresPronto);
}
else
{
using (Dados2.ColorImageFrame = e.OpenColorImageFrame())
{
if (Dados2.ColorImageFrame != null)
{
bool novoFormato = Dados2.LastImageFormat !=
Dados2.ColorImageFrame.Format;
byte[] bytes = new byte[Dados2.ColorImageFrame.PixelDataLength];
if (novoFormato)
{
unsafe
{
fixed (void* p = bytes)
{
IntPtr ptr = new IntPtr(p);
PixelFormat format = PixelFormat.Format32bppRgb;
Dados2.BitmapImage = new
Bitmap(Dados2.ColorImageFrame.Width,
105
Dados2.ColorImageFrame.Height, (4 *
Dados2.ColorImageFrame.Width), format, ptr);
}
}
}
Dados2.ColorImageFrame.CopyPixelDataTo(bytes);
Dados2.PixelData = bytes.ToList();
pictureBox2.Image = Dados2.BitmapImage;
Dados2.LastImageFormat = Dados2.ColorImageFrame.Format;
}
}
if (Kinect2Frame1Concluido)
{
Kinect2Frame1Concluido = false;
Dados2.SensorKinect.Stop();
}
else
Kinect2Frame1Concluido = true;
Dados2.SensorKinect.ColorFrameReady -= new
EventHandler<ColorImageFrameReadyEventArgs>(CoresPronto);
}
}
ANEXO XI Rotinas de manipulao da biblioteca SharpGL
public void openGLControl_OpenGLDraw(object sender, PaintEventArgs e)
{
106
OpenGL gl = this.openGLControl.OpenGL;
gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
gl.LoadIdentity();
gl.Rotate(rotation, (double)nudRotationX.Value, (double)nudRotationY.Value,
(double)nudRotationZ.Value);
Matrix3D identidade = Matrix3D.Identity;
gl.Begin(OpenGL.GL_POINTS);
if (cbImagem1.Checked)
{
foreach (RGBD rgbd in PontoNoEspaco1)
{
gl.Color(rgbd.Cor.R, rgbd.Cor.G, rgbd.Cor.B);
gl.Vertex(rgbd.Ponto.X, rgbd.Ponto.Y, rgbd.Ponto.Z);
}
}
if (cbImagem2.Checked)
{
if (rbAlinhado.Checked)
{
foreach (RGBD rgbd in PontoNoEspaco2Alinhado)
{
gl.Color(rgbd.Cor.R, rgbd.Cor.G, rgbd.Cor.B);
gl.Vertex(rgbd.Ponto.X, rgbd.Ponto.Y, rgbd.Ponto.Z);
}
}
else
{
foreach (RGBD rgbd in PontoNoEspaco2)
{
gl.Color(rgbd.Cor.R, rgbd.Cor.G, rgbd.Cor.B);
gl.Vertex(rgbd.Ponto.X, rgbd.Ponto.Y, rgbd.Ponto.Z);
}
}
}
gl.End();
rotation += 0.0f;
}
public void openGLControl_OpenGLInitialized(object sender, EventArgs e)
{
OpenGL gl = openGLControl.OpenGL;
gl.ClearColor(0, 1, 1, 0); // Cor do vazio
}
public void openGLControl_Resized(object sender, EventArgs e)
{
OpenGL gl = openGLControl.OpenGL;
// Matriz de projeo
gl.MatrixMode(OpenGL.GL_PROJECTION);
gl.LoadIdentity();
gl.Translate((double)nudTranslateX.Value, (double)nudTranslateY.Value,
(double)nudTranslateZ.Value);
gl.Perspective((double)nudPerspectiveFovy.Value, (double)width / (double)height,
(double)nudZNear.Value, (double)nudZFar.Value);
gl.LookAt((double)nudLookAtEyeX.Value, (double)nudLookAtEyeY.Value,
(double)nudLookAtEyeZ.Value, (double)nudLookAtCenterX.Value,
(double)nudLookAtCenterY.Value, (double)nudLookAtCenterZ.Value, 0, 1, 0);
gl.MatrixMode(OpenGL.GL_MODELVIEW);
}
107
public void openGLControl_Atualizar(object sender, EventArgs e)
{
OpenGL gl = openGLControl.OpenGL;
gl.MatrixMode(OpenGL.GL_PROJECTION);
gl.LoadIdentity();
gl.Translate((double)nudTranslateX.Value, (double)nudTranslateY.Value,
(double)nudTranslateZ.Value);
gl.Perspective((double)nudPerspectiveFovy.Value, (double)width / (double)height,
(double)nudZNear.Value, (double)nudZFar.Value);
gl.LookAt((double)nudLookAtEyeX.Value, (double)nudLookAtEyeY.Value,
(double)nudLookAtEyeZ.Value, (double)nudLookAtCenterX.Value,
(double)nudLookAtCenterY.Value, (double)nudLookAtCenterZ.Value, 0, 1, 0);
gl.MatrixMode(OpenGL.GL_MODELVIEW);
}
public float rotation = 0.0f;
108
ANEXO XII Tabelas de calibrao das cmeras de profundidade
Tabela 2 Calibrao Intrnseca dos sensores de profundidade 30 imagens
SENSORES DE PROFUNDIDADE - 30 IMAGENS
KINECT
1 KINECT
2
Distncia focal em X 630,1213488 pxs 818,8236082 pxs
Distncia focal em Y 622,7060721 pxs 808,6344544 pxs
Centro das Lentes em X 296,0779905 pxs 318,4477454 pxs
Centro das Lentes em Y 249,7933605 pxs 190,4574986 pxs
Coeficiente de Distoro Radial K1 0,0290 -0,0100
Coeficiente de Distoro Radial K2 -0,4840 -1,0100
Coeficiente de Distoro Radial K3 0,7880 0,6900
Coeficiente de Distoro Tangencial P1 -0,0080 0,0060
Coeficiente de Distoro Tangencial P2 0,0150 -0,0100
Erro mdio 0,45321 ppc/img 10,230 ppc/img
Erro distribudo 1,12067 ppc/img
501,3292
ppc/img
Tempo de processamento 0:47 horas 0:56 horas
Fonte: o autor.
Onde:
ppc pixels por ponto em comum (distncia em pixels de cada ponto)
Img nmero de imagens
109
Tabela 3 Calibrao Intrnseca dos sensores de profundidade 25 imagens
SENSORES DE PROFUNDIDADE - 25 IMAGENS
KINECT
1 KINECT
2
Distncia focal em X 634,7578040 pxs 618,2591887 pxs
Distncia focal em Y 629,8116223 pxs 616,6957958 pxs
Centro das Lentes em X 310,0400027 pxs 312,2788455 pxs
Centro das Lentes em Y 242,6719835 pxs 243,4174451 pxs
Coeficiente de Distoro Radial K1 -0,0100 -0,0100
Coeficiente de Distoro Radial K2 -0,3100 -0,1990
Coeficiente de Distoro Radial K3 0,9900 0,8080
Coeficiente de Distoro Tangencial P1 -0,0070 -0,0020
Coeficiente de Distoro Tangencial P2 0,0050 0,0020
Erro mdio 0,67123 ppc/img 0,749376 ppc/img
Erro distribudo 2,77254 ppc/img
2,626588
ppc/img
Tempo de processamento 0:31 horas 0:29 horas
Fonte: o autor.
Tabela 4 Calibrao Intrnseca dos sensores de profundidade 20 imagens
SENSORES DE PROFUNDIDADE - 20 IMAGENS
KINECT
1 KINECT
2
Distncia focal em X 669,2600759 pxs 607,81289 pxs
Distncia focal em Y 654,9244368 pxs 606,30030 pxs
Centro das Lentes em X 294,8814227 pxs 288,38955 pxs
Centro das Lentes em Y 232,1058116 pxs 246,24822 pxs
Coeficiente de Distoro Radial K1 -0,0700 0,0300
Coeficiente de Distoro Radial K2 0,1900 -0,1580
Coeficiente de Distoro Radial K3 1,0490 0,4980
Coeficiente de Distoro Tangencial P1 -0,0030 0,0030
Coeficiente de Distoro Tangencial P2 0,0150 0,0040
Erro mdio 0,89425 ppc/img 0,30842 ppc/img
Erro distribudo 3,45677 ppc/img 0,44928 ppc/img
Tempo de processamento 0:28 horas 0:23 horas
Fonte: o autor.
110
Tabela 5 Calibrao Intrnseca dos sensores de profundidade 15 imagens
SENSORES DE PROFUNDIDADE - 15 IMAGENS
KINECT
1 KINECT
2
Distncia focal em X 645,7671250 pxs 666,472296 pxs
Distncia focal em Y 634,2683678 pxs 661,760535 pxs
Centro das Lentes em X 335,3585587 pxs 271,473048 pxs
Centro das Lentes em Y 241,713/6487 pxs 250,476487 pxs
Coeficiente de Distoro Radial K1 -0,0000000000001 -0,1000
Coeficiente de Distoro Radial K2 -0,2000 0,8000
Coeficiente de Distoro Radial K3 0,5000 -0,4000
Coeficiente de Distoro Tangencial P1 -0,0000000000001 -0,000000000001
Coeficiente de Distoro Tangencial P2 -0,0000000000001 -0,000000000001
Erro mdio 0,77423 ppc/img 0,460711 ppc/img
Erro distribudo 3,335672 ppc/img 4,51689 ppc/img
Tempo de processamento 0:20 horas 0:18 horas
Fonte: o autor.
Tabela 6 Calibrao Intrnseca dos sensores de profundidade 10 imagens
SENSORES DE PROFUNDIDADE - 10 IMAGENS
KINECT
1 KINECT
2
Distncia focal em X 669,4526524 pxs 668,665481 pxs
Distncia focal em Y 655,5490427 pxs 663,457076 pxs
Centro das Lentes em X 321,9575173 pxs 288,033741 pxs
Centro das Lentes em Y 218,7419424 pxs 242,267229 pxs
Coeficiente de Distoro Radial K1 -0,0000000000001 -0,0200
Coeficiente de Distoro Radial K2 -0,3000 0,4200
Coeficiente de Distoro Radial K3 0,5000 0,2700
Coeficiente de Distoro Tangencial P1 -0,0000000000001 0,0030
Coeficiente de Distoro Tangencial P2 -0,0000000000001 0,0070
Erro mdio 0,91002 ppc/img 1,32425 ppc/img
Erro distribudo 5,23122 ppc/img 9,40800 ppc/img
Tempo de processamento 0:17 horas 0:15 horas
Fonte: o autor.
111
Tabela 7 Calibrao Intrnseca dos sensores de profundidade 6 imagens
SENSORES DE PROFUNDIDADE - 6 IMAGENS
KINECT
1 KINECT
2
Distncia focal em X 655,6801489 pxs 593,692226 pxs
Distncia focal em Y 656,9033906 pxs 602,626226 pxs
Centro das Lentes em X 358,6987640 pxs 264,032037 pxs
Centro das Lentes em Y 272,3621986 pxs 263,070478 pxs
Coeficiente de Distoro Radial K1 0,0899 -0,0690
Coeficiente de Distoro Radial K2 -0,5300 -0,0400
Coeficiente de Distoro Radial K3 0,8500 -0,0200
Coeficiente de Distoro Tangencial P1 -0,0040 -0,0090
Coeficiente de Distoro Tangencial P2 0,0210 0,0010
Erro mdio 3,317 ppc/img 1,8659 ppc/img
Erro distribudo 81,132 ppc/img 17,2378 ppc/img
Tempo de processamento 0:06 horas 0:08 horas
Fonte: o autor.
Tabela 8 Calibrao Intrnseca dos sensores de profundidade 3 imagens
SENSORES DE PROFUNDIDADE - 3 IMAGENS
KINECT
1 KINECT
2
Distncia focal em X 870,0574953 pxs 1164,61222 pxs
Distncia focal em Y 911,0021030 pxs 1270,02007 pxs
Centro das Lentes em X 787,4621479 pxs 184,22845 pxs
Centro das Lentes em Y 177,7179607 pxs 87,91674 pxs
Coeficiente de Distoro Radial K1 -0,0980 -1,0800
Coeficiente de Distoro Radial K2 0,0180 -0,9600
Coeficiente de Distoro Radial K3 0,0490 0,3300
Coeficiente de Distoro Tangencial P1 -0,0010 0,0999
Coeficiente de Distoro Tangencial P2 -0,0220 -0,0300
Erro mdio 14,8038 ppc/img 63,5585 ppc/img
Erro distribudo 949,991 ppc/img 16494,4 ppc/img
Tempo de processamento 0:02 horas 0:04 horas
Fonte: o autor.
112
ANEXO XIII Tabelas de calibrao das cmeras de cores
Tabela 9 Calibrao Intrnseca dos sensores de cores 30 imagens
SENSORES DE CORES - 30 IMAGENS
KINECT
1 KINECT
2
Distncia focal em X 513,3226786 pxs 520,407262 pxs
Distncia focal em Y 507,6505016 pxs 514,166625 pxs
Centro das Lentes em X 301,7987384 pxs 343,775066 pxs
Centro das Lentes em Y 278,7251398 pxs 265,719933 pxs
Coeficiente de Distoro Radial K1 -0,0060 -0,000000000001
Coeficiente de Distoro Radial K2 -0,1080 -0,2000
Coeficiente de Distoro Radial K3 0,0980 0,6000
Coeficiente de Distoro Tangencial P1 -0,0040 -0,000000000001
Coeficiente de Distoro Tangencial P2 0,0001 -0,000000000001
Erro mdio 0,452233 ppc/img 0,6571 ppc/img
Erro distribudo 12,24783 ppc/img 18,8170 ppc/img
Tempo de processamento 2:43 horas 2:50 horas
Fonte: o autor.
Tabela 10 Calibrao Intrnseca dos sensores de cores 25 imagens
SENSORES DE CORES - 25 IMAGENS
KINECT
1 KINECT
2
Distncia focal em X 513,3416098 pxs 520,979026 pxs
Distncia focal em Y 507,4126355 pxs 515,229107 pxs
Centro das Lentes em X 301,4232571 pxs 295,830901 pxs
Centro das Lentes em Y 277,6161719 pxs 265,570582 pxs
Coeficiente de Distoro Radial K1 -0,0000000000001 0,0050
Coeficiente de Distoro Radial K2 -0,1000 -0,1920
Coeficiente de Distoro Radial K3 0,7000 0,3060
Coeficiente de Distoro Tangencial P1 -0,0000000000001 -0,0020
Coeficiente de Distoro Tangencial P2 -0,0000000000001 0,0030
Erro mdio 0,571253 ppc/img 0,699783 ppc/img
Erro distribudo 15,56721 ppc/img
21,27374
ppc/img
Tempo de processamento 1:57 horas 2:00 horas
Fonte: o autor.
113
Tabela 11 Calibrao Intrnseca dos sensores de cores 20 imagens
SENSORES DE CORES - 20 IMAGENS
KINECT
1 KINECT
2
Distncia focal em X 514,2437423 pxs 509,8542118 pxs
Distncia focal em Y 507,4107491 pxs 504,8398494 pxs
Centro das Lentes em X 301,2885388 pxs 303,0077587 pxs
Centro das Lentes em Y 278,8845097 pxs 263,4650693 pxs
Coeficiente de Distoro Radial K1 -0,0100 -0,0100
Coeficiente de Distoro Radial K2 -0,2100 -0,1940
Coeficiente de Distoro Radial K3 0,6900 0,8020
Coeficiente de Distoro Tangencial P1 -0,0040 0,0060
Coeficiente de Distoro Tangencial P2 0,0020 -0,0050
Erro mdio 0,82295 ppc/img 0,72265 ppc/img
Erro distribudo 24,0092 ppc/img 23,8011 ppc/img
Tempo de processamento 1:33 horas 1:25 horas
Fonte: o autor.
Tabela 12 Calibrao Intrnseca dos sensores de cores 15 imagens
SENSORES DE CORES - 15 IMAGENS
KINECT
1 KINECT
2
Distncia focal em X 511,2799337 pxs 503,9364710 pxs
Distncia focal em Y 505,8492668 pxs 504,2326377 pxs
Centro das Lentes em X 299,5937068 pxs 292,8519824 pxs
Centro das Lentes em Y 276,0872519 pxs 265,6270531 pxs
Coeficiente de Distoro Radial K1 -0,0100 -0,1500
Coeficiente de Distoro Radial K2 -0,1100 0,6200
Coeficiente de Distoro Radial K3 0,2100 -0,3500
Coeficiente de Distoro Tangencial P1 -0,0040 -0,0100
Coeficiente de Distoro Tangencial P2 -0,0000000000001 0,0100
Erro mdio 0,9935 ppc/img 0,76763 ppc/img
Erro distribudo 37,1992 ppc/img 34,3322 ppc/img
Tempo de processamento 1:23 horas 1:00 hora
Fonte: o autor.
114
Tabela 13 Calibrao Intrnseca dos sensores de cores 10 imagens
SENSORES DE CORES - 10 IMAGENS
KINECT
1 KINECT
2
Distncia focal em X 543,5084663 pxs 485,9614361 pxs
Distncia focal em Y 537,1012206 pxs 488,6488925 pxs
Centro das Lentes em X 323,0513995 pxs 288,6411526 pxs
Centro das Lentes em Y 278,0483949 pxs 268,8201968 pxs
Coeficiente de Distoro Radial K1 -0,0500 -0,1000
Coeficiente de Distoro Radial K2 -0,1600 0,7000
Coeficiente de Distoro Radial K3 0,7800 -0,6000
Coeficiente de Distoro Tangencial P1 -0,0100 -0,000000000001
Coeficiente de Distoro Tangencial P2 -0,0000000000001 -0,000000000001
Erro mdio 1,58762 ppc/img 0,88768 ppc/img
Erro distribudo 54,12383 ppc/img 38,2743 ppc/img
Tempo de processamento 1:28 horas 0:30 horas
Fonte: o autor.
Tabela 14 Calibrao Intrnseca dos sensores de cores 6 imagens
SENSORES DE CORES - 6 IMAGENS
KINECT
1 KINECT
2
Distncia focal em X 570,2010760 pxs 518,8985180 pxs
Distncia focal em Y 561,1116127 pxs 528,7893111 pxs
Centro das Lentes em X 336,1761932 pxs 254,6696629 pxs
Centro das Lentes em Y 266,3414945 pxs 247,3186505 pxs
Coeficiente de Distoro Radial K1 -0,1000 -0,0920
Coeficiente de Distoro Radial K2 0,7980 0,3000
Coeficiente de Distoro Radial K3 -0,7100 0,0070
Coeficiente de Distoro Tangencial P1 -0,0010 -0,000000000001
Coeficiente de Distoro Tangencial P2 0,0040 0,0001
Erro mdio 0,56239 ppc/img 0,498991 ppc/img
Erro distribudo 24,12327 ppc/img 28,1290 ppc/img
Tempo de processamento 0:48 horas 0:23 horas
Fonte: o autor.
115
Tabela 15 Calibrao Intrnseca dos sensores de cores 3 imagens
SENSORES DE CORES - 3 IMAGENS
KINECT
1 KINECT
2
Distncia focal em X 551,0239353 pxs 522,2706025 pxs
Distncia focal em Y 543,1638079 pxs 537,7887195 pxs
Centro das Lentes em X 325,4090716 pxs 238,2086881 pxs
Centro das Lentes em Y 256,9286692 pxs 234,2989505 pxs
Coeficiente de Distoro Radial K1 -0,0300 -1,0690
Coeficiente de Distoro Radial K2 0,5100 -0,7680
Coeficiente de Distoro Radial K3 -0.6800 -0,7410
Coeficiente de Distoro Tangencial P1 -0,0000000000001 0,0670
Coeficiente de Distoro Tangencial P2 0,0010 0,2100
Erro mdio 7,434 ppc/img 11,41916 ppc/img
Erro distribudo 3322,04 ppc/img
881447,4
ppc/img
Tempo de processamento 0:10 horas 0:07 horas
Fonte: o autor.