Open Water Maze Tracking

Sunday, September 18, 2005

Esta semana terminei uma rotina em C para imagens 640x480 pixels, mas que pode ser adaptada para outras dimensões, provavelmete vou fazer isto para testar na minha webcam (352 x 266). Esta rotina tem como entradas o nome do arquivo (*.bmp), o tamanho da máscara e o ponto de origem. A idéia e aumentar a velocidade para se determinar a posição minimizando a área de busca.
É feita uma varredura em busca de todos os pontos brancos (0xff) dentro das dimensões da máscara. Uma nova implemetação vai ser uma entrada de níveis de decisão entre o preto e branco, pois a rotina atual só procura por branco e não por níveis de cinza.
Como a saída das webcam é usualmente jpeg, e para não ter converter em baixa velocidade, pretendo tratar diretamente as imagens jpeg. Consegui um material sobre imagens jpeg, mas o processo de descompactação não é muito simples. Caso não consiga implementar a rotina em C, vou ter que usar algum módulo pronto em python.

Thursday, September 15, 2005

Fazendo a análise do projeto no qual estou baseando este trabalho, encontrei alguns pontos que podem ser responsáveis pelos erros de medição encontrados quando da validação.

Embora a câmera disponível à época tivesse uma resolução de 768 x 576 pixels, para a medição foram utilizados apenas 384 x 257. O que nos leva em um tanque de 2 m de diâmetro a algo em torno de 1,3 pixel/cm. Utilizando um CCD de 640 x 480 quase dobramos a resolução, ou seja 2,4 pixel/cm.

O tempo de processamento por frame era algo em torno de 500 ms, ou seja de no máximo 2 frames/seg. Se o roedor estiver nadando a digamos 20 cm/s , sua posição a cada nova imagem pode estar distante de 10 cm, o que pode causar erros. Neste caso a idéia é tornar o tempo de processamento mais rápido , para digamos, 100 ms por frame ou seja 10 frames/seg. A comunicação via USB 2.0 deve facilitar em parte. Outra idéia e restringir a região de interesse onde é feito a procura do roedor com o intuito de diminuir o tempo processando a imagem. Algo que chamo de RDI preemptivo.
Para tal basta acompanhar os primeiros frames e começar a estimar a velocidade e a posição baseado nos eventos passados. Desta forma pode ser dimuída a máscara para o tracking do roedor. Alguns cuidados devem ser tomados neste algoritmo, como por exemplo avaliar inicialmente se os limites da máscara não coincidem com o roedor. Neste caso deve ser aumentada a máscara, mas em pequeno grau.
Se não for localizado roedor na região de interesse estimada, a máscara deve ser aumentada em um grande grau, pois a estimativa pode ter sido completamente distorcida, ou se o roedor resolveu bancar o mergulhador, o que as vezes acontece.

Outro ponto que acredito não ter sido avaliado é a distorção da lente da câmara, especialmente nas bordas da imagem. É muito comum em câmaras, principalmente nas de baixo custo a distorção nas bordas conhecido como efeito almofada ou outros ate associados entre si. Em uma avaliação preliminar que fiz com uma webcam, com um objeto a mais de 1m de distância, encontrei diferenças de até 10 % entre as medidas realizadas no centro e nas borda.
Para resolver este problema é necessário fazer a correção da distorção da lente. Para tanto fotografasse uma imagem com um padrão de linhas, retirando-se daí uma tabela ou um polinômio de compensação.

Wednesday, September 14, 2005

Existem sistemas comerciais que fazem a análise do trajeto seja online ou pós-processamento.
Estou me baseando num projeto já existente e fazendo algumas mudanças advindas de upgrade tecnológico e outras para aprimorar a qualidade dos resultados
Pretende-se adotar uma webcam comercial que enviará dados para um pc rodando win32 e com software construído através de ferramentas open source.
Estou inclinado a adquirir uma Creative Live Ultra, que possui uma qualidade de imagem bem razoável graças a excelente combinação de um CCD e lentes de boa qualidade. Adicionalmente possui protocolo de comunicação USB 2.0 o que permite o aumento da velocidade de transmissão de imagens.
As linguagens de programação utilizadas serão Ansi C para as rotinas de tratamento de imagem, que exigem uma maior velocidade de processamento e Python para o corpo do programa e o GUI.
Ansi C foi uma escolha natural até porque já conheço bem e Python pois trata-se de uma linguagem com grande potencial por ser OO, de fácil compreensão, muitas bibliotecas (ou seriam módulos) e porque já queiria programar a algum tempo e faltou oportunidade. Caso o desempenho seja insatisfatório, vou para C++.

Monday, September 12, 2005



A idéia deste blog é fazer o acompanhamento de um projeto que estou desenvolvendo chamado de Open Water Maze Tracking (OWMT).

Este projeto pretende automatizar alguns procedimentos utilizados por pesquisadores que se utilizam da metologia desenvolvida por Morris na universidade de Edimburgo, baseada na observação do comportamento de roedores em um tanque.
O tanque tem cerca de 2 metros de diâmetro, cheio de água e que tem em um dos quadrantes uma plataforma transparente, submersa.
A metodologia consiste em colocar o roedor na água e acompanhar certos parâmetros até que ele encontre e suba na plataforma. O experimento se repete várias vezes e mede-se o aprimoramento do roedor para encontrar a plataforma.
O objetivo final é avaliar a memória e o aprendizado em roedores.

Os parâmetros medidos tem relação com a mobilidade do roedor e são latência, velocidade média, tempo para alcançar a plataforma, distância percorrida, etc.
A latência é a somatória dos tempos nos quais o animal não se move, os demais são auto-explicativos.