terça-feira, 28 de maio de 2013

Configurações das câmeras

Foi criado um modulo para subscrever as informações das câmeras e as trasformações destas, e que gera um ficheiro com as configurações destas.
As configurações guardadas neste ficheiro são usadas no algoritmo para criar a imagem de perspectiva invertida.
Para escolher a camera a ser usada basta mudar os topicos a serem subscritos no launch file.

segunda-feira, 20 de maio de 2013

Real time Detection of Lane Markers in Urban Streets


Breve descrição

Como o nome indica este algoritmo tem como objectivo a detecção de marcadores de faixa em ambiente urbano.
Este algoritmo encontra-se dividido em várias partes:

1. Perspectiva Invertida

O uso da perspectiva invertida tem como objectivo eliminar o efeito de perspectiva das linhas, ou seja, estas deixam de parecer que convergem para um ponto passando a estar paralelas ente si. O uso desta técnica permite focar a atenção do algoritmo numa dada região da imagem, reduzindo assim os tempos de processamento da mesma.
Para utilizar esta técnica sáo necessários alguns dados, como por exemplo, a transformação entre o referencial do mundo e o da camera, entre outros.

2.  Filtragem

A imagem inverdita é então filtrada usado um filtro gaussiano. Na direcção vertical é usado um filtro de suavisação, e na direcção horizontal a segunda derivada, que é ajustado de acordo com a largura esperada para as linhas das faixas.
Estes filtros estão especialmente ajustados para linhas brancas em fundo preto, linhas estas que são assumidas como sendo os separadores das faixas de rodagem. 

3.  Detecção das linhas

Para a detecção das linhas são usadas duas tecnicas, uma versão simplificadas da Transfomada de Hough para contar o numero de linhas na imagem, seguido de uma iteração usando o método se RANSAC (RANdom SAmple Consensus).
  • A transformada de Hough devolve o valor da soma de cada coluna da imagen filtrada, soma esta que é usada para encontrar o local dos máximos, que será a o mesmo local das linhas na imagem. Estes pontos são usados para representar uma parábola com as posições das linhas. São ainda agrupadas linhas muito próximas, para evitar a multipla deteção das mesmas.
  • Seguidamente obtem-se uma melhor correspondencia usando RANSAC. Cada linha detectada é isolada e volta a ser processada usando novamente RANSAC.

4.  RANSAC - aproximação de curvas

O passo anterior devolve as linhas candidatas, que são depois refinadas por este processo. 
Para cada linha é criada uma janela que envolve a mesma, onde é feita a aproximação da linha encontrada a uma parábola de 3º grau. Para cada processo de aproximação novo são usados os valores da ultima iteração, tentando assim acelerar este processo.

O processo de aproximação está dividido em 3 fases :
  • Obter uma amostra aleatória dos pontos que se encontram dentro da região de interesse. Pontos esses que são obtidos usando uma amostragem ponderada, com pesos proporcionais aos valores dos pixeis da imagem. Isto ajuda a escolher os pixeis mais relevantes, pontos com uma maior probabilidade de pertencerem á linha.
  •  Seguidamente é feita a aproximação da curva, para isso é usado o método dos quadrados minimos. Obtendo-se assim uma amostra de n pontos, atribuindo-lhes um valor de 0 a 1 individualmente, valor este que é proporcional à soma comulativa das distancias euclidianos ao 1º ponto.
  • Num RANSAC normal estariamos interessados em calcular as distancias normais em cada ponto a uma curva de 3º grau , para obter o nivel de correspondencia. Contudo isto implicava resolver uma equação de 5º grau para cada ponto. Em vez disso usou-se um método mais eficiente, calculando o nivel de correspondencia da curva por tetativas sucessivas, usando um processo iterativo eficiente. Contando de se seguida o valor dos pixeis pertencen-tes à curva, onde e tido em conta a lineridade e o comprimento da mesma, penalizando as mais curtas e as mais curvas.

5. Pós-processamento

Neste processo tenta-se obter uma localização mais acertiva da curva e extender a mesma.
Isto é feito tanto na imagem de perspectiva invertida como na imagem original. Depois de feita a projecção invertida das linhas encontradas na perspectiva invertida para a imagem original são realizados 3 passos:
  • Localização: Começa-se por obter pontos pertencentes à curva inicial, onde é traçada outra curva. Pontos estes que são normais á direcçao tangente da nurva neste ponto. Então obtem-se o perfil da escala de cinza esta curva, calculando-se assim o local dos pixeis onde esta linha passa. Pretende-se assim obter uma melhor localização dos pontos pertencentes a curva que melhor tradiz a linha da estrada. É ainda feita a verificação da mudança de angulo feita por este ponto, este novo ponto é rejeitado caso a sua localização seja muito distante da localização prevista para este. Finalmente é feita uma nova aproximação da curva com estes novos pontos esncontrados.
  • Extensão:  Depois da posição da curva ter sido melhorada, é feita a extensão desta nas imagens para se obter uma melhor aproximação á curva. Isto é feito semelhantemente olhando para a frente e para trás a partir dos pontos finais da curva ao longo da direcção tangente, são criados segmentos de linha através da direcção normal, onde são encontrados os pontos de convolução da escala de cinza desses segmentos.
  • Verificação de geometria: Depois dos passos anteriores, é feita uma verificação de geometria nas novas curvas encontradas, para ter a certeza de que estas não são muito curvas ou muito curtas.


