% ------------------------------------------------------------------------------------------------
%  A brief camera calibration description
% ------------------------------------------------------------------------------------------------

A calibração consiste na determinação da relação 
entre os referenciais do plano da imagem, da câmara e do mundo. \cite{3D}.
Este passo é necessário para assegurar a continuidade do trabalho
uma vez que é responsável pela determinação da relação
entre o mundo e o sensor. As subsecções seguintes
descrevem as etapas necessárias para efetuar a calibração
de câmaras, e como a calibração pode ser feita
para o caso específico da \textit{Bumblebee Xb3}.

\subsection{Modelo de câmara e propriedades óticas}

O modelo de câmara adotado é o \textit{pinhole} no qual a câmara
é representada pelo seu centro ótico, situado entre o 
espaço tridimensional e o plano da imagem; e pelo eixo
ótico, perpendicular ao plano da imagem e que passa
pelo centro ótico. O ponto de intersecção
entre o eixo ótico e o plano da imagem denomina-se 
por ponto principal. A distância do ponto principal
ao centro ótico é designada por distância principal \cite{3D}.
A figura \ref{fig:pinhole_model} ilustra o modelo de câmara
\textit{pinhole} para melhor compreensão da geometria envolvida.

\begin{figure}[h!]
\centering
\includegraphics[scale=1.0]{Images/camera_model.eps}
\caption{Modelo de câmara \textit{pinhole} \cite{3D}.}
\label{fig:pinhole_model}
\end{figure}

A transformação entre a 
lente da câmara e o plano da imagem (\ref{fig:pinhole_model}) é caracterizada pela 
matriz intrínseca da câmara (expressão \ref{eq:intrinsic}).

\begin{equation}
A=
\begin{bmatrix}
\alpha_x & \gamma    & u_0  \\
    0    &  \alpha_y & v_0  \\
    0    &     0     & 1
\end{bmatrix}
\label{eq:intrinsic}
\end{equation}

Os coeficientes $\alpha_x$ e $\alpha_y$ representam
a distância focal, o coeficiente $\gamma$
é o coeficiente de torção entre \textit{x} e \textit{y}, e os parâmetros
$u_0$ e $v_0$ representam o ponto principal \cite{3D}.
A matriz intrínseca é independente do cenário em 
que a câmara se encontra e uma vez estimada pode ser reutilizada,
desde que a distância focal não se altere (no caso de câmaras com zoom).

Para a descrição do movimento entre a câmara e o cenário, utiliza-se
a matriz dos parâmetros extrínsecos, que representa uma translação e
uma rotação, ou seja, a transformação entre o referencial do mundo
e o referencial da câmara \ref{fig:pinhole_model}.

\begin{equation}
R=
\begin{bmatrix}
    r_{11} & r_{12} & r_{13}  & t_{1}  \\
    r_{21} & r_{22} & r_{23}  & t_{2} \\
    r_{31} & r_{32} & r_{33}  & t_{3}
\end{bmatrix}
\label{eq:extrinsic}
\end{equation}

Desta forma é possível estabelecer a relação entre
as coordenadas de pontos do referencial do mundo \textit{W}
e o referencial da imagem \textit{I} (figura \ref{fig:pinhole_model}), 
através da expressão \ref{eq:camera}.

\begin{equation}
 \begin{bmatrix}
  u \\ v \\ 1
 \end{bmatrix}
=A \times R \times
 \begin{bmatrix}
  X \\ Y \\ Z \\ 1
 \end{bmatrix}
\label{eq:camera}
\end{equation}

A determinação das matrizes intrínsecas e extrínsecas 
é essencial para poder efetuar uma representação de 
imagens coerente. Desta forma, é necessário recorrer a 
um procedimento de calibração de câmaras para estimar 
todos os parâmetros envolvidos pela aplicação inversa
da equação \ref{eq:camera}, ou seja, determinar os parâmetros 
da câmara a partir de dados conhecidos do mundo.

\subsection{Procedimento} \label{subsec:procedure}

% Na secção anterior, acerca da integração da xb3
% com a plataforma ROS, refere-se a necessidade da utilização
% dos coeficientes de distorção dos CCD's bem como das matrizes
% de retificação, projeção e intrínsecas. Estes parâmetros são variáveis
% para cada câmara estéreo e para cada lente inclusive. Por isso é necessário
% estimar os seus valores, ou seja, calibrar a câmara.

