Professional Documents
Culture Documents
Vitória-ES
10 de fevereiro de 2010
Clebson Joel Mendes de Oliveira
Orientador:
Profa . Dra . Raquel Frizera Vassallo
Vitória-ES
10 de fevereiro de 2010
Monografia de Projeto Final de Graduação sob o tı́tulo “Reconhecimento de Lugares em
Ambientes Externos Através dos Descritores Visuais SURF e Textura”, defendida por Clebson
Joel Mendes de Oliveira e aprovada em 10 de fevereiro de 2010, em Vitória, Estado do Espı́rito
Santo, pela banca examinadora constituı́da pelos professores:
Considering the challenges of Mobile Robotics and the current tendency to work with out-
door environments, this work proposes the development of an application to recognize places
using images, through the visual descriptors SURF e Texture.
The developed application generates in real-time the similarity function that allows rec-
ognizing places. In order to test the proposed approach, a map of the environment was built
offline using a firewire camera. Latter on some new images were captured and compared to
map images in real-time using the developed application.
Dedicatória
A Deus por ter me dado força e clareza nos momentos em que não era possı́vel contar com
o apoio de outras pessoas.
A Christiano Couto Gava (Cricri) pela ideia original, pelo apoio e por toda paciência que
teve comigo durante o desenvolvimento deste trabalho, pois jamais deixou de responder meus
emails cheios de dúvidas e questionamentos, mesmo atolado de trabalho lá na Alemanha.
A Gilberto Alves Santos Segundo (Gilzinho), por ter compartilhado comigo muitos proble-
mas que aconteceram durante o desenvolvimento deste trabalho, por todas as conversas irrever-
entes e por ter me ensinado quase tudo que sei sobre Linux.
A Júlio Storch Dalfior (Chulhão), por ter sido um grande parceiro nas atividades desenvolvi-
das tanto no LAI quanto no PET. Afinal, conseguimos construir o Primeiro Time de Futebol de
Robôs Capixaba, mesmo que ainda seja necessário evoluir bastante.
À minha famı́lia, por ter me dado 100% de apoio durante o desenvolvimento deste trabalho,
pois fez de tudo para não me atrapalhar durante os dias e noites que estive em casa escrevendo.
Agradeço à minha mãe em especial por ter estado sempre presente ao meu lado, acompanhando
todos os passos do trabalho e dividindo angústias e felicidades.
Ao grupo PET-Engenharia de Computação da UFES por ter cedido o espaço para que eu
pudesse desenvolver o trabalho de forma confortável, e por ter me dispensado de algumas re-
uniões para realização de experimentos.
Aos colegas de laboratório, tanto do PET quanto do LAI, que estavam sempre dispostos a
bater papo e a ajudar, sempre perguntando sobre o andamento do trabalho e dando uma palavra
de conforto. Em especial, a Flávio, Gilberto, Rafael e Ebenézer por terem me ajudado com os
experimentos.
E por último, por ser mais difı́cil de escrever, à Raquel Frizera Vassallo por inúmeras coisas.
Pela orientadora maravilhosa que é, pois me deixa livre para pensar e depois ajuda a por em
prática os “devaneios” concebidos; por todas as vezes que me esperou depois da hora marcada
para as reuniões, por conta dos meus atrasos; e por ser amiga antes de ser orientadora, pois isso
faz com que o desenvolvimento do trabalho seja muito mais prazeiroso.
Sumário
Lista de Figuras
Lista de Tabelas
1 Introdução p. 13
3 Reconhecimento de lugares p. 18
3.1.1 SURF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 18
4 Implementação p. 24
5 Resultados experimentais p. 30
Referências Bibliográficas p. 43
A.1 Modificado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 44
A.2 Desenvolvido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 47
B.1 Câmera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 67
B.2 Lente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 67
B.3 Tripé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 68
B.5 Notebook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 68
B.2 Lente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 67
B.3 Tripé. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 68
B.4 Adaptador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 68
1 Introdução
Os esforços realizados para conseguir que um robô navegue de forma autônoma geraram
muitas contribuições para a navegação robótica em ambientes estruturados ou semi-estruturados,
podendo-se citar a navegação através de laser, ultra-som e câmeras. Porém, quando se trata de
ambientes externos1 (não estruturados e com iluminação natural) algumas ferramentas exis-
tentes não funcionam ou não apresentam um bom desempenho, considerando que esses am-
bientes apresentam caracterı́stica bem mais complexas do que os ambientes internos, que são
construı́dos pelo homem e na maioria das vezes objetivam a regularidade e praticidade. Assim,
é necessário uma abordagem diferente para tratar a navegação em ambientes externos.
Como o problema da navegação é composto por três problemas base : Controle, Mapea-
mento e Localização, que são interdependentes e complexos, este trabalho tem por objetivo
contribuir para a Localização Robótica em ambientes externos, através do uso de técnicas de
Visão Computacional. Como ponto de partida, foi utilizado o trabalho realizado em [1], pois
nele é proposto um modelo para extração de caracterı́sticas de ambientes através do uso de
descritores visuais, como SURF e Textura, e a combinação destas caracterı́sticas, não neces-
sariamente visuais, com o objetivo de identificar ambientes de forma robusta.
1 Neste texto as palavras externo(s) e externa(s) serão utilizadas como tradução livre da palavra outdoor do
inglês.
14
Apesar do modelo proposto em [1] ser robusto pela combinação de descritores, ainda é
necessário utilizar descritores minimamente robustos em ambientes externos para garantir a
consistência do modelo. Dessa forma, é necessário considerar as especificidades de ambientes
externos para poder identificar os descritores mais adequados. Abaixo estão listadas algumas
peculiaridades de ambientes externos e suas respectivas influências no processo de reconheci-
mento.
Dessa forma, considerando o grande avanço da robótica móvel interna, e os desafios im-
postos pelas caracterı́sticas de ambientes externos, percebe-se uma grande tendência atual em
realizar trabalhos neste tipo de ambiente. Assim, este trabalho pretende contribuir para a
navegação robótica em ambientes externos, através do desenvolvimento de uma aplicação para
o reconhecimento de lugares.
Para tal, as caracterı́sticas de ambientes externos listadas acima serão abordadas sobre dois
pontos principais: o uso de descritores visuais que sejam robustos o bastante para conseguir car-
acterizar lugares através apenas das caracterı́sticas naturais destes, e a utilização de um método
que consiga combinar essas caracterı́sticas extraı́das pelos descritores para tornar o reconhec-
imento mais robusto ao tentar efetuar o reconhecimento mesmo que um dos descritores não
realize tal tarefa isoladamente.
Espera-se que esses pontos sejam atingidos através do uso dos descritores SURF e Tex-
tura, e da média aritmética para combinar as caracterı́sticas extraı́das do ambiente, pois estes
descritores são pouco sensı́veis à variação de iluminação, à variabilidade de objetos na imagem
e às variações de condições de observação tais como rotação e escala.
15
O primeiro passo para se navegar através de referências é decidir se estas serão métricas ou
topológicas. Como explicado em [5], a literatura de robótica móvel frequentemente distingue a
representação de espaço topológica da métrica. No entanto, como ainda não existem definições
claras desses termos, podem-se fazer as seguintes considerações: representações topológicas
são muitas vezes pensadas como grafos, dos quais os nós correspondem a lugares significativos
no ambiente e as arestas são as diretrizes para ir um nó a outro; já a representação métrica
divide o espaço usando grids regularmente espaçados, o que torna essa representação indepen-
dente da forma e da localização das caracterı́sticas do ambiente, representando os locais como
coordenadas absolutas ou relativas.
Uma vez escolhido o tipo de representação de espaço, ou seja, o tipo de mapa a ser usado,
ainda há três problemas a serem resolvidos: a geração do mapa, o controle do robô através do
ambiente e a auto-localização do robô no mapa. Considere o ambiente apresentado na Figura
2.1.
1 Embora já existam equipamentos com precisão de centı́metros, os custos ainda são muito elevados.
16
Cada marcador da Figura 2.1 representa um lugar do ambiente. Vale ressaltar que os mar-
cadores não representam os limites geométricos dos lugares, eles apenas simbolizam o lugar
graficamente. Por exemplo, pode-se dizer que o lugar L3 também poderia ser simbolizado pelo
nome “fim da Av. Copacabana”, como pode ser visto na Figura 2.2. Então, para ser possı́vel
percorrer um caminho (navegar) através desse mapa é necessário fazer o reconhecimento dos
lugares. Por exemplo, considere a seguinte situação: um robô a rodas precisa percorrer o cam-
inho C0 = {L4 , L5 , L2 , L1 , L0 } no mapa da Figura 2.1, utilizando como sensores uma câmera
perspectiva e uma bússola. Para tal, o robô precisa estimatimar sua localização, em tempo real,
através da câmera e utilizar a informação da bússola para determinar a direção que deve seguir
para alcançar o próximo lugar do caminho C0 .
17
2 Este termo foi utilizado no sentido de explicar que o mapeamento não foi feito durante o reconhecimento.
18
3 Reconhecimento de lugares
Como descrito em [2], a tarefa de encontrar correspondências entre duas imagens da mesma
cena ou objeto é parte de muitas aplicações de Visão Computacional, como: calibração de
câmeras, reconstrução 3D, registro de imagens e reconhecimento de objetos. Sendo assim,
pode-se dizer que os decritores visuais são as ferramentas utilizadas para determinar a cor-
respondências entre duas imagens. Dentre os descritores visuais pode-se citar: histograma
de cores normalizado, SIFT (Scale Invariant Feature Transform), MSER (Maximally Stable
Extremal Regions), SURF (Speeded Up Robust Features), LBP (Local Binary Pattern), entre
outros. Porém, apesar de existirem vários descritores que podem ser utilizados na tarefa de re-
conhecimento de lugares, este trabalho se restringiu à utilização de SURF e LBP considerando
a avaliação de descritores feita em [1]. Neste estudo foi indicada a utilização de SURF e LBP,
por apresentarem caracterı́stica favoráveis à tarefa de reconhecimento e por terem códigos fonte
disponı́veis.
3.1.1 SURF
Como descrito em [2], a busca por corrêspondências entre imagens pode ser dividida em
três passos principais. Primeiramente, pontos de interesse como cantos, blobs1 e junções do
1O termo blob(s) representa um aglomerado de pixels da mesma cor ou com o mesmo nı́vel de cinza.
19
A biblioteca SURF2 desenvolvida em [2] foi utilizada por [1] e sofreu algumas alterações.
O algoritmo de casamento (matching) fornecido em [2] é o de força bruta, ou seja, compara
cada descritor da primeira imagem com todos os outros da segunda, o que deixa o matching
lento. O algoritmo de matching desenvolvido em [1] usa uma biblioteca gratuita chamada ANN
(Approximate Nearest Neighbors)3 para diminuir o tempo computacional requerido. Porém, o
resultado desse matching é, em geral, igual ao obtido com o algoritmo original de [2], que gera
algumas falsas correspondências, como pode ser visto na Figura 3.1, onde as linhas brancas
ligam os pontos de conrrespondência entre as duas imagens.
Dentre os vários descritores visuais que utilizam informação de textura, o utilizado neste
trabalho foi o LBP (Local Binary Pattern). Neste, inicialmente a imagem é dividida em retângulos
de mesmo tamanho e em seguida um histograma é construı́do para cada retângulo. A informação
que se deseja extrair destes histogramas é a frequência dos padrões de textura encontrados nos
retângulos. Após a obtenção de todos os histogramas provenientes dos retângulos da imagem,
estes são concatenados para formar um único vetor descritor. Vale ressaltar que da mesma forma
que o descritor SURF, o LBP também opera em imagens em nı́veis de cinza. Um exemplo da
saı́da do descritor LBP pode ser visto na Figura 3.3, onde o gráfico representa o histograma
extraı́do do retângulo em vermelho.
Para ser possı́vel fazer a localização do robô, é necessário extrair as caracterı́sticas do lu-
gar observado e compará-las às caracterı́sticas presentes em cada lugar (nó) do mapa. Como
descrito em [1], a maneira mais adequada de se fazer essa localização seria utilizando as
distribuições de probabilidade do descritor utilizado. Porém, distribuições de probabilidade
exatas ainda não são possı́veis de serem obtidas na prática. Por isso, o que se faz é aproximar a
função densidade de probabilidade.
Neste trabalho, a função densidade de probabilidade dos descritores foi aproximada pela
função de similaridade dos mesmos, que é definida em [1] como:
22
0 ≤ si ≤ 1, i = 0..(M − 1)
SI/Nx = n/T
Mesmo utilizando descritores visuais, que sejam robustos o bastante para executar matching
entre imagens de uma mesma cena, que tenham sido capturadas em condições de observação
diferentes, como por exemplo rotação, translação e iluminação; o resultado do reconhecimento
de lugares utilizando apenas um desses descritores, não garante 100% de confiabilidade. Por
isso, o trabalho desenvolvido em [1] discute o problema da combinação de descritores, não
necessariamente visuais, para aumentar a robustez no reconhecimento de lugares. Existem
vários métodos de combinação de funções densidade de probabilidade, como Filtro de Kalman
e Filtro de Informação. Porém, como discutido em [1], a maioria desses métodos assume que
as distribuições são gaussianas, o que na prática acontece em um número bem reduzido de
situações. Por isso, neste trabalho optou-se por usar o método da média aritimética como fusor
das funções de similaridade dos descritores.
Uma vez determinada a função de similaridade geral, gerada a partir da combinação das
funções de similaridade dos descritores utilizados, o reconhecimento de um lugar do mapa
através de uma imagem é feito observando-se o pico global dessa função. Considere a função
de similaridade da Figura 3.4.
23
Observando-se a Figura 3.4 pode-se chegar às seguintes conclusões: a função de similar-
idade SURF reconheceu o lugar 2, a função de similaridade Textura reconheceu o lugar 3 e a
função de similaridade geral reconheceu o lugar 3.
24
4 Implementação
kl/.
2A
distribuição utilizada neste trabalho foi Debian versão 2.6.30-8.
3 Para mais informações sobre este aplicativo de código fonte aberto, visite o site
http://www.gnuplot.info/download.html.
4 Para mais informações sobre esta biblioteca de código fonte aberto, visite o site
http://code.google.com/p/gnuplot-cpp/.
5 Todas as imagens precisam ter a mesma resolução.
25
linha deve conter o caminho completo para as imagens, como o exemplo da Figura 4.1; e seguir
a sequência de comandos exibidos na Figura 4.2, utilizando as opções desejadas.
A ordem de criação dos lugares do mapa é dada pela ordem das imagens no arquivo im-
ages.txt e não pelo nome das imagens. Dessa forma, utilizando o arquivo da Figura 4.1 para
26
gerar um mapa com 5 imagens por lugar é gerado um mapa com 4 lugares, os quais são forma-
dos pelas seguintes imagens:
Mesmo após a instalação do MCA2-KL, a aplicação ainda não estará disponı́vel na pasta
mca2/export/i686 Linux debug/bin. Será necessário criar um projeto, pois a aplicação não faz
parte de nenhuma biblioteca. Para criar o projeto deve-se criar uma pasta (ex: reconhecimento),
colocar os arquivos contidos no apêndice A dentro desta pasta e digitar no terminal a sequência
de comandos exibidos na Figura 4.3.
(a) Compilação.
(b) Execução.
As saı́das do programa são um gráfico apresentado na tela, que exibe as funções de simi-
laridade entre a imagem da câmera e o mapa fornecido, e uma janela que exibe a imagem da
27
câmera, como na Figura 4.4. Além disso, apertando-se a tecla s é possı́vel salvar o gráfico, a
imagem da câmera e um arquivo chamado similarity.txt na pasta mca2. Neste arquivo é salvo
o número da imagem, a hora em que ela foi salva e as funções de similaridade SURF, Textura
e Geral, para ser possı́vel observar os valores exatos de similaridade gerados, como pode ser
observados na Figura 4.5.
Nesta seção serão apresentados dois diagramas: um contendo a estrutura fı́sica da aplicação
e outro com as principais classes utilizadas, com o objetivo de explicar melhor a estruturação
do código. Na Figura 4.6 é apresentada a estrutura fı́sica da plataforma utilizada.
Na Figura 4.7 é apresentado um diagrama UML (Unified Modeling Language) das princi-
pais classes utilizadas, as quais fazem parte da biblioteca Place Recognition do MCA2-KL.
• tMap: gera o mapa guardando as caracterı́sticas dos lugares e arestas de transição entre
eles;
29
5 Resultados experimentais
Para testar a aplicação construiu-se o mapa com uma câmera firewire, usando uma lente
sem regulagem automática de ı́ris. Por isso, a ı́ris da lente utilizada foi regulada com aber-
tura total tanto para montar o mapa quanto para efetuar o reconhecimento. Considerando as
discussões realizadas nos Capı́tulos 2 e 3, todos os testes foram realizados considerando os
seguintes atributos:
• Mapa composto por 11 lugares (L0 a L10 ), os quais são compostos por 6 imagens, for-
mando um total de 66 imagens utilizadas;
• Todas as imagens utilizadas foram capturas com resolução de 320x240 em nı́veis de cinza,
a uma altura constante de aproximadamente 90 cm e com abertura total de ı́ris;
• O testes de reconhecimento foram realizados em dias diferentes dos dias em que as ima-
gens que compuseram o mapa foram capturadas.
Nas Figuras 5.1, 5.2, 5.3 e 5.4 temos o mapa utilizado nos experimentos.
31
(a) L0-Imagem 0. (b) L0-Imagem 1. (c) L0-Imagem 2. (d) L0-Imagem 3. (e) L0-Imagem 4. (f) L0-Imagem 5.
(g) L1-Imagem 0. (h) L1-Imagem 1. (i) L1-Imagem 2. (j) L1-Imagem 3. (k) L1-Imagem 4. (l) L1-Imagem 5.
(m) L2-Imagem 0. (n) L2-Imagem 1. (o) L2-Imagem 2. (p) L2-Imagem 3. (q) L2-Imagem 4. (r) L2-Imagem 5.
(s) L3-Imagem 0. (t) L3-Imagem 1. (u) L3-Imagem 2. (v) L3-Imagem 3. (w) L3-Imagem 4. (x) L3-Imagem 5.
(a) L4-Imagem 0. (b) L4-Imagem 1. (c) L4-Imagem 2. (d) L4-Imagem 3. (e) L4-Imagem 4. (f) L4-Imagem 5.
(g) L5-Imagem 0. (h) L5-Imagem 1. (i) L5-Imagem 2. (j) L5-Imagem 3. (k) L5-Imagem 4. (l) L5-Imagem 5.
(m) L6-Imagem 0. (n) L6-Imagem 1. (o) L6-Imagem 2. (p) L6-Imagem 3. (q) L6-Imagem 4. (r) L6-Imagem 5.
(s) L7-Imagem 0. (t) L7-Imagem 1. (u) L7-Imagem 2. (v) L7-Imagem 3. (w) L7-Imagem 4. (x) L7-Imagem 5.
(a) L8-Imagem 0. (b) L8-Imagem 1. (c) L8-Imagem 2. (d) L8-Imagem 3. (e) L8-Imagem 4. (f) L8-Imagem 5.
(g) L9-Imagem 0. (h) L9-Imagem 1. (i) L9-Imagem 2. (j) L9-Imagem 3. (k) L9-Imagem 4. (l) L9-Imagem 5.
(m) L10-Imagem 0.(n) L10-Imagem 1. (o) L10-Imagem 2. (p) L10-Imagem 3. (q) L10-Imagem 4. (r) L10-Imagem 5.
Ao observar as imagens que compuseram o mapa, nas Figuras 5.2 e 5.4, pode-se perceber
que os lugares L2 e L8 , são internos. O objetivo de utilizar ambientes internos em um trabalho
que se destina a contribuir para a Robótica Móvel em ambientes externos, é descobrir qual o
efeito que esses ambientes provocariam no reconhecimento ao serem misturados aos ambientes
externos. É de se esperar que a identificação dos lugares internos seja feita com facilidade, con-
siderando que os mesmo tem caracterı́sticas muito mais bem comportadas que as dos ambientes
externos.
34
Nas Figuras de 5.5 a 5.9, estão apresentadas as funções de similaridade geradas para os
lugares testados e as imagens que geraram estas funções. Em cada gráfico são apresentadas as
funções de similaridade SURF (vermelho), Textura (verde) e Geral (azul) para o mapa da Figura
5.1. O reconhecimento de um lugar é caracterizado pelo maior valor (pico global) da função de
similaridade Geral, como exemplificado na seção 3.3.
Nas Figuras de 5.5 a 5.9 foram apresentados tanto os melhores casos, quanto os piores
casos do reconhecimento. Para tal caracterização, cosiderou-se que o melhor e o pior caso
são respectivamente determinados pela maior e menor diferença entre o valor da função de
similaridade no lugar a ser reconhecido (SLr ), e o valor da função de similaridade no lugar com
maior valor de similaridade (SLm ), para Lm 6= Lr .
Ao se analisar o problema pelo melhor caso, percebe-se que a aplicação obteve um desem-
penho muito bom, pois todos os lugares testados foram reconhecidos. Contudo, se o reconheci-
mento for analisado pelo pior caso percebe-se que alguns lugares não foram reconhecidos, pois
39
o pico global da função de similaridade ocorreu em outro lugar que não o esperado. Por exem-
plo, no pior caso do reconhecimento do lugar L3 , Figura 5.7c, a aplicação reconheceu o lugar
L1 . No entanto, os lugares L1 e L3 foram escolhidos propositadamente para estarem geometrica-
mente próximos, com o intuito de analisar se haveria confusão no reconhecimento dos mesmos,
considerando que algumas das imagens que os caracterizam apresentam elementos em comum.
Como pode ser visto nas imagens da Figura 5.2 e confirmada pela função de similaridade SURF
no gráfico da Figura 5.7c.
Outra análise que pode ser feita é a do reconhecimento dos ambientes internos. Observando-
se os gráficos 5.6a e 5.6c percebe-se que as funções de similaridade do melhor e do pior caso são
muito parecidas, e ambas reconhecem perfeitamente o lugar L2 , como dito no fim da seção 5.1.
Porém, o pior caso do reconhecimento do lugar L8 , Figura 5.9c, mostra que o lugar reconhecido
foi L9 , indicando uma falha no reconhecimento através dos descritores utilizados.
É possı́vel perceber no gráfico da Figura 5.9c que o lugar L9 foi reconhecido por causa do
descritor SURF, o que pode ser explicado pela grande quantidade de áreas brancas na imagem
da figura 5.9d e nas imagens do mapa que representam o lugar L9 , pois em regiões com pixels
de mesmo nı́vel de cinza a probabilidade dos vetores descritores SURF serem parecidos é muito
grande. Além disso, é possı́vel explicar o alto valor de similaridade Textura para o lugar L5 e
o baixo valor similaridade Textura para o lugar L8 na Figura 5.9c, respectivamente, pelo alto
nı́vel de iluminação nas imagens do lugar L5 e a ausência de uma imagem de caracterização do
lugar L8 em condições de observação parecidas com as da imagem da Figura 5.9d.
Como não é possı́vel obter uma medida confiável do desempenho da aplicação apenas anal-
isando o melhor e o pior caso, é necessário observar os resultados através de uma visão mais
geral, o que pode ser feito utilizando-se os dados estatı́sticos apresentados na Tabela 5.1.
40
Ao se analisar a Tabela 5.1 percebe-se que o desempenho estatı́stico da aplicação não foi
alto, considerando o valor de 70,83% de reconhecimentos no mapa. No entanto, através dos
gráficos apresentados na seção 5.2 percebe-se que todos os lugares foram reconhecidos através
de pelo menos uma condição de observação, o que é muito bom.
Frente aos resultados apresentados no Capı́tulo 5 e às colocações feitas acima, são sugeridos
os seguintes trabalhos:
tivo de diminuir o ruı́do causado pela luminosidade excessiva, o qual pode causar a falha
de descritores visuais, ao gerar áreas completamente brancas em lugares da imagens onde
poderiam ser identificadas caracterı́sticas;
• Implementar um controlador para permitir que um robô possa utilizar a aplicação desen-
volvida para navegar em um ambiente;
Referências Bibliográficas
[1] Cristiano Couto Gava. Reconhecimento de ambientes externos usando visão computa-
cional. Technical report, Coordenação de Aperfeiçoamento de Pessoal de Nı́vel Superior-
CAPES, Processo BEX0598/08-9, 2009.
[2] Luc Van Gool Herbert Bay, Tinne Tuytelaars. SURF: Speeded up robust features. In 9th
European Conference on Computer Vision, 2006.
[3] Michael Jones Paul Viola. Rapid object detection using a boosted cascade of simple fea-
tures. In IEEE Computer Society Conference on Computer Vision and Pattern Recognition
(CVPR2001), pages I–511 à I–518, 2001.
[4] Michael Jones Paul Viola. Robust real-time object detection. In International Journal of
Computer Vision, 2002.
[5] Dieter Fox Sebastian Thrun, Wolfram Burgard. Probabilistic Robotics. Massachusetts
Institute of Technology, 2005.
44
A.1 Modificado
12 // / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
13 // MAIN CODE
14 // / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
15 int main ( int argc , char * argv [] )
16 {
17 cout << " ===== Running p l a c e _ r e c o g n i t i o n _ b u i l d _ m a p program =====\ n \ n \ n
";
18
19 string path_map , imgs_file ( " images . txt " ) , map_file ( " map_info . txt " ) ;
20 uint P e r s p e c t i v e I m a g e s P e r P l a c e = 4;
21
22 cout << " Provide the folder path to save the map : " ;
23 cin >> path_map ;
24 cout << " Map is going to be saved in this folder : " << path_map + " \ n "
;
25 cout << " OBS : provide a file in this folder named \" images . txt \"\ n " ;
26 cout << " with images path to compose the map " << " \ n " ;
45
46 while ( 1 )
47 {
48 char buf [1024];
49 qint64 lineLength = file . readLine ( buf , sizeof ( buf ) ) ;
50 if ( lineLength == -1 ) break ;
51
66 qstr . clear () ;
46
67 }
68 }
69 else
70 {
71 cout << " Error ! Could not open file . Exiting . " << endl ;
72 file . close () ;
73 return EXIT_FAILURE ;
74 }
75
76 file . close () ;
77
85 cout << " \ nBuilding the map ... " << endl ;
86 for ( uint i = 0; i < all_images . size () ; i +=
PerspectiveImagesPerPlace )
87 {
88 cout << " Creating new place for the map with images " << i << " -> "
<< i + P e r s p e c t i v e I m a g e s P e r P l a c e - 1 << " of vector all_images . "
<< endl ;
89 ptrplace . reset ( new tPlace () ) ;
90 for ( uint k = i ; k < i + P e r s p e c t i v e I m a g e s P e r P l a c e ; ++ k )
91 {
92 cout << " \ tAdding image number " << k << " . " << endl ;
93 if ( ! ( ptrplace . get () ) -> Pr ocessS ensorD ata ( all_images [ k ] ) )
94 {
95 cout << " Error while building the map . Problem with image number
" << k << " of vector all_images . Exiting ... " << endl ;
96 return EXIT_FAILURE ;
97 }
98 }
99
A.2 Desenvolvido
5 # -------------------------------------------------------
6 # CLEBSON ’S CODE
7 # -------------------------------------------------------
8
9 cam_test = MCAProgram ( ’ t e s t _ p l a c e _ r e c o g n i t i o n _ s u r f _ m a t c h i n g _ f w _ c a m ’)
10 cam_test . AddSourceFiles ( " " "
11 t e s t _ s u r f _ m a t c h i n g _ f w _ c a m . cpp
12 """)
13 cam_test . AddLibs ( ’ m c a 2 _ b a y e s _ n a v i g a t o r mca2_kernel mc a 2 _c o v ir o a _d c 1 39 4
m c a2 _ c ov i r oa _ o pe n c v o p en c v _w i t h_ h i gh g u i dc1394 ’)
14 cam_test . BuildIt ()
15
16 # --------------------------------------------------------
17
18 cam_test_wn = MCAProgram ( ’ t e s t _ p l a c e _ r e c o g n i t i o n _ s u r f _ m a t c h i n g _ f w _ c a m _ w n
’)
19 cam_test_wn . AddSourceFiles ( " " "
20 t e s t _ s u r f _ m a t c h i n g _ f w _ c a m _ w n . cpp
21 """)
22 cam_test_wn . AddLibs ( ’ m c a 2 _ b a y e s _ n a v i g a t o r mca2_kernel
m c a2 _ c ov i r oa _ d c1 3 9 4 m c a2 _ c ov i r oa _ o pe n c v o p en c v _w i t h_ h i gh g u i dc1394 ’)
23 cam_test_wn . BuildIt ()
24
25 # --------------------------------------------------------
26
27 save_image = MCAProgram ( ’ p l a c e _ r e c o g n i t i o n _ s a v e _ f w _ f r a m e ’)
28 save_image . AddSourceFiles ( " " "
29 save_fw_frame . cpp
30 """)
48
34 # --------------------------------------------------------
35
36 save_image_wn = MCAProgram ( ’ p l a c e _ r e c o g n i t i o n _ s a v e _ f w _ f r a m e _ w n ’)
37 save_image_wn . AddSourceFiles ( " " "
38 save_fw_frame_wn . cpp
39 """)
40 save_image_wn . AddLibs ( ’ m c a 2 _ b a y e s _ n a v i g a t o r mca2_kernel
m c a2 _ c ov i r oa _ d c1 3 9 4 m c a2 _ c ov i r oa _ o pe n c v o p en c v _w i t h_ h i gh g u i dc1394 ’)
41 save_image_wn . BuildIt ()
42
43 # --------------------------------------------------------
44
51 # --------------------------------------------------------
52
53 calc_simi = MCAProgram ( ’ p l a c e _ r e c o g n i t i o n _ c a l c _ s i m i l a r i t y ’)
54 calc_simi . AddSourceFiles ( " " "
55 calc_similarity . cpp
56 """)
57 calc_simi . AddLibs ( ’ m c a 2 _ b a y e s _ n a v i g a t o r mca2_kernel m c a 2_ c o vi r o a_ d c 13 9 4
m c a2 _ c ov i r oa _ o pe n c v o p en c v _w i t h_ h i gh g u i dc1394 ’)
58 calc_simi . BuildIt ()
15
18 // / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
19 // Funcoes Extra
20 // / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
21
22
23 unsigned char getPixel ( IplImage * img , int lin , int col , int channel )
24 {
25
26 return (( unsigned char *) ( img - > imageData + img - > widthStep * lin ) ) [ col +
channel ] ;
27
28 }
29
30 void setPixel ( IplImage * img , int lin , int col , int channel , unsigned
char value ) /* Depende da profundidade do pixel */
31 {
32
33 (( unsigned char *) ( img - > imageData + img - > widthStep * lin ) ) [ col + channel ] =
value ;
34
35 }
36
48 if ( j %2 == 0 && ( i +1) %2 == 0 )
49 {
50 setPixel ( dest_img , id , jd , 0 , getPixel ( orig_img , i , j , 0)
);
51 ++ jd ;
52 }
53 }
54
55 if ( ( i +1) %2 == 0 )
56 ++ id ;
57
58 jd = 0;
59 }
60
61 }
62
63 // / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
64 // Codigo Principal
65 // / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
66 int main ()
67 {
68
74 string path_map ;
75
76 cout << " Forneca a pasta ( caminho completo !) onde esta o mapa : " ;
77 cin >> path_map ;
78 cout << " Usando pasta : " << path_map << endl ;
79 cout << " OBS : a correspondecia sera salva na pasta fornecida " ;
80
95
127
146 cout << " Imagem : " << fg . GetFrameCounter () << endl ;
147
161
162
167
171 cout << " Similaridade : " << simi << " \ n \ n " ;
172
13
16
17 // / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
18 // Funcoens Extra
19 // / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
20
21
22 unsigned char getPixel ( IplImage * img , int lin , int col , int channel )
23 {
24
25 return (( unsigned char *) ( img - > imageData + img - > widthStep * lin ) ) [ col +
channel ] ;
26
27 }
28
29 void setPixel ( IplImage * img , int lin , int col , int channel , unsigned
char value ) /* Depende da profundidade do pixel */
30 {
31
32 (( unsigned char *) ( img - > imageData + img - > widthStep * lin ) ) [ col + channel ] =
value ;
33
34 }
35
47 if ( j %2 == 0 && ( i +1) %2 == 0 )
48 {
55
54 if ( ( i +1) %2 == 0 )
55 ++ id ;
56
57 jd = 0;
58 }
59
60 }
61
62 string g en er at eR an do mN am e () {
63
73 // / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
74 // Codigo Principal
75 // / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
76
77 int main ()
78 {
79
130 cout << " Imagem : " << fg . GetFrameCounter () << endl ;
131 }
132
149 break ;
150
14
17 // / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
18 // Funcoes Extra
19 // / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
20
21
22 unsigned char getPixel ( IplImage * img , int lin , int col , int channel )
23 {
24
25 return (( unsigned char *) ( img - > imageData + img - > widthStep * lin ) ) [ col +
channel ] ;
26
27 }
28
29 void setPixel ( IplImage * img , int lin , int col , int channel , unsigned
char value ) /* Depende da profundidade do pixel */
30 {
31
32 (( unsigned char *) ( img - > imageData + img - > widthStep * lin ) ) [ col + channel ] =
value ;
33
34 }
35
47 if ( j %2 == 0 && ( i +1) %2 == 0 )
48 {
49 setPixel ( dest_img , id , jd , 0 , getPixel ( orig_img , i , j , 0)
);
50 ++ jd ;
51 }
52 }
53
54 if ( ( i +1) %2 == 0 )
55 ++ id ;
56
57 jd = 0;
58 }
59
60 }
61
62 string g en er at eR an do mN am e () {
63
83 // / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
84 // Codigo Principal
85 // / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
86
87 int main ()
88 {
89
96 string path_map ;
97
98 cout << " Forneca a pasta ( caminho completo !) onde esta o mapa : " ;
99 cin >> path_map ;
100 path_map = path_map + " map_info . txt " ;
101 cout << " Usando mapa : " << path_map << endl ;
102
103 /* Cria um objeto para obter os frames , considerando uma unica camera
*/
104 t F ra m e Gr a b be r D C1 3 9 4 fg (1) ;
105
118
exibicao */
120 sOpenCVUtils :: A c c e s s I m a g e A s I p l I m a g e (* image_bgr , *
o ut p u t_ i m ag e _ ha n d l e ) ;
121 cvZero ( o ut p u t_ i m ag e _ ha n d le ) ;
122
143
144 int i ;
145 int map_size = Map - > places . size () ;
146 Gnuplot g1 ( " lines " ) ;
147 g1 . set_title ( " Reconhecimento de Lugares " ) ;
148 g1 . set_pointsize (2.0) ;
149 g1 . set_grid () ;
150 g1 . set_style ( " linespoints " ) ;
151 g1 . set_xlabel ( " Lugares ( num / num ) " ) ;
152 g1 . set_xrange ( 0.0 , ( double ) map_size - 1) ;
153 g1 . set_ylabel ( " Similaridade Normalizada ( num / num ) " ) ;
154 g1 . set_yrange ( 0.0 , 1.0) ;
155 int desc_number = 2; /* E usado o valor 2 pois estamos usando somente
SURF e Textura */
156 vector < float > x ( map_size , 0) , desc_simi , surf ( map_size , 0) , texture
( map_size , 0) , similarity ( map_size , 0) , x_aux , y_aux ;
157 float max_surf , max_texture ;
158 time_t sec_time ;
62
159 tm * local_time ;
160
166 simi_name < < " similarity - " << local_time - > tm_year +1900 < < " _ " << local_time - >
tm_mon +1 < < " _ " << local_time - > tm_mday < < " -" << local_time - > tm_hour -1 < < " :
" << local_time - > tm_min < < " . txt " ;
167
170 cout << " Tamanho do mapa : " << map_size << " \ n " ;
171
202 similarity_file << " Hora : " << local_time - > tm_hour - 1 << " :
" << local_time - > tm_min <<" : " << local_time - > tm_sec << " \ n "
;
203
225 break ;
226
236
237 default :
238
245 cout << " Imagem : " << fg . GetFrameCounter () << endl ;
246
276 }
277
316 break ;
317 }
318 }
319 }
67
B.1 Câmera
B.2 Lente
• Fabricante: Computar.
B.3 Tripé
B.5 Notebook
• Memória: 1 GB.
69