Créditos

Este algoritmo dá se pelo nome de "Real time Detection of Lane Markers in Urban Streets" , criado por  Mohamed Aly em parceria com o Computational Vision Lab da California Institute of Technology.

quarta-feira, 8 de maio de 2013

Tamanho da imagem de procura variável

Para variar o tamanho da imagem de procura dinamicamente, foi usado o algoritmo Watershed. Este é um algoritmo de crescimeto de regiões, com base em sementes pré estabelecidas.
Sementes essas que foram definidas partindo do pressuposto de que as imagens obtidas estarão sempre divididas em duas regiões, o céu e a estrada.

Frame original
Regiões segmentadas
Sementes 
 Posteriormente é encontrada a fronteira estre as duas regiões segmentadas, fronteira essa que é utilizada para definir a zona de separação da imagem de procura.

segunda-feira, 6 de maio de 2013

Working poligon

Para que este algoritmo finalmente desse resultados tiveram de ser feitas algumas modificações ao original. Entre as quais, alteração do método de selecção de escolhas das linhas.
Esta alteração deveu-se ao método como é feita a escolha das linhas que representam as marcas na estrada. A função usada em Matlab devolve a matriz dos pontos de acumulação da transformada de Hough, em C++ essa matriz tem de ser construida. Como os erros inerentes á construção dessa matriz seriam bastante grandes, optou-se por usar uma selecção probabilistica. Ou seja, o uso da função do OpenCV "HoughLinesP", função essa que devolve as linhas que melhor cumprem os critérios estabelecidos.
Como é possivel verificar no video, um dos problemas desta função é que nem sempre existem linhas que cumprem esses crtérios, nã devolvendo assim nenhuma linha, por vezes só uma, impossibilitando assim a comparação entre estas. Não sendo assim actualizado o poligno encontrado no frame anterior.


domingo, 21 de abril de 2013

Nesta semana para tentar encontrar erros e simplificar o código foi criada uma class para lidar com os valores obtido pela transformada de Hough.
Esta class converte as coordenadas cartesianas em coordenadas polares , ou seja , as coordenadas do ponto inicial e final do segmento de recta encontrado são transformadas num valor de Theta e Rho que representam uma linha que é coincidente com esse segmento. Nesta class também é possivel encontrar as coordenadas dos pontos de intersecão da linha encontrada com as margens da imagem.

Contactei duas pessoas do cvc devido a um algoritmo desenvolvido lá sobre detecção de marcas em estrada. Ambos responderam ao eu email, contudo a pessoa que fez a parte do trabalho em que eu estou interessado não me disponibilizou o código.

terça-feira, 26 de março de 2013

Lane Departure Warning System" para OpenCV

Migração da demo do Matlab "Lane Departure Warning System" para OpenCV.
Detecções feitas por este algoritmo:
  • Tipo de linha (tracejado/continua).
  • Cor da linha (Amarela/branca).
  • Detecção de mudança de faixa de rodagem.
  • Detecção de saida de estrada.

2ª Semana
Implementação da biblioteca Eigen, para faciclitar o uso de matrizes. Visto que no Matlab o tamanho das matrizes é dinamico, e em C++ é necessário alocar o tamanho das matrizes a usar.
Esta biblioteca facilita o uso das matrizes visto não ser necessário alocar o espaço das matrizes.

3ª Semana
Inicialmente foram usados vectores de vectores e vectores, para replicar as matrizes de tamanho dinamico do Matlab. Visto estas não serem compativeis com a biblioteca usada teve-se de adaptar o código para que fosse possivel estes dois tipos de vectores coexistirem. 

4ª Semana
Neste algoritmo são usadas Hough lines para fazer a detecção das linhas que limitam as faixas de rodagem. Para tornar a detecção das linhas mais eficiente são guardados os valores dos angulos e da distancia do melhor par de Hough lines encontrados nos ultimos sete frames. Este processo é feito no matlab por uma função chamada "videolanematching", contudo em OpenCV não existe a necessidade para tal, pois este processo é feito automaticamente pelas linhas de Hough Probabilisticas. Para usar este método é dado o tamanho e o espaçamento entre as linhas e a confiança que queremos que seja detectada a linha. Sendo devolvido por esta função as coordenadas dos pontos extremos da recta detectada. 
Como é possivel observar na figura acima a braco encontram-se as linhas detectadas pela transformade Hough, e a cheio as linhas devolvidas pelo HoughP. (A detecção das linhas ainda não é feita a 100% ainda falta ajustar alguns parâmetros)

A descoberta desta função substitui grande parte do trabalho realizado nas semanas anteriores



Semana de 11 - 15 de Março


Migração da demo do Matlab "Chroma Based Road Tracking" para OpenCV. 



  • Uso das funções de OpenCV em C++.
  • Publicação/subscrição de mensagens e ROS.

Como é possivel ver nos videos este algoritmo foi convertido para OpenCV com sucesso. Contudo este algoritmo não é aplicavel ao caso do AtlasCar. Pois este algoritmo como o nome indica baseia-se na segmentação por cor. Segmentação essa que é feita de uma maneira muito riguida, não sendo assim aplicável ao nosso caso. Pois as condições de luz, e a cor da estrada estão sempre a variar.