A calibração pode ser feita recorrendo a um módulo de ROS desenvolvido
propositadamente para câmaras estéreo (\textit{stereo\_image\_proc}). Teoricamente, a calibração pode
ser feita com um algoritmo de visão sobre um objeto qualquer, contudo o
módulo de calibração do ROS está preparado para reconhecer zonas de elevado
contraste, normalmente um tabuleiro de xadrez de fundo branco com 8x6 zonas
de reconhecimento impresso em tamanho A4 ou A0.
Para proceder à calibração basta executar o módulo de software configurado com as medidas
do tabuleiro e deslocá-lo em frente à câmara de forma a obter imagens de 
diferentes perspetivas. A figura \ref{fig:calibration_example} ilustra a
interface do software de calibração utilizado. Como se pode reparar na imagem,
o módulo reconhece os cantos do tabuleiro e sabendo a distância entre eles é
possível determinar os parâmetros de calibração. 

% \todo{A imagem está desatualizada}
\begin{figure}[h!]
\centering
\includegraphics[scale=0.3]{Images/calibrator.eps}
\caption{Interface do software de calibração.}
\label{fig:calibration_example}
\end{figure} 

Para obter uma calibração de boa qualidade da câmara não basta mover o tabuleiro
aleatoriamente, deve garantir-se que o software retira exemplares por todo o campo de visão
horizontal e vertical (\textit{X} e \textit{Y} respetivamente). 
É necessário também variar o ângulo de visão, ou seja, inclinar o tabuleiro nas 
diversas direções. Por fim, deve-se ainda garantir que o tabuleiro é visto em todo o
campo de profundidade, ou seja, aproximar e afastar o máximo possível da câmara.
Para facilitar esta tarefa, o módulo de software apresenta quatro barras de progresso
que indicam o estado de aquisição de dados para calibração. Para os campos de visão horizontal, 
vertical e de profundidade as barras são representadas por \textit{X} , \textit{Y} e \textit{size}, respetivamente. 
A barra \textit{skew} representa os ângulos de rotação do tabuleiro. (figura \ref{fig:calibration_example}).
Quando as barras de progresso estão no máximo ou próximo, executa-se o algoritmo de calibração
para processar as imagens e estimar todos os parâmetros de calibração. 

Ao fim de alguns segundos é possível verificar os parâmetros de calibração resultantes
bem como as imagens retificadas e alinhadas.

% \todo{A imagem está desactualizada}
\begin{figure}[h!]
\centering
\includegraphics[scale=0.3]{Images/calibrator_end.eps}
\caption{Exemplo de resultado da calibração estéreo.}
\label{fig:calibration_result}
\end{figure} 

A figura \ref{fig:calibration_result} exemplifica um resultado de calibração
de um par estéreo. Para além das matrizes intrínsecas e extrínsecas, o módulo calibra 
a geometria das imagens, de forma a que cada pixel da imagem 
da esquerda corresponda exatamente com a mesma coordenada em \textit{Y} na imagem da direita.
Finalmente, guardam-se os resultados em ficheiros
de extensão .yaml para posterior utilização.


\subsection{Calibração na Bumblebee xb3} \label{subsec:calibration_xb3}

Como mencionado na secção \ref{sec:description}, o sensor estéreo utilizado possui
três câmaras distintas, o que resulta em dois pares estéreo diferentes (figura \ref{fig:xb3_blocks}).
Este facto constitui um pequeno problema quando é necessário calibrar a câmara através
do módulo disponível em ROS, uma vez que o software está preparado e otimizado para
câmaras estéreo convencionais (duas lentes), e não para câmaras mais complexas como 
esta. Uma forma de ultrapassar esse problema seria refazer o software de calibração 
para a \textit{xb3}, processo que não foi realizado por ser demasiado moroso. 
Numa fase inicial, optou-se por calibrar um par estéreo de cada vez, como se fossem 
duas câmaras estéreo individuais. Contudo, a sobreposição de dados dos dois pares revelou alguma 
discrepância, de certa forma causada pela utilização de imagens de calibração diferentes. 
Na tentativa de resolver o problema observado com este procedimento, experimentou-se a calibração em 
simultâneo, ao executar duas instâncias do software e desta forma garantir que as
imagens para o cálculo dos coeficientes fossem semelhantes.
A segunda abordagem de calibração, embora não tenha resolvido totalmente o problema
reduziu significativamente as diferenças obtidas relativamente ao cálculo de disparidades.

\subsection{Verificação da calibração} \label{subsec:calibration_verification}

% \todo{Reavaliar a secção de verificação de calibrações (qualitativo/quantitativo)}

Depois de realizadas as calibrações, é necessário testar a qualidade e o erro obtido
no processo. Para o caso particular da xb3 é ainda necessário testar quais as diferenças
entre os \textit{baselines} e conferir a sua precisão. Esta verificação é necessária
para estimar o \textit{baseline} mais adequado para cada situação.

