% ------------------------------------------------------------------------------------------------
%  Talking about cloud transformation and filtering
% ------------------------------------------------------------------------------------------------

Retomando o exemplo da nuvem de pontos apresentada na Figura \ref{fig:pointcloud},
obtida numa viagem do ATLASCAR,  é fácil notar que se tratam de dados relativamente 
complexos no que respeita à informação que fornecem. A primeira observação a fazer está na quantidade
de pontos na nuvem. Um \textit{frame} da nuvem de pontos provenientes diretamente da câmara
a uma resolução de 640x480 píxels resulta numa nuvem com 307200 pontos. 
Esta quantidade de informação é elevada
para processamento em tempo real, o que implica a redução de dados como primeira etapa do processamento.
Por outro lado, apesar dos ajustes efetuados aos parâmetros estéreo (secção \ref{subsec:parameters}),
muitas vezes as nuvens de pontos obtidas apresentam zonas com ruído, oriundas de cálculo de más 
correspondências. Portanto, a etapa de filtragem de informação é importante 
para a obtenção de dados coerentes.

\subsection{Transformações geométricas} \label{subsec:transforms}

Antes de proceder aos diversos mecanismos de tratamento de dados, é
necessário estabelecer os sistemas de coordenadas de referência.
No interesse deste trabalho, pretende-se localizar obstáculos relativamente
ao plano do chão, independentemente da localização da câmara e da sua
orientação no veículo. Por este motivo, surge a necessidade da utilização de uma transformação
geométrica do referencial de coordenadas do sensor para o referencial
de coordenadas situado na parte 
frontal do veículo, ( \textit{/atc/vehicle/center\_bumper} na Figura \ref{fig:ref_frames}). 
  
A equação \ref{eq:transforms} permite transformar todos os pontos do 
referencial original para o referencial de destino,

\begin{equation}
\begin{bmatrix}
 x' \\ y' \\ z' \\ 1
\end{bmatrix}
= 
\begin{bmatrix}
r_{11} & r_{12} & r_{12} & t_{1} \\
r_{21} & r_{22} & r_{22} & t_{2} \\
r_{31} & r_{32} & r_{32} & t_{3} \\
0 & 0 & 0 & 1
\end{bmatrix}
%      \times
\begin{bmatrix}
 x \\ y \\ z \\ 1
\end{bmatrix},
\label{eq:transforms}
\end{equation} 

em que as coordenadas $x$,$y$ e $z$ representam um ponto no referencial
da câmara e as coordenadas $x'$,$y'$ e $z'$ representam as coordenadas
desse mesmo ponto no referencial do veículo. A Figura \ref{fig:ref_frames}
representa todos os referenciais dos sensores do ATLASCAR
e a sua nomenclatura.
 
\begin{figure}[h!]
\centering
\includegraphics[width=\textwidth]{Images/frames.eps}
\caption{Sistemas de coordenadas dos sensores.}
\label{fig:ref_frames}
\end{figure}


A programação de um nodo capaz de efetuar esta operação é essencial para os
passos seguintes, já que facilita a medição de coordenadas.
Uma vantagem na utilização desta transformação é que, se por algum motivo for necessário
deslocar a câmara para outra posição, basta atualizar as transformações dos
referenciais da câmara para o referencial situado no centro do para-choques frontal 
(Figura \ref{fig:ref_frames}), eliminando a necessidade
de eventuais alterações nos nodos seguintes de processamento.
Outra vantagem na utilização de um referencial comum para representação
de dados dos diversos sensores é a possibilidade de comparação
e análise entre a informação de cada sensor.

\subsection{\textit{Voxel Grid}} \label{subsec:voxel_grid}

A primeira etapa de filtragem inclui a utilização de uma \textit{voxel grid}, que
consiste na aplicação de volumes elementares (\textit{voxels}) tridimensionais sobre todo o espaço ocupado
pela nuvem de pontos, em que para cada uma
todos os pontos são aproximados pelo centroide do volume elementar. Esta aproximação permite que se faça
uma redução da densidade dos dados, preservando dentro de certos limites a estrutura e suavidade das superfícies.
Como é de prever, quanto maior for a dimensão dos \textit{voxels} do filtro a aplicar na nuvem de pontos,
menor será a quantidade de pontos depois da aplicação do filtro. Contudo, convém lembrar que
se deve manter uma quantidade de informação suficiente que permita uma segmentação coerente para a distinção dos diversos obstáculos.
A Figura \ref{fig:voxel} ilustra alguns resultados da aplicação de filtros desta natureza
em nuvens de pontos retiradas da câmara estéreo durante uma viagem do ATLASCAR.

