Monografia

MAC499 Trabalho de Formatura Supervisionado

Projeto de Iniciação Científica

Aluno: Marcus Machado Sampaio Moysés (mmoyses@linux.ime.usp.br)
Supervisor: Prof. Dr. Carlos Hitoshi Morimoto (hitoshi@ime.usp.br)

Introdução

Uma das áreas de interesse de estudo de Interação Homem-Máquina é a possibilidade de se fazer entrada de dados sem o uso de dispositivos normais (como mouses e teclados) que requerem esforço mecânico, muitas vezes repetitivo, o que pode acarretar em lesões como tendinite. Foi pensando nesse motivo (e outros mais, como por exemplo diminuir o tempo gasto para se mover o ponteiro do mouse pela tela) que desenvolveram rastreadores de olhar que pudessem através de movimentos do olhos de um usuário fornecer entrada de mouse para o sistema operacional, eliminando assim o uso do mouse como dispositivo. O próximo passo a ser conquistado então é desenvolver uma aplicação (ou algum método) que eliminasse o uso do teclado como dispositivo, utilizando o rastreador de olhar como ferramenta, para que juntos substituíssem por completo o uso de dispositivos auxiliares para entrada de dados.

O Rastreador de Olhar

A tecnologia utilizada nesse projeto para o rastreador de olhar foi utilizar uma câmera infravermelha que possui dois conjuntos de luzes, um desses conjuntos pisca intermitentemente gerando duas imagens distintas do olho, uma com a pupila escura e outra com a pupila branca. Essas duas imagens são então subtraídas byte a byte gerando uma imagem binária, que após um algoritmo de reconhecimento de formas identifica-se a posição da pupila e utilizando o brilho ocular obtido consegue-se determinar a posição observada pelo usuário. Após uma calibragem (que utiliza nove pontos pré-definidos os quais o usuário deve olhar) consegue-se definir qual o ponto na tela o usuário está olhando e assim move-se o cursor para esse ponto. O rastreador ainda possui muita imprecisão, tanto por aproximação de cálculos (polinômios de segundo grau precisam ser resolvido para se obter a posição na tela) como por movimentos involuntários do olho, como piscadas ou pontos próximos na tela que chamam a atenção inconscientemente. Portanto existe um ruído na entrada que faz com o cursor quase nunca fique parado na posição correta e aproximadamente uma leitura em cada dez faz com que o cursor se mova indevidamente. Maiores detalhes sobre o rastreador de olhar podem ser encontrados em http://www.ime.usp.br/~hitoshi/framerate.

câmera infravermelha

Proposta

Este projeto é uma proposta para uma aplicação que substitua o uso de teclados convencionais como dispositivo de entrada de dados pelo simples uso do olhar combinado com um dispositivo rastreador de olhar, afim de simular para o sistema operacional o uso de um teclado. Essa aplicação seria então um teclado virtual que simulasse o evento de teclas sendo apertadas, enviando esses dados de saída para uma aplicação qualquer (por exemplo um editor de texto) de forma que ficasse isso ficasse imperceptível para essa aplicação de destino. Embora aplicações como teclados virtuais já existam, esse projeto foi criado com o intuito de coletar dados sobre a utilização do rastreador de olhar para que este pudesse ser aperfeiçoado e também para que aplicações futuras que venham a utilizar o rastreador de olhar pudessem ter suas características otimizadas para o uso de tal forma de entrada de dados. Para isso dados como precisão, facilidade de uso, formas de se simular um clique de mouse apenas com o olhar, formato de botões, espaçamento entre botões, detecção e tratamento de "entradas falsas" deveriam ser abrangidos pela aplicação (com a imprecisão do dispositivo já mencionada, podem ocorrer eventos que façam com que o sistema "ache" que deva mover o mouse quando na verdade não deve, portanto dentro de certo limite essas falhas deveriam ser detectadas pelo sistema e esse movimento indevido do mouse, então, ignorado). Portanto essa ferramenta deveria ser flexível a ponto de permitir mudanças tanto na interface quanto no funcionamento interno para que todos esses dados pudessem ser coletados, assim como informações adicionais como a melhora na perfomance de usuários já acostumados com o sistema. Embora o desenvolvimento desse projeto tenha sido feito visando o uso do rastreador de olhar, a ferramenta deveria ser independente do dispositivo de entrada, podendo então ser utilizado com um mouse comum.