Para  validar corretamente  os resultados de calibração, é 
necessário recorrer a uma verificação direta dos resultados com medições,
ou seja, por \textit{ground truth}. Essa verificação consiste numa
montagem experimental, onde se colocam alguns objetos de dimensões e distâncias 
conhecidas para poder comparar a informação dada pelo sensor com a informação real.
Para tal, duas experiências foram realizadas: uma para a verificação de distâncias
em profundidade e regularidade de superfícies; e outra para verificação de distâncias em largura e altura. 
A figura \ref{fig:verification} esquematiza a forma como foi montado o cenário 
para a avaliação dos dados da câmara em profundidade e regularidade de superfícies. 

\begin{figure}[h!]
\centering
\includegraphics[scale=0.3]{Images/verification_depth.eps}
\caption{Montagem da verificação: Profundidade e superfície.}
\label{fig:verification}
\end{figure} 

O primeiro ensaio consistiu essencialmente na avaliação da distância em profundidade
de um determinado obstáculo da câmara e na qualidade das superfícies. Neste caso, a câmara 
foi direcionada paralelamente para um edifício, fazendo variar a distância \textit{d} (figura \ref{fig:verification}). 
Desta forma é possível comparar a eficácia de medição dos \textit{baselines}, saber qual o 
mais adequado e qual o limite onde a informação é credível.
A experiência permite ainda avaliar a regularidade de superfícies, já que se trata de uma parede plana.
A tabela \ref{tab:verification_1_obs} descreve sucintamente as observações verificadas ao longo da experiência.

% \begin{table}[h!]
% \centering
% \resizebox{\textwidth}{!}{
% \begin{tabular}{cc|p{6cm}|p{6cm}|}
%  \cline{3-4}
%  & &  \multicolumn{2}{|c|}{\textbf{Baseline}}  \\ \cline{3-4} 
%  & &  \multicolumn{1}{|c|}{\textbf{short}} & \multicolumn{1}{|c|}{\textbf{wide}} \\ \hline 
% \multirow{6}{*}{ \rotatebox{90}{ \textbf{Distância d (m) \ \ \ }} \vline }
%  & 5  & Boa densidade na nuvem de pontos. Precisão na distância. Obstáculo plano.  & Pouca densidade na nuvem de pontos. Precisão na distância. Obstáculo plano. \\ \cline{2-4}
%  & 10 & O obstáculo não fica representado paralelamente ao eixo do veículo como seria suposto.  & O obstáculo permenece paralelo ao eixo do veículo. Precisão na distância. Obstáculo plano. \\ \cline{2-4}
%  & 15 & Obstáculo deformado. Falta de paralelismo ao eixo do veículo.  & Alguma distorção na representação. Planeza do obstáculo reduzida. \\ \cline{2-4}
%  & 20 & Dificuldade em perceber o obstáculo. Excesso de deformação.  & Obstáculo com bastante distorção mas percetível. \\ \hline
% \end{tabular}}
% \caption{Resultados da verificação: Profundidade e superfície.}
% \label{tab:verification_1_obs}
% \end{table}


\begin{table}[h!]
\centering
\resizebox{\textwidth}{!}{
\begin{tabular}{cc|p{6cm}|p{6cm}|}
 \cline{3-4}
 & &  \multicolumn{2}{|c|}{\textbf{Baseline}}  \\ \cline{3-4} 
 & &  \multicolumn{1}{|c|}{\textbf{short}} & \multicolumn{1}{|c|}{\textbf{wide}} \\ \hline 
 \multicolumn{1}{|c|}{\multirow{4}{*}{ \rotatebox{90}{ \textbf{Distância d (m) \ \ \ }} }}   
						    & 5  & Boa densidade na nuvem de pontos. Precisão na distância. Obstáculo plano.  & Pouca densidade na nuvem de pontos. Precisão na distância. Obstáculo plano. \\ \cline{2-4}
 \multicolumn{1}{|c|}{\multirow{4}{*}{}}    	    & 10 & O obstáculo não fica representado paralelamente ao eixo do veículo como seria suposto.  & O obstáculo permenece paralelo ao eixo do veículo. Precisão na distância. Obstáculo plano. \\ \cline{2-4}
 \multicolumn{1}{|c|}{\multirow{4}{*}{}} 	    & 15 & Obstáculo deformado. Falta de paralelismo ao eixo do veículo.  & Alguma distorção na representação. Planeza do obstáculo reduzida. \\ \cline{2-4}
 \multicolumn{1}{|c|}{\multirow{4}{*}{}}	    & 20 & Dificuldade em perceber o obstáculo. Excesso de deformação.  & Obstáculo com bastante distorção mas percetível. \\ \hline
\end{tabular}}
\caption{Resultados da verificação: Profundidade e superfície.}
\label{tab:verification_1_obs}
\end{table}

