1.5.1    Testes de aquisição e processamento de imagem (seguimento de alvo)

Uma simples webcam, embora possa parecer algo limitada, constitui porventura o mais económico e mais versátil sensor de que o robô poderia dispor.

Felizmente abundam na NET pessoas que desenvolvem pedaços de código e os disponibilizam a toda a comunidade. Há quem diga que actualmente a Internet é o equivalente ao que foi em tempos a biblioteca de Alexandria. Embora a frase seja discutível tendo a concordar com ela.

Uma simples pesquisa levou ao encontro do programa C# web cam capture do autor Philip Pierce (http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=1339&lngWId=10)

Fazendo o download desse programa, depois de o compilar e correr verifica-se que, de facto, ele lê as imagens de uma câmara web e as mostra num ecran de programa.

O processo é simples:

 

o      Faça download do arquivo que contém todos os ficheiros do programa (trata-se de um ficheiro zip).

o      Descomprima os ficheiros todos para uma pasta à sua escolha.

o      Verifique que nessa pasta é criada uma subpasta de nome webcam_test.

o      Nessa subpasta abra o ficheiro de projecto C# denominado Webcam_Test.

o      Corra o programa e verifique que ele realmente mostra a imagem adquirida pela câmara ao ritmo de amostragem máximo indicado (consoante a versão do Visual Studio que esteja usar pode ser que o sistema lhe peça para actualizar os ficheiros do programa, processo esse que é automático).

o      Se pretender modificar o ritmo de amostragem carregue no botão stop, modifique a correspondente e faça “continue”.

o      Com o decorrer deste trabalho verificará que aquele valor não é o intervalo de amostragem mas sim o valor de atraso que ele espera entre duas amostragens. Só seria igual ao intervalo de amostragem, caso o tempo de aquisição fosse nulo, o que sabemos não ser verdade.

o      Ainda assim, este programa será um excelente ponto de partida para adquirir os sinais de entrada do controlador do robô.

 

Por exemplo, a figura anexa mostra a aquisição de uma imagem contendo já uma caixa de CD que mais tarde servia como o alvo do qual se pretende extrair as coordenadas.

 

 

 

 

Estando a imagem lá, resta conseguir aceder aos vários pixels da imagem de modo a fazer o processamento pretendido.

Observando a fonte do programa, em particular o conteúdo do ficheiro form1.cs, vemos que a zona onde se mostra a imagem é:

 

private void WebCamCapture_ImageCaptured(object source, WebCam_Capture.WebcamEventArgs e)

            {

                  // set the picturebox picture

 

 

                  this.pictureBox1.Image = e.WebCamImage;

            }

 

Para podermos aceder aos vários pixels da imagem, tudo passa por converter para um bitmap a imagem que é recebida (e.WebCamImage).

 

Uma forma simples de realizar o processamento de imagem consiste em calcular o centro de massa da imagem, depois de binarizada.

 

O cálculo do centro de massa de uma imagem é dos processamentos mais simples de realizar e encontra-se descrito quase nas páginas iniciais de qualquer livro de processamento de imagem.

 

Se  a(x,y) for o nível de cinzento das coordenadas x e y de uma imagem, então o centro de massa da imagem (ou centróide) está situado nas seguintes coordenadas:

 

 

 

 

O arquivo anexo contém um programa contendo a aquisição da imagem, a sua binarização tendo como referência um valor indicado pelo utilizador, o cálculo do centro de massa da imagem binarizada e finalmente desenha uma cruz no centro de massa calculado.

 

 

Multimedia\00-01-AR Mar 2004\CameraTest.avi

 

Neste filme é possível observar em pormenor o funcionamento deste “sensor”:

o      O processamento da imagem não abrange a imagem toda. Apenas de 5 em 5 pixels é que a imagem é analisada, pelo que apenas 1/25 dos pixels são analisados.

o      O valor do nível de cinzento de cada pixel é comparado com o que o utilizador introduz na janela de “threshold”.

o      Se o nível de cinzento for superior a este nível de “threshold”, então trata-se de um ponto “branco” da imagem. Para não se confundir com o fundo, esse pixel é colocado a “preto”.

o      Se o nível de cinzento for inferior, analogamente o pixel é colocado a branco.

o      Observando o filme observa-se que inicialmente o nível de “threshold” (128, por omissão) é demasiado grande para poder separar as tonalidades escuras do alvo das tonalidades escuras do pavimento.

o      Sendo esse nível demasiado elevado, quando o alvo se desloca o centro de massa não se desloca permanecendo quase imóvel no centro da imagem.

o      Baixando o nível de “threshold” começa a ser possível distinguir os pixels do pavimento dos pixels do alvo. Em particular, para um nível de “threshold” de 12 (como indicado na figura) a separação é total. Todos os pixels sobre o alvo estão a branco e todos os do pavimento estão a preto.

o      Com o nível de “threshold” adequado verifica-se que o centro de massa fica claramente sobre o alvo, mesmo quando ele se desloca na imagem conforme poderá ser observado no filme CameraTest.avi

 

 

Estão deste modo reunidas as condições para realizar um seguimento de alvo. Calculando as coordenadas do centro de massa (coordenadas do alvo) e identificado o seu desvio em relação a um ponto (por exemplo, em relação ao centro da imagem) resta enviar para os motores, através da carta PMD e dos amplificadores de potência, os valores que levem o robô a seguir o alvo.

 

A título indicativo apresenta-se de seguida um filme feito para seguimento de linha em que apenas se calcula o centro de massa de uma linha, sendo o erro em relação à posição média usado para corrigir a velocidade dos motores de modo a manter o robô alinhado com a pista.

 

 

Multimedia\00-01-AR Mar 2004\Rasterinho-PentiumIV-pista.avi

 

 

Multimedia\00-01-AR Mar 2004\Rasterinho-PentiumIV-ecran.avi