Planejamento inicial e organização

Por ter sido um projeto individual e que não dependia de nada para ser feito que já não estivesse pronto, toda a parte de estudo inicial como a linguagem C++ e uso do MS Visual C++ (requisitos do projeto), assim como bibliotecas e APIs do Windows necessárias para o projeto foram feitos por mim sem nenhum auxílio, o que acarretou em uma demora não esperada pela falta de familiaridade com essas tecnologias e consequentemente um atraso no cronograma. Assim que atingi o estágio do desenvolvimento da aplicação voltei a me comunicar como orientador para pedir opiniões sobre alterações do que já estava sendo feito.

Ferramentas e Técnicas utilizadas

O desenvolvimento da aplicação foi toda feita utilizando-se um micro com processador AMD Athlon 1.2GHz com 256MB de memória RAM em minha própria casa, pois como o uso da ferramenta era independente do uso do rastreador de olhar não foi necessário a utilização dos laboratórios do IME. O projeto foi todo desenvolvido utilizando-se MS Visual C++ utilizando bibliotecas MFC.

Implementação

Na primeira fase de implementação, me preocupei apenas com as funcionalidades básicas do teclado virtual, ou seja, fazer com que a aplicação funcionasse como um teclado de verdade enviando eventos de teclas apertadas para uma janela qualquer escolhida pelo usuário. Por indicação do meu orientador resolvi fazer a interface da mesma maneira que um teclado convencional para se constatar se essa forma realmente era a mais eficiente para se usar quando a entrada não fosse feita utilizando-se as mãos (para digitar), pois a interface de um teclado atual é otimizada para ser utilizada com as mãos e pelo arranjo das teclas (QWERT) é otimizada para usuários de língua inglesa, mas por ser universalmente utilizada e com a melhora comprovada da perfonce de usuários familiarizados com a interface resolvemos dar o pontapé inicial utilizando essa interface. Nessa parte da implementação as "teclas" foram criadas como botões normais (widgets) que ao serem clicados enviam um evento de teclada apertada (keyboard event) para a "janela alvo" escolhida. Essa "janela alvo" é escolhida utilizando o botão chamado "Seletor" que ciclicamente percorre todas as janelas visíveis do sistemas até que uma seja escolhida. Assim, ao apertar uma "tecla" do teclado virtual o foco do sistema operacional passa para essa "janela alvo" e o evento de teclado é disparado. Mas até esse estágio o funcionamento da aplicação dependia do clicar de um mouse (o que não é possível utilizando o rastreador de olhar), portanto o primeiro problema encontrado foi como simular um clique de mouse.

