• Aucun résultat trouvé

Les rives et le littoral

Dans le document Municipalité de LAC-DU-CERF (Page 114-123)

Chapitre 12 12 Protection des milieux riverains

12.3 Les rives et le littoral

Um dos principais requisitos do sistema desenvolvido é a capacidade de extrair infor- mações relevantes das imagens oriundas da câmera do robô para uma posterior análise. Este processo é tido como parte fundamental do projeto de visão computacional e consiste em definir quais filtros de processamento de imagem devem ser utilizados e aplicá-los.

A sequência de técnicas de processamento de imagem desenvolvida neste projeto foi definida com base nos resultados apresentados em testes realizados com diversas combinações de filtros, sempre com o intuito de tornar as imagens mais homogêneas e facilitar o processo de extração de informações. Dessa forma, foi possível reduzir os ruídos presentes nos frames capturados e demandar um menor poder de processamento na execução das etapas posteriores. Nas subseções a seguir, as técnicas desenvolvidas e aplicadas no presente trabalho, são apresentadas e detalhadas.

5.4.1 Operações morfológicas

Foram aplicadas no sistema desenvolvido as operações morfológicas de Abertura (image opening) e Fechamento (image closing). Ambas baseiam-se em dois operadores mórficos fun- damentais, detalhados no Capítulo 3, que são as operações de Dilatação e Erosão.

Para definir a forma e tamanho ideal do elemento estruturante utilizado nos filtros de transformação morfológica, deve-se levar em conta as características da imagem original e o resultado que se espera. Normalmente este valor é definido com base na aplicação de testes com diferentes valores e análise dos resultados.

No sistema desenvolvido, optou-se por realizar uma operação de abertura seguida de uma de operação de fechamento de modo a remover pequenos elementos (ruídos) presentes no

framee, então, conectar os elementos próximos, com o objetivo de obter um conjunto mais

regular e menos rico em detalhes que o original.

Na Figura 5.4 é apresentada uma imagem do cenário de uma partida de futebol de robôs. Após aplicar o filtro de morfológico de abertura, a imagem resultante é mostrada na Figura 5.5. Nota-se que pequenos elementos que destoam do restante (pixels ao redor) da imagem são removidos. Mas, apesar de apresentar uma redução no nível de detalhes da imagem, esta redução ainda não se mostra suficiente para realizar a análise esperada.

Figura 5.4 – Imagem do campo de futebol de robôs

que pequenos buracos presentes na imagem original são fechados. Entretanto, também não se obtém um resultado satisfatório, pois os elementos do cenário continuam com um grau elevado de detalhes e suscetíveis à alterações.

Com a aplicação dos filtros de abertura e de fechamento na mesma imagem, obtém-se um resultado mais próximo do esperado, como pode ser visto na Figura 5.7.

Os algoritmos de transformação morfológica foram implementados utilizando a biblio- teca OpenCV. A seguir estão apresentados os códigos fonte desenvolvidos para aplicação destes filtros.

O método abaixo realiza o carregamento de uma imagem e aplica a transformação de abertura morfológica seguida pela transformação de fechamento.

1

2 void ColorProcessing::doOpeningClosing() { 3

4 Mat image;

5 image = imread("/location/to/image.jpg"); 6

7 imshow("BGR Original Image", image); 8

9 this->imageOpening(image, 5); 10 this->imageClosing(image, 5); 11

12 imshow("HSV to BGR Image", image_back_to_bgr); 13

14 }

Figura 5.5 – Operação morfológica de abertura em uma imagem do campo de futebol de robôs com valor do kernel igual a 5

1

2 void ColorProcessing::imageOpening(Mat& image, int size) { 3

4 //morphological opening

5 erode(image, image, getStructuringElement(MORPH_ELLIPSE, Size

(size, size)));

6 dilate(image, image, getStructuringElement(MORPH_ELLIPSE,

Size(size, size)));

7 8 }

1

2 void ColorProcessing::imageClosing(Mat& image, int size) { 3

4 //morphological closing

5 dilate(image, image, getStructuringElement(MORPH_ELLIPSE,

Size(size, size)));

6 erode(image, image, getStructuringElement(MORPH_ELLIPSE, Size

(size, size)));

7 8 }

O resultado obtido com a combinação dos filtros morfológicos aplicados apresentou- se satisfatório, porque mantiveram-se as características principais dos elementos presentes na imagem e foi alcançado um nível aceitável de redução de ruídos.

