• Nenhum resultado encontrado

O software foi desenvolvido utilizando a linguagem de programação C++ em Linux na distribuição Ubuntu versão 10.04. O Linux foi utilizado como sistema operacional pois é uma solução gratuita e possui suporte a biblioteca OPENCV além de ter drivers para diversas câmeras e formatos de vídeos comerciais.

Para o ambiente de desenvolvimento foi utilizado o IDE (Integrated Development Environment) Netbeans versão 6.9.1. Netbeans é uma IDE open-source e free desenvolvida pela Oracle que possui suporte a C++ e facilita o desenvolvimento de um projeto por facilidades de identação de código e organização dos arquivos do projeto.

O compilador utilizado foi o gcc versão 4.4.6. Gcc é o compilador nativo do Linux de código aberto e grátis, capaz de compilar um arquivo escrito em C++ e gerar um executavel. Como auxílio ao desenvolvimento do projeto a biblioteca OPENCV foi utilizada. Esta biblioteca facilita a abertura e manipulação de imagens vindas de arquivos de vídeo e câmeras.

O OPENCV foi selecionado por ser uma biblioteca mundialmente utilizada em softwares que realizam processamento de imagem, além de ser uma biblioteca aberta com licensa grátis para uso, facilmente encontrada e utilizada no ambiente Linux com uma documentação extensa sobre seu uso. Sem esta biblioteca seria necessário implementar protocolos de leitura e escrita de imagens, drivers para efetuar a leitura de imagens vindas de uma câmera entre outras funcionalidades básicas de manipulação de imagem que fogem ao escopo do projeto.

A biblioteca OPENCV trabalha com uma estrutura de dados de imagem denominada IplImage (Image Processing Library). A IplImage é a estrutura básica de imagens que o OPENCV utiliza na manipulação de imagens e videos. Os campos desta estrutura podem ser vistos na Figura 15.

O número de canais da imagem é representado por um inteiro, imagens RGB possuem três canais sendo um para o vermelho, um para o verde e um para o azul. O tamanho da imagem é representado pelas variaveis width e height que informam respectivamente a largura e altura da imagem em pixeis. O ponteiro imageData aponta para a região de memória em que a matriz de pixeis se encontra dentre outros atributos fornecidos pela estrutura de dados.

As funções utilizadas da biblioteca OPENCV foram cvCaptureFromAVI que recebeu como parâmetro o caminho para a fonte da captura, seja ela uma câmera ou um arquivo de vídeo, e retorna um tipo cvCapture utilizado pelo OPENCV como uma abstração da fonte de captura das imagens, não importando mais se as imagens estão vindo de uma câmera ou arquivo de vídeo.

A função cvRetrieveFrame passa um cvCapture como parâmetro e retorna um frame da imagem no formato IplImage. Também é possivel criar uma imagem com o comando cvCreateImage e destrui-la com o comando cvReleaseImage passando como parâmetro o ponteiro para a imagem. O cvShowImage é a função responsavél por mostrar na tela uma imagem do tipo IplImage.

Figura 15. Estrutura de dados IplImage fornecida pelo OPENCV.

Foram utilizadas funções do OPENCV para abrir a imagem e capturar um frame. Após a obtenção de um frame foi utilizada a função cvGet2D para abrir uma imagem de forma a obter sua matriz de pixel. Um vídeo é uma sequencia de imagens, após ter os dados de uma imagem foi necessário realizar um laço de repetição para ler todos os frames de um vídeo até o mesmo acabar.

O laço principal pode ser visto na Figura 16.

Figura 16. Laço principal do software.

Após o vídeo ser lido por completo as operações necessárias para chegar ao objetivo deste trabalho foram implementadas, como pode ser visto na Figura 16 e são elas: a) Correção da perspectiva de imagem representada pela função perspectivaimagem, b) Re-dimensionamento da imagem representada pela função resizeImage, c) Subtração de fundo representado pela função subtração e d) o filtro de sobel representado pela função Sobel_ind_fast.

O software foi desenvolvido de forma modular, o que torna possível mudar o algoritmo que implementa funções como a subtração de fundo, ou a correção de perspectiva de forma fácil, sendo necessário somente que as novas implementações tenham como entrada uma IplImage e como retorno uma IplImage. A implementação dos algoritmos utilizados neste software será detalhada ao longo da seção.

Primeiramente foi necessária a correção de perspectiva da imagem para que um veículo tenha o mesmo tamanho em todo o percorrer do video, sem a correção de perspectiva da imagem tudo ficaria mais dificil pois quando temos a câmera em um determinado ângulo os veiculos variam o tamanho, quando próximos da câmera tem um tamanho maior do que quando estão longe da mesma, sendo assim, a classificação é dificultada, a Figura 17 ilustra o problema da variação do tamanho do veículo, como pode ser visto o carro quando aparece na cena está pequeno e quando sai da cena está grande.

Figura 17. Comparação tamanho do carro início e final da imagem.

Para se realizar a correção de perspectiva da imagem são necessárias algumas informações.