A resolução desse problema foi feita modificando-se os botões para que esses fossem na verdade uma nova classe (que herdasse tudo de um botão padrão) com a diferença que faz com que um evento de tempo (time tracking event) seja disparado toda vez que o cursor se posiciona sobre o botão. Após um determinado intervalo de tempo (normalmente 400 ms) um evento de botão apertado é lançado para o sistema o que então faz com que o botão funcione como um botão normal (nesse caso disparando um evento de tecla apertada). Nessa fase também foi sugerido pelo orientador que uma forma mais fácil de parar de utilizar a ferramenta fosse criada pois o botão normal de sair (aquele x no canto superior direito da janela) não podia ser modificado para não necessitar um clique normal de mouse, então foi introduzido o botão "Exit" na aplicação para realizar essa tarefa. Um problema encontrado nessa parte foi como tornar flexível essas configurações, como tempo necessário para se disparar um clique de botão. Outro problema encontrado foi como utilizar isso com o rastreador de olhar, já que o sistema requeria que para lançar o evento de clique de botão o cursor não deveria se mover mais do que um quadrado imaginário de 40 pixels envolta da posição atual do cursor. Após muita pesquisa verifiquei que essas configurações só poderiam ser mudadas utilizando o sistema operacional Windows NT pois as funções MFC que fazem isso só foram implementadas para esse sistema operacional. Mais tarde consegui implementar um modo que permitisse que o tempo de espera para se gerar um clique de mouse fosse mudado mas apenas em tempo de compilação e não em tempo de execução como desejado. Essas alterações são de extrema importância para o projeto pois toda imprecisão do rastreador de olhar é abordada por esses ajustes, permitindo assim que mesmo que o cursor se mova indevidamente (por algum erro do rastreador) enquanto que o usuário queria que ele ficasse parado sobre um botão (para gerar um clique), o botão seja clicado da mesma maneira.

Terminada essa parte da implementação dos aspectos mais importantes da funcionalidade parti para implementação dos aspectos de mudança da interface (para tentar reduzir os erros gerados pelo rastreador). Meu orientador sugeriu então que eu fizesse botões de forma de losangos e circular (pois esses têm seu centro de fácil localização, o que minimizaria o erro por movimentos involuntários dos olhos que são atraídos naturalmente por cantos). Implementei essa possibilidade de se mudar a forma dos botões mas novamente apenas em tempo de compilação.

teclado normal teclado circular teclado com losangos

Estado atual do projeto

O projeto está funcional considerando as funcionalidades principais propostas. Alguns pontos quanto à flexibilidade ainda não estão acabadas. Dentre elas estão as já mencionadas na parte da implementação como a possiblidade de se alterar o tempo necessário para se gerar o evento de clique de mouse em tempo de execução e a implementação da possiblidade de se alterar o espaço pelo qual o cursor possa se mover livremente e ainda assim ser considerado como "parado" para gerar o clique do mouse. Outra característica que se deseja ter em tempo de execução é a mudança da forma dos botões (atualmente apenas possível em tempo de compilação).

Outra característica de flexibilidade que falta ser implementada é a capacidade de se alterar o tamanho e o espaçamento das "teclas" (botões), para que se possa determinar a melhor configuração para o uso com o rastreador de olhar, ou seja, aquela que minimize os erros. A possibilidade de se mover a ferramenta pela tela também é desejável, já que ela é criada sempre no meio da tela e isto pode causar a oclusão da "janela alvo", algo que só é resolvido atualmente utilizando o mouse para mover a janela da aplicação.

Um dos aspectos que foi constatado foi o de que o uso do interface do teclado padrão não é a mais apropriada para o uso com o rastreador de olhar, portanto outra característica que foi tardiamente incluída no projeto era a de se estudar outro arranjo das "teclas" na ferramenta (como por exemplo por ordem alfabética) que facilitasse o uso da aplicação, mesmo por usuários que não possuíssem nenhuma experiência com teclados.

Algumas dessas características (como por exemplo a possibilidade de se alterar o tamanho e o espaçamento dos botões talvez não possam ser feitas utilizando se apenas Visual C++ e funções MFC como sugerido pelo orientador, o que talvez faça com que o projeto tenha que ser refeito utilizando por exemplo Open GL se tais características forem realmente implementadas.

Para se ver a ferramenta (com botões circulares) clique aqui.

Referências

C. H. Morimoto, D. Koons, A. Amir e M. Flickner.
Frame-rate pupil detector and gaze tracker.
Em To be presented at: ICCV'99 - Framerate computer vision applications, Corfu, Greece, Setembro 1999
(URL : http://www.ime.usp.br/~hitoshi/framerate)

Segunda Parte