Na seção seguinte está descrita a próxima etapa da estratégia de processamento de ima- gem aplicada, chamada de redução de cores, que é executada com o intuito de obter um nível maior de homogeneidade na imagem.

Figura 5.6 – Operação morfológica de fechamento em uma imagem do campo de futebol de robôs com valor do kernel igual a 5

5.4.2 Redução de cores

Mantendo o propósito de reduzir a complexidade dos elementos presentes no frame e possibilitar a análise posterior, nesta etapa é aplicado um algoritmo para redução da quantidade de cores da imagem. Nesta abordagem as cores resultantes são chamadas de classes de cores.

O algoritmo de redução de cores recebe um parâmetro N que é o fator de redução da imagem. E com base neste fator é possível determinar a quantidade de classes de cores que a imagem resultante poderá possuir. Cada pixel da imagem têm sua cor alterada para a classe de cor mais próxima da cor original.

O processo básico de redução de cores funciona da seguinte forma: cada um dos 3 canais, de cada pixel da imagem, tem seu valor divido por N (fator de redução) e, então, a parte inteira do resultado da divisão é multiplicado por N, obtendo-se o maior múltiplo de N menor que o valor inicial; à este múltiplo soma-se N/2 e obtém-se então a posição central do intervalo entre dois múltiplos adjacentes de N. Se este processo for aplicado em uma imagem de 8-bits, por exemplo, irá resultar em uma imagem com um total de 256/N x 256/N x 256/N classes de cores (LAGANIÈRE, 2014).

O algoritmo implementado para redução de cores também faz uso da biblioteca OpenCV e é apresentado no trecho de código-fonte abaixo. No laço de repetição da linha 9, para cada valor presente nos canais de cada pixel é aplicada a fórmula de redução. Caso a imagem seja contínua o laço é executado apenas uma vez.

Figura 5.7 – Operações morfológicas de abertura e fechamento em uma imagem do campo de futebol de robôs com valor de kernel igual a 5

1 void ColorProcessing::colorReduction(cv::Mat& image, int div) { 2 int nl = image.rows; // number of lines

3 int nc = image.cols * image.channels(); 4 if (image.isContinuous()) {

5 nc = nc * nl;

6 nl = 1; // it is now a 1D array

7 }

8 for (int j = 0; j < nl; j++) {

9 uchar* data = image.ptr<uchar>(j); 10 for (int i = 0; i < nc; i++) {

11 data[i] = data[i] / div * div + div / 2;

12 }

13 }

14 }

No sistema desenvolvido, decidiu-se utilizar um fator de redução de 70, o que resultou em um total de 64 classes de cores possíveis após a aplicação do filtro de redução.

Na Figura 5.9, é apresentada a imagem do robô no campo de futebol com suas cores reduzidas após a aplicação dos filtros morfológicos.

Com a aplicação dos filtros descritos até o momento, o nível de detalhamento retratado nas imagens resultantes mostrou-se satisfatório para que se desse continuidade nas etapas de processamento de imagem.

A seguir, as transições entre as classes de cores do frame analisado e as presentes na bússola são uma das características da imagem que serão analisadas para que se possa inferir a orientação do robô.

Figura 5.8 – Redução de cores na imagem original com diferentes fatores de redução

5.4.3 Espaços de cores

O espaço de cores comumente utilizado em sistemas computacionais e dispositivos de captura óptica é o RGB. Ele é baseado nas cores primárias vermelho (Red), verde (Green) e azul (Blue), das quais derivam uma ampla gama de cores a partir da combinação das três primárias.

Apesar de a maneira como ocorre a percepção de cores pela visão humana possuir se- melhanças com a forma como as cores são representadas no modelo RGB, este não é o mais indicado para medir similaridade entre duas cores distintas, pois o RGB não é um espaço de cores com percepção uniforme. Ou seja, dada uma distância entre duas cores que parecem si- milares, outras duas cores separadas por esta mesma distância podem ser totalmente diferentes. Portanto, para que o sistema desenvolvido pudesse realizar as comparações entre as classes de cores, foi necessário que se convertesse as imagens processadas para um espaço de cores mais adequado, o HSV.

Este padrão permite uma melhor distinção entre cores puras por trabalhar com tonali- dade ou matiz (Hue), saturação (Saturation) e valor (Value, que equivale à luminosidade ou brilho da imagem). No espaço de cores HSV, os clusteres de cores da imagem são melhores separados, em uma representação mais próxima da percepção do olho humano. Dessa forma, ao realizar uma pequena alteração no valor do canal de cores, se obtém uma cor similar à original e não totalmente diferente, como pode ocorrer no espaço de cores RGB.