Desta atividade experimental verificou-se que
o \textit{wide baseline} permite resultados mais precisos em toda a gama de 
observações. Contudo para distâncias inferiores a aproximadamente cinco metros 
o \textit{short baseline}
permite obter uma nuvem de pontos com maior densidade, o que pode
ser vantajoso para certas aplicações, por exemplo, situações em que se pretenda uma grande definição
de pontos para caracterização de objetos.

Avaliada a eficácia da medição em profundidade, realizou-se um método semelhante
para caracterizar e avaliar a medição nas restantes dimensões, isto é, largura e altura.
No segundo ensaio colocaram-se dois objetos semelhantes e de dimensões conhecidas, afastados de
dois metros numa linha paralela ao eixo do veículo. 
A figura \ref{fig:verification_2_obs} representa a montagem efetuada.

\begin{figure}[h!]
\centering
\includegraphics[scale=0.3]{Images/verification_2.eps}
\caption{Montagem da verificação: Altura, Largura}
\label{fig:verification_2_obs}
\end{figure} 

O objetivo deste ensaio é a avaliação da medição da distância horizontal entre os
dois objetos colocados, bem como a sua altura.
De forma equivalente ao ensaio anterior, realizaram-se quatro testes a distâncias variáveis.
Na tabela \ref{tab:verification_2_obs}, estão listados de forma resumida os resultados dos ensaios.

\begin{table}[h!]
\centering
\resizebox{\textwidth}{!}{
\begin{tabular}{cc|p{6cm}|p{6cm}|}
 \cline{3-4}
 & &  \multicolumn{2}{|c|}{\textbf{Baseline}}  \\ \cline{3-4} 
 & &  \multicolumn{1}{|c|}{\textbf{short}} & \multicolumn{1}{|c|}{\textbf{wide}} \\ \hline
 \multicolumn{1}{|c|}{\multirow{4}{*}{}}   
						    & 5  & Distâncias e altura próximas, com um erro aproximado de cerca de $\pm0,10 (m)$.          &  Distâncias e altura próximas, com um erro aproximado de cerca de $\pm0,05 (m)$.  \\ \cline{2-4}
 \multicolumn{1}{|c|}{\multirow{4}{*}{\begin{sideways} \textbf{Distância (m)} \end{sideways}}}    	    
						    & 10 & Os obstáculos apresentam alguma falta de paralelismo. Erros da ordem dos $\pm0,15 (m)$   &  Distâncias e altura próximas, com um erro aproximado de cerca de $\pm0,08 (m)$. \\ \cline{2-4}
 \multicolumn{1}{|c|}{\multirow{4}{*}{}} 	    & 15 & Excesso de speckling. Não é possível medir a altura com precisão. Erros de cerca de $\pm0,30 (m)$  & Ligeiro efeito de \textit{speckling}, erros da ordem dos $\pm0,12 (m)$ \\ \cline{2-4}
 \multicolumn{1}{|c|}{\multirow{4}{*}{}}	    & 20 & Excesso de speckling e irregularidades. Os obstáculos acabam por se fundir com o chão. & Excesso de \textit{speckling} para objectos de pequenas dimensões. Erro aproximado de $\pm0,20 (m)$  \\ \hline
\end{tabular}}
\caption{Resultados da verificação: Altura, Largura}
\label{tab:verification_2_obs}
\end{table}

Os resultados qualitativos desta experiência foram semelhantes aos do ensaio anterior. 
O \textit{wide baseline} revelou resultados mais coerentes, 
sobretudo a distancias superiores a dez metros. 
O \textit{short baseline} mostrou melhor definição nas superfícies para distâncias inferiores a 5 metros, 
uma mais valia quando se pretende realizar o reconhecimento de superfícies para deteção de obstáculos. 
Os ensaios realizados, permitiram verificar a qualidade do processamento estéreo obtido, bem como a dificuldade que existe
em efetuar medições, sobretudo para distâncias elevadas em que o erro no cálculo de disparidades é maior.

\subsubsection{Medições em altura e \textit{speckling}} \label{subsubsec:speckling}