Primeiramente é necessário definir para o software a região de interesse da imagem. Neste contexto a região de interesse é o local onde o algoritmo aplica a correção de perspectiva. São esperados quatro pontos na imagem, cada um com a sua coordenada (X,Y). Um exemplo pode ser visto na Figura 18, no qual suas coordenadas (160,86); (46,368); (270,371); e (295,88) representam respectivamente P1,P2,P3 e P4, ou seja, os vértices do retângulo da área de interesse.

Figura 18. Região de interesse e passagem de parâmetros.

Além disso é necessario passar a distância entre os ponto P1 e P2 em metros para que se faça a relação pixel-metro da imagem, sabendo assim quantos pixeis da imagem representam quantos metros de fato na via, na Figura 18 o valor 9 é passado por parâmetro. Após fornecidos esses dados ao programa cada frame obtido a partir do laço inicial passa pela função de perspectiva de imagem, a qual gera uma imagem de saída corrigida, como por exemplo a Figura 19 do lado direito.

Figura 19. Resultado da função de correção de perspectiva.

Após a correção de imagem ser realizada a função de redimensionamento da imagem reduz o tamanho da imagem do tamanho original para o tamanho 380x260. Esta é uma forma simples de se reduzir o custo computacional visto que o tamanho 380x260 se dá pelo fato de que realizar operações de PDI em uma imagem com grandes resoluções acarreta em um processamento computacional maior. A saída da operação de redimensionamento pode ser vista na Figura 20.

Figura 20. Operação de redimensionamento da imagem.

O próximo passo é a aplicação do algoritmo de subtração de fundo pela média adaptativa sobre a imagem. Este algoritmo foi utilizado por ser mais robusto em relação a variações no cenário e de iluminação, ele é capaz de atualizar o modelo de fundo a cada frame processado. Para estimar o fundo, utilizou-se uma taxa de aprendizado α que indica quanto o frame atual “i” influencia no modelo do fundo atual, além de não necessitar guardar a imagem em memória o que é essencial para aplicações embarcadas, visto que memoria é um componente caro do sistema e a tendência é de que sistemas embarcados possuam pouca memória.

O algoritmo recebe um frame de entrada e caso ele não esteja em tons de cinza realiza a transformação de RGB para tons de cinza visto que cores são irrelevantes para o objetivo deste trabalho e consumem três vezes mais processamento já que é necessário processar os canais R,G e B ao invés de um único canal em tons de cinza. A transformação é utilizada multiplicando o valor de R, G e B por 0,114; 0,587; e 0,299 respectivamente. Estes valores se dão pela sensibilidade do olho humano as cores vermelha, verde e azul.

Com a imagem em tons de cinza os frames de entrada formam um modelo de fundo da imagem, sendo que cada frame de entrada corresponde a um pequeno percentual do modelo de fundo da imagem. A imagem de saída da função de subtração de fundo é representada na Figura 21.

Figura 21. Resultado da subtração de fundo.

Após o processo de subtração de fundo a imagem é separada em preto e branco. Sendo branco o que não faz parte do fundo (objetos de interesse) e preto o próprio fundo. Para melhor análisar os objetos é aplicado o filtro de sobel sobre a imagem vinda da subtração de fundo. As partes brancas vindas da subtração de fundo são divididas em vários objetos, como por exemplo, retrovisor, parabrisa e etc.

É necessário transformar tudo em um objeto só para que se torne um veiculo ao invés de um conjunto de objetos, para isso um bounding box em volta dos objetos é desenhado. O quadrado é desenhado traçando uma linha a partir do objeto com a menor coordenada (X,Y) e a maior coordenada (X,Y) dos objetos na tela e realiza o ligamento dos pontos, com isso temos o que o sistema entende por um veículo. Os veículos são classificados com base no cálculo da área de cada objeto.

Um outro processo ocorre em paralelo dentro da função de sobel para o cálculo da velocidade média, duas marcas são feitas na imagem, uma inicial e uma final. Quando um objeto passa pela marcação inicial é iniciada a contagem de frames até o veículo passar pela marcação final. Quando o veículo passa pela marcação final o número total de frames que o veículo demorou para passar entre as marcações é dividida pela taxa de frames por segundo do vídeo. Esta relação provê a taxa da velocidade média em frames por segundo, é possível transformar em metros por segundo visto que é sabida a distância em metros do ponto inicial e final e que frames por segundo dividido pela taxa de FPS retorna a quantidade de segundos. Como a velocidade é medida em km/h

é necessário fazer a conversão multiplicando o valor obtido em metros/segundo por 3,6 é obtida a velocidade média do veículo em km/h. O sistema também dispõe de um arquivo de log que registra todas as classificações dos veículos e velocidades médias encontradas. A Figura 22 demonstra as marcações iniciais e finais, o quadrado desenhado em volta dos objetos e a velocidade média obtida.

Figura 22. Cálculo de velocidade média e classificador de veículos.

A fim de testar o software experimentos foram realizados e esses podem ser visto no capítulo de experimento enquanto os resultados obtidos através destes experimentos estão no capítulo de resultados.

No documento universidade do vale do itajaí - Univali (páginas 42-49)

Documentos relacionados