Figura 5.9 – Filtro de redução de cores aplicado sobre a imagem juntamente com as transfor- mações morfológicas de abertura e fechamento

Na Figura 5.10, podem ser visualizados os canais de cores no espaço HSV, após a con- versão da imagem original em RGB.

A rotina implementada para conversão entre os espaços de cores RGB e HSV é mostrada no trecho de código fonte abaixo. Utilizou-se métodos da biblioteca OpenCV para realizar as conversões.

1 void ColorProcessing::bgrToHsv(Mat& image, Mat& output) { 2 cvtColor(image, output, COLOR_BGR2HSV);

3 }

1 void ColorProcessing::hsvToBgr(Mat& image, Mat& output) { 2 cvtColor(image, output, COLOR_HSV2BGR);

3 }

5.4.4 Histogramas

Mesmo com a aplicação do algoritmo de redução de cores e das técnicas de suaviza- ção, a imagem processada continua possuindo cores distintas nos pixels das áreas de interesse definidas. Torna-se necessário obter a classe de cor predominante na região analisada para armazená-la no modelo de dados.

A classe de cor predominante é obtida a partir da geração e análise de um histograma do fragmento da imagem analisado. Abaixo é apresentada a rotina para obtenção da cor predo- minante no fragmento de imagem já no espaço de cor HSV, através da análise dos canais Hue e

(a) Imagem no espaço de cor RGB (b) Imagem no espaço de cor HSV

(c) Canal H (Hue) (d) Canal S (Saturation) (e) Canal V (Value)

Figura 5.10 – Conversão do espaço de RGB para HSV Saturation.

1

2 std::pair<Color, Color> Histogram::getMaxHueSat(Mat& hsv) { 3

4 int hbins = 256, sbins = 256; 5 int histSize[] = {hbins, sbins}; 6 float hranges[] = { 0, 180 }; 7 float sranges[] = { 0, 256 };

8 const float* ranges[] = { hranges, sranges };

9 MatND hist;

10 int channels[] = {0, 1}; 11

12 calcHist( &hsv, 1, channels, Mat(),

13 hist, 2, histSize, ranges, true, false ); 14

15 double maxVal=0;

16 minMaxLoc(hist, 0, &maxVal, 0, 0); 17

18 Mat histImg = Mat::zeros(sbins*scale, hbins*scale, CV_8UC3); 19

20 std::pair<Color, Color> max_colors; 21 Color maxColor, secMaxColor;

22 int sec_maxVal = 0; 23 int count = 0; 24

25 for( int h = 0; h < hbins; h++ )

26 for( int s = 0; s < sbins; s++ )

28 float binVal = hist.at<float>(h, s);

29 count += binVal;

30 int intensity = cvRound(binVal*100/maxVal); 31 32 if(binVal == maxVal){ 33 maxColor.channel1 = h; 34 maxColor.channel2 = s; 35 maxColor.freq = binVal; 36 maxColor.intensity = intensity; 37 max_colors.first = maxColor; 38 continue; 39 }

40 if(sec_maxVal < binVal && binVal != maxVal){

41 sec_maxVal = binVal; 42 secMaxColor.channel1 = h; 43 secMaxColor.channel2 = s; 44 secMaxColor.intensity = intensity; 45 secMaxColor.freq = binVal; 46 max_colors.second = secMaxColor; 47 } 48 49 }

50 max_colors.first.freq = max_colors.first.freq * 100/count; 51 max_colors.second.freq = max_colors.second.freq * 100/count; 52 return max_colors;

53 }

O método acima retorna um par de valores contendo as informações das duas cores mais frequentes na região de interesse da imagem analisada. Nas linhas 4 à 10 são definidos os parâmetros para geração do histograma. Como cada canal da imagem possui 8 bits e espera-se obter o valor real representado em cada canal, os valores do bin são definidos em 256 (de zero à 255) para ambos. Os intervalos de valor para o canal Hue varia de 0 à 180, pois é a notação adotada pela biblioteca OpenCV para representação destes valores, que representam a variação de cor da imagem, onde a cor presente no valor 0 é a mesma do valor 180. O valor contido no segundo canal varia entre 0 e 256 e representa o nível de branco da imagem, onde zero é totalmente branco, valores intermediários são tons de cinza e 255 é preto.