O fenómeno de \textit{speckling}, mencionado na tabela \ref{tab:verification_2_obs}, 
resulta da aplicação do algoritmo estéreo sobre as imagens. 
O fenómeno descreve-se pela representação inclinada de obstáculos em vez da representação 
vertical que seria de esperar. A figura \ref{fig:speckling} traduz
a forma como o fenómeno ocorre e a sua variação consoante a distância.
Ao analisar a imagem pode-se observar que o obstáculo assinalado a vermelho
apresenta um efeito de \textit{speckling} mais elevado que o obstáculo
assinalado a verde. O efeito surge em zonas onde, no mesmo agrupamento 
de píxels, existem zonas próximas e distantes, ou seja, nas arestas das superfícies 
e nos objetos finos. Nestes últimos (como um poste, um pino de marcação de estrada ou qualquer objeto
com a mesma estrutura), o efeito  de \textit{speckling} apresenta tendência para se agravar,
em que este tipo de obstáculos deixa de ser representado na vertical.
Os motivos pelos quais este efeito tem tendência de se agravar
encontram-se detalhados adiante, na subsecção \ref{subsubsec:disparity} sobre cálculo de correspondência
estéreo.

% Através dos parâmetros estéreo referidos na secção \todo{referencia cruzada}
% é possível ajustar os parâmetros xxx e xxx para tentar reduzir este efeito.
% Basicamente os parâmetros ajustam o tamanho dos filtros envolvidos após
% o cálculo de disparidade. Contudo convém salientar que ao aumentar o tamanho
% dos filtros, podem-se perder por exemplo objectos de dimensões mais reduzidas,
% por exemplo no caso do ATLASCAR, perde-se a visibilidade de postes pinos
% de marcação de estrada.
A figura \ref{fig:speckling} ilustra o fenómeno de \textit{speckling} 
em pinos de marcação de estrada para distâncias elevadas.

\clearpage

\begin{figure}[h!]
\centering
\includegraphics[width=\textwidth]{Images/speckling.eps}
\caption{\textit{Speckling} em pinos de marcação de estrada.}
\label{fig:speckling}
\end{figure} 

O efeito manifesta-se também em contornos de obstáculos como 
exemplificado na figura \ref{fig:speckling_2}. Neste caso,
o efeito pode ser grave uma vez que o conjunto de pontos na nuvem
que resultam do \textit{speckling} unem os diversos obstáculos,
o que dificulta o processo de segmentação.

\begin{figure}[h!]
\centering
\includegraphics[width=\textwidth]{Images/speckling_2.eps}
\caption{\textit{Speckling} em arestas de obstáculos.}
\label{fig:speckling_2}
\end{figure} 


% \begin{figure}[h!]
% \centering
% \subfigure[Pinos de marcação de estrada]
% {
%   \includegraphics[width=\textwidth]{Images/speckling.eps}
%   \label{subfig:speckling_1}
% }
% \subfigure[Tejadilho de um veículo.]
% {
%   \includegraphics[width=\textwidth]{Images/speckling_2.eps}
%   \label{subfig:speckling_2}
% }
% \caption{Fenómenos de \textit{speckling}.}
% \label{fig:speckling}
% \end{figure}


Os ensaios realizados acerca dos \textit{baselines} da câmara aplicada especificamente no ATLASCAR permitiram observar que:

\begin{itemize}
 \item O \textit{short baseline} apresenta resultados credíveis apenas para distâncias inferiores a cerca de 
cinco metros a partir da zona frontal do veículo (para choques).
 \item O \textit{wide baseline} fornece uma maior precisão em todo o alcance da nuvem de pontos,
contudo, para distâncias mais próximas, a densidade de pontos é menor.
 \item A partir de cerca dos vinte metros, a informação torna-se demasiado distorcida
para ambos os \textit{baselines} e deixa de ser credível.
 \item A partir de
\end{itemize}

Para finalizar esta fase de classificação dos \textit{baselines}, pode-se afirmar que para
o uso particular no ATLASCAR interessa a medição e classificação de obstáculos a distâncias
superiores a cerca de três metros, por isso é de maior relevância a utilização do \textit{wide baseline}. 
A utilização ideal da câmara nestas circunstâncias, seria o \textit{short baseline}
até cerca de cinco metros e a do \textit{wide baseline} dos cinco aos vinte metros. Contudo, 
essa utilização implica um custo computacional bastante mais elevado, uma vez que é necessário
recorrer ao cálculo estéreo de duas nuvens de pontos em vez de uma, e à partida descartar a maior parte
da informação.
Em termos comparativos, utilizar os dois \textit{baselines} implica dispender mais do dobro do tempo
que seria necessário para processar os dados de um \textit{baseline}, já que é necessário calcular o
dobro de disparidades e processar as nuvens de pontos para fundir a informação.
Essa utilização condiciona à partida a eficácia do processamento a nível computacional.