\begin{figure}[h!]
\begin{minipage}[b]{0.5\linewidth}
\centering
\subfigure[Cenário urbano típico.]
{
  \includegraphics[width=6.5cm]{Images/voxel_0.1.eps}
  \label{subfig:voxel_example}
}
\\
\subfigure[\textit{Voxel} de 0.1 (m).]
{
  \includegraphics[width=6.5cm]{Images/voxel_0.1_cloud.eps}
  \label{subfig:voxel_0.1}
}
\end{minipage}
% qo+wvgkiopvjkqweopbfejqbpqwjip
\begin{minipage}[b]{0.5\linewidth}
\centering
\subfigure[\textit{Voxel} de 0.3 (m).]
{
  \includegraphics[width=6.5cm]{Images/voxel_0.3_cloud.eps}
  \label{subfig:voxel_0.3}
}
\\
\subfigure[\textit{Voxel} de 0.5 (m).]
{
  \includegraphics[width=6.5cm]{Images/voxel_0.5_cloud.eps}
  \label{subfig:voxel_0.5}
}
\end{minipage}
\caption{Exemplo de aplicação de vários tamanhos de \textit{voxel grid}.}
\label{fig:voxel}
\end{figure}

A Figura \ref{fig:voxel} permite compreender um pouco melhor o efeito da aplicação
deste método. É possível reparar que se gera um compromisso entre a quantidade e qualidade
de informação. Se o filtro aplicado constituir \textit{voxels} de proporções elevadas, por exemplo de 0.5 metros, 
perde-se qualidade de dados (repare-se na quantidade de pontos que representa uma pessoa na
Figura \ref{subfig:voxel_0.5}), uma vez que conduz a um número elevado de aproximações.
Por outro lado, se a dimensão do filtro for muito reduzida, o tempo de processamento
pode não justificar a sua aplicação. 
A utilização deste filtro é bastante eficaz
e permite reduzir drasticamente a quantidade de pontos. Para uma estimativa, um filtro
com \textit{voxels} de dez centímetros aplicado à nuvem de pontos (307200 pontos), 
permite reduzir para cerca de 50000 pontos (Figura \ref{subfig:voxel_0.1}).
A principal desvantagem da aplicação deste tipo de filtragem, para além da perda na qualidade
de definição das superfícies, é que o número de pontos final obtido não permanece
constante ao longo do tempo, dependendo do número de aproximações
que a operação de filtragem possa efetuar.

Desta forma, o tamanho da \textit{voxel} que forma o filtro deve ser influenciada
pela relação que se pretende obter entre a qualidade da informação e o processamento.

\subsection{Filtros de distâncias} \label{subsec:distance_filtering}

Na subsecção \ref{subsec:calibration_verification}, relativa a verificação de calibrações,
concluiu-se que a qualidade de informação a partir de, aproximadamente, vinte metros apresenta tendência
para se distorcer e deixa de ser credível. Tal facto sugere, de imediato, a construção de
um filtro de remoção de todos os pontos que se encontrem para além dessa distância.
Atente-se ao pormenor assinalado a verde na Figura \ref{subfig:comidelas}, que representa
o conjunto de pontos de um poste localizado a uma distância superior a vinte metros
do veículo.
Este tipo de informação deve ser descartado, quer pela falta de interesse no processamento de informação
em alturas elevadas, quer pela incerteza que se obtém no cálculo de disparidade.
Outro aspeto que convém referir é no caso de existirem, claramente, pontos que resultaram 
de disparidades mal calculadas. 
Tal facto ocorre com bastante frequência nos ambientes  em que existem superfícies refletoras,
(normalmente veículos de pintura metalizada), 
que refletem a luz solar e originam zonas, normalmente, abaixo do solo
(assinalada a vermelho na Figura \ref{subfig:comidelas}).
Este tipo de efeito pode ser eliminado da mesma forma, ao recorrer a filtros de distâncias.
Por isso, construiu-se um filtro baseado num volume, em que foram descartados todos os pontos que não lhe pertencessem. 

A Figura \ref{fig:filtering} representa um exemplo de aplicação após a filtragem de uma nuvem de 
pontos com \textit{voxels} de tamanho igual a 0.1 (m) e com o filtro de distâncias. 

\begin{figure}[ht]
\begin{minipage}[b]{0.5\linewidth}
\centering
\subfigure[Nuvem de pontos em bruto (\textit{wide baseline}).]
{
  \includegraphics[width=\textwidth]{Images/comidela_cloud.eps}
  \label{subfig:comidelas}
}
\end{minipage}
\begin{minipage}[b]{0.5\linewidth}
\centering
\subfigure[Nuvem de pontos filtrada (\textit{wide baseline}).]
{
  \includegraphics[width=\textwidth]{Images/comidela_filtrada.eps}
  \label{subfig:final_filtering}
}
\end{minipage}
\caption{Exemplo de filtragem com aplicação de \textit{voxel grid} e filtro de distâncias.}
\label{fig:filtering}
\end{figure}

Com o procedimento de filtragem aplicado é possível reduzir significativamente 
a quantidade de pontos das nuvens, facto que constitui um passo essencial
para as etapas posteriores de segmentação.
Com o filtro de distâncias aplicado, consegue-se reduzir dos cerca de 50 mil pontos
obtidos com as \textit{voxels} para cerca de 15 mil pontos.
Em termos de implementação, as dimensões da \textit{voxel grid} e do volume
do filtro de distâncias podem ser alteradas em qualquer momento, recorrendo 
à parametrização disponibilizada pelo ROS.