Nas linhas seguintes o histograma é gerado, com a função calcHist, e seu valor máximo é obtido através do método minMaxLoc, ambos da biblioteca OpenCV. E o resultado é anali- sado para que extraia-se os valores dos canais Hue e Saturation dos pixels mais recorrentes na imagem, bem como sua intensidade e frequência. Por fim, o método retorna este par de valores. Na seção seguinte é apresentado o modelo de dados definido para o desenvolvimento da bússola visual.

5.5 Modelo de dados

O modelo de dados definido consiste em uma representação circular de informações extraídas de um conjunto de imagens capturadas pelo robô. Cada imagem, após ser processada, é segmentada em N colunas, chamadas de Features, de modo a seccionar verticalmente as informações. Cada Feature é ainda segmentada em um número pré-definido de Classes de Cores. Estes dados são carregados na fase de Calibração da bússola.

A quantidade de Features e Classes de Cores que o sistema gera é definida pelo utilizador nos parâmetros do sistema. É importante atentar-se à estes valores pois há uma implicação direta no resultado das comparações realizadas posteriormente para obter a orientação, uma vez que as classes de cores e suas transições são utilizadas para inferir a similaridade entre os dados da bússola e os frames capturados. Uma quantidade muito grande de Features pode gerar um ruído desnecessário ao calcular a orientação e uma quantidade pequena pode gerar uma análise imprecisa.

O sistema foi implementado seguindo uma abordagem orientada a objetos, na qual suas classes e relações foram definidas e podem ser visualizadas no Apêndice A.

Com base em testes realizados chegou-se a uma quantidade ideal de 128 Features para mapear o ambiente ao redor do robô. Utilizando uma câmera com campo de visão de 45 graus são necessárias 8 imagens de pontos distintos do ambiente para que se possa calibrar com- pletamente a bússola. Um frame capturado possui 16 Features com 8 Classes de Cores cada, formando um total de 128 regiões de interesse por imagem.

Na Figura 5.11 é mostrada a combinação de dois frames do campo de treino para futebol de robôs da equipe TauraBots. Na Figura 5.12 a mesma imagem é mostrada segmentada, já processada e no espaço de cor HSV, com os pontos de interesse em destaque.

Figura 5.11 – Dois frames de imagem capturados do campo de jogo sem processamento Os frames enviados para a bússola pelo robô devem conter as informações referentes

Figura 5.12 – Imagem no espaço de cor HSV segmentada

aos ângulos verticais e horizontais da câmera no momento da captura. Nos testes realizados, os conjuntos de imagens foram passados para a bússola visual com estas informações, para que na fase de calibração o sistema carregue o modelo de dados da bússola de acordo com a posição estimada da câmera.

5.6 Calibração

É chamada de calibração a fase de inicialização da bússola visual e a mesma deve ser realizada antes de a partida de futebol começar. Neste momento, o robô deve capturar frames de posições distintas do ambiente e passá-las à bússola junto com seu ângulo de rotação. A bússola por sua vez, processa cada uma destas imagens, identifica e extrai as Features nela contidas e atualiza o modelo de dados. O processamento da imagem consiste em aplicar as etapas descritas na seção 5.4 para que se obtenha as características de cores de cada imagem.

O código fonte da etapa de calibração da bússola pode ser visualizado no Apêndice B desta dissertação. Na seção seguinte é descrito o processo de detecção de Features da bússola visual projetada.

5.7 Detecção de Features

No modelo de dados definido no projeto da bússola visual desenvolvida neste trabalho, cada Feature é um conjunto de informações sobre as cores de um segmento vertical da imagem do ambiente. O conjunto de todas as Features do sistema, após sua calibração, constitui uma

representação abstrata do panorama de 360odas cores ao redor do robô.

As informações sobre a classe de cor de cada região de interesse do frame são obtidas através da análise dos canais Hue e Saturation. Levando assim em consideração os aspectos

de nível de cor e quantidade de branco da imagem, respectivamente. Esta informação é obtida através da obtenção do histograma destes dois canais da imagem e análise da frequência com que estes valores aparecem. A classe de cor é então carregada com o valor mais frequente levando em conta a combinação destes dois canais analisados.

O sistema foi projetado para que também trabalhe com a análise de apenas um canal de cor (Hue). No capítulo 6 são discutidos os resultados da realização de experimentos com esta análise.

Com as classes de cores da imagem devidamente extraídas, temos para a bússola uma matriz de 8 linhas por 128 colunas, onde as linhas representam as Features e as colunas as classes de cor. E para cada imagem que vai ser comparada temos uma matriz de 8 classes de cor por 16 Features. Com estes dados em mãos é aplicada uma técnica de Template Matching, de modo a obter a comparação entre as matrizes de imagem em busca de áreas similares.

Para realizar a comparação é passado ao algorítimo de Template Matching (Apêndice C) o vetor de Features da bússola, que é a imagem onde as características serão buscadas, e o vetor de Features do frame capturado. Os dados do frame capturado são buscados dentro dos dados da bússola e é retornado um vetor contendo a informação de quão similar a imagem que está sendo comparada é com cada segmento da bússola em cada ponto da mesma. Ao realizar uma análise neste vetor resultante, é possível obter a posição da bússola onde o frame que está sendo compara melhor se encaixa e seu grau de certeza.

Dessa forma, ao realizar a conversão da matriz de Features x Cores para as dimensões originais, obtém-se a posição da bússola onde o frame melhor se encaixa e calcula-se então quantos graus à direita da posição inicial do robô a imagem está.

5.8 Considerações do capítulo

Neste capítulo foi apresentada e detalhada a metodologia proposta bem como os passos realizados em seu desenvolvimento. No capítulo seguinte são descritos os testes realizados com a calibração da bússola e detecção de Features.

6 RESULTADOS

Neste capítulo são apresentados os testes e experimentos realizados com a bússola visual desenvolvida ao longo deste trabalho.

6.1 Calibrando a bússola

Para validar o funcionamento da abordagem proposta, foram realizados testes, no campo de treino de futebol de robôs da equipe TauraBots, com imagens simulando o funcionamento do robô em uma partida. Inicialmente, frames são capturados juntamente com seu ângulo de rotação e são então utilizados na fase de calibração. Uma vez calibrada, a bússola está apta a estimar a orientação do robô com base em novas imagens capturadas.

A fase de calibração foi executada com um conjunto de 8 imagens, capturadas com uma

câmera com 45o de abertura horizontal. Na Figura 6.1, estas imagens podem ser visualizadas

juntamente com seus ângulos de rotação, também informados à bússola. Nota-se que há uma grande variação de luminosidade no ambiente, fato que contribui para a validação do método em cenários reais.

(a) 0o (b) 45o (c) 90o (d) 135o

(e) 180o (f) 225o (g) 270o (h) 315o

Figura 6.1 – Conjunto de imagens capturadas pelo robô na fase de calibração

Após realizar o carregamento das imagens, a bússola realiza o processamento das mes- mas de modo a possibilitar a extração das Features que serão utilizadas para inferir a orientação. Este processo está descrito a seguir. Na Figura 6.2 está apresentada a visão panorâmica dos fra-

mescapturados pela câmera.

Figura 6.2 – Imagem RGB panorâmica sem processamento

Após receber cada frame, a bússola aplica as etapas de processamento de imagem defi- nidas. Inicialmente é realizada a conversão do espaço de cor padrão (RGB) para o espaço de cor HSV, onde há uma percepção das cores da imagem mais próxima à percepção da visão humana. A seguir, são realizadas as etapas de alteração morfológica e redução de cores, de modo a redu- zir a quantidade de ruídos presentes na leitura do ambiente realizado pela câmera e aprimorar a precisão na inferência da bússola. Na Figura 6.3 são mostradas as imagens originais após a conversão do espaço de cores e a aplicação dos filtros de abertura e de fechamento morfológico.

(a) 0o (b) 45o (c) 90o (d) 135o

(e) 180o (f) 225o (g) 270o (h) 315o

Figura 6.3 – Imagens em HSV após o processamento morfológico

Na etapa seguinte, onde é realizada a discretização das cores da imagem, é aplicada a técnica de redução de cores. Como descrito na Seção 3, o processo de discretização de cores reduz o valor de cada canal de cor da imagem para um grupo de clusteres reduzido, com base em um fator de redução. Neste teste foi utilizado um fator de redução de 48, de modo que cada canal de cor da imagem que possuía 256 valores possíveis (0-255), passa a possuir apenas 6 valores distintos. E a combinação dos três canais resulta em um total de 216 cores distintas, ao invés das 16 milhões iniciais. Mas como nesta abordagem serão analisados apenas os canais

Hue e Saturation, que representam o nível de cor e intensidade do branco, respectivamente, o total de clusteres de cor analisados pela bússola será de 36. As imagens resultantes deste

Dans le document Municipalité de LAC-DU-CERF (Page 114-123)