Índice:

Vision 4all - Sistema Visão Assistida Para Deficientes Visuais Usando OpenCV, Dragonboard 410c E Aplicativo Android: 6 etapas
Vision 4all - Sistema Visão Assistida Para Deficientes Visuais Usando OpenCV, Dragonboard 410c E Aplicativo Android: 6 etapas

Vídeo: Vision 4all - Sistema Visão Assistida Para Deficientes Visuais Usando OpenCV, Dragonboard 410c E Aplicativo Android: 6 etapas

Vídeo: Vision 4all - Sistema Visão Assistida Para Deficientes Visuais Usando OpenCV, Dragonboard 410c E Aplicativo Android: 6 etapas
Vídeo: 🌟 ENG SUB | Versatile Mage | Full Version EP37-48 | Yuewen Animation 2024, Junho
Anonim
Vision 4all - Sistema Visão Assistida Para Deficientes Visuais Usando OpenCV, Dragonboard 410c E Aplicativo Android
Vision 4all - Sistema Visão Assistida Para Deficientes Visuais Usando OpenCV, Dragonboard 410c E Aplicativo Android

DESCRIÇÃO

O intuito do projeto é dar autonomia para deficientes visuais se locomoverem em ambientes internos como casas ou shopping centers e aeroportos.

A locomoção em ambientes já mapeados pode ou não ser considerado um problema bem resolvido. Um aplicativo disponível na App Store para isso, ainda que sirva apenas para 3 ambientes e apenas nos EUA, é o Guia LowViz. Além do número limitado de locais, tal aplicativo não detecta possíveis definições e pessoas que podem estar no caminho do usuário. Assim, uma missão deste projeto é, através de visão computacional e processamento de imagem, identificar possíveis possíveis que ocorram ao longo do caminho do usuário e poder recalcular o caminho a ser seguido dando independência e empoderando o usuário. Na prática, o projeto, embora ainda incompleto, consiste em integrar um aplicativo de onde se pode submetrar ou desenhar uma planta baixa do local de interesse, seja uma casa ou shopping. Com a placa integrada a uma câmera na cintura do usuário, e um fone de ouvido, o cálculo do aplicativo a posição no ambiente e permite o usuário definir para onde quer e dá os comandos de voz para movimentação. A câmera, quando detecta um obstáculo a frente, pode recalcular o caminho do usuário. Como dizia Hugh Herr: “Nenhum indivíduo é incapaz, o que existe é falta de desenvolvimento tecnológico para capacitar e nos tornar iguais”.

Neste projeto usaremos um Dragonboard 410c, porque precisamos de um hardware que tenha capacidade de fazer o processamento de imagens em tempo real (sem ter de competir com outras aplicações como seria no celular) e ao mesmo tempo de seja baixo custo.

Etapa 1: Materiais

Materiais
Materiais

Para este projeto, vamos usar:

- uma placa Qualcomm Dragonboard 410c;

- biblioteca de processamento de imagem OpenCV (versão 3.1);

- câmera que se comunique com uma placa (usaremos na verdade um celular android com o aplicativo IP Webcan);

- celular com sistema Android para o aplicativo;

Etapa 2: Instalando OpenCV Na Dragonboard

Instalando OpenCV Na Dragonboard
Instalando OpenCV Na Dragonboard

Com linux instalado na placa, siga os procedimentos padrões para instalar uma biblioteca de processamento de imagem - OpenCV - no device. Siga as instruções deste link:

docs.opencv.org/3.0-beta/doc/tutorials/intr…

Etapa 3: Conectar a Câmera Com a Dragonboard

Conectar a Câmera Com a Dragonboard
Conectar a Câmera Com a Dragonboard

Precisamos conectar a câmera que serão os olhos do deficiente com a placa de desenvolvimento Dragonboard 410c. Existem vários jeitos de fazer isso. A dragonboard possui entrada para flatcables, ou seja, é compatível com as câmeras usadas comumente em placas como a Raspberry pi.

Neste projeto, optamos usar como câmera um Moto G 3ª Geração com o aplicativo IP Webcam (disponível no Google Play) que permite que a imagem seja transferida por wifi.

Abaixo um programa que faz aquisição simples da imagem usando uma biblioteca opencv. O link anterior como parâmetro no construtor do objeto VideoCapture é o IP do celular (indicado no aplicativo) + “/ videofeed”. Na imagem acima, você encontra onde está o IP do seu celular.

A aquisição pode ser difícil nas versões anteriores a 3.1 da opencv, caso você não tenha conseguido compilar. Se você conectar uma câmera pela entrada de câmeras da dragonboard basta colocar como parâmetro o valor zero ("0"), que significa que você quer procurar um padrão de câmera.

Etapa 4: Desenvolver Software De Processamento De Imagens Que Toma Decisões

Image
Image
Desenvolver Software De Processamento De Imagens Que Toma Decisões
Desenvolver Software De Processamento De Imagens Que Toma Decisões
Desenvolver Software De Processamento De Imagens Que Toma Decisões
Desenvolver Software De Processamento De Imagens Que Toma Decisões

Há três programas em anexo, o identificadorDeObstáculos.cpp, o MostraContornoWebcam.cpp e o VídeoCadeiraSlavo.cpp (estes dois últimos para teste e entendimento da técnica do software).

Explicação: A ideia de identificação de obstáculo vem da determinação dos contornos mais drásticos nas imagens do vídeo, ou seja, o código identifica mudanças drásticas de cores na imagem e conclui que isso seja um contorno e portanto um objeto (como são definidas nas imagens deste Passo). Estando a câmera na barriga do usuário, levemente inclinada para o chão, conforme o usuário se locomover, o programa identificar a existência de um objeto (seja uma pessoa ou uma cadeira por exemplo) e manda o sinal de parada caso o objeto seja encontrado na região comum (caminho do usuário) (vide imagem do contorno da cadeira - caso o usuário se aproxime da cadeira há pixels brancos na região verde que determinam condição de parada). Dessa forma, sem a adição de filtros ao tipo de chão, para o funcionamento dessa versão simplificada, é necessário um chão razoavelmente homogêneo, de forma que os detalhes do chão não sejam considerados contornos.

Obs. é possível ajustar a variável lowThreshold do código para um valor de 0 (mais sensitivo) e 100 (menos sensitivo ao contorno). O valor sugerido é 60 para chão em geral.

Funcionamento: o identificadorDeObstáculos.cpp recebe um vídeo de rede wifi através do sparkfun que deve ser um vídeo de um celular acoplado a barriga do usuário. O código exige as condições de parada de um aplicativo de um outro celular que o usuário está usando. Idealmente manda-se comandos de voz de parada parada o usuário.

Obs: Altere o código de acordo para especificar onde os vídeos são recebidos e para qual android as são informações encaminhadas. Os tipos de mudanças são especificadas no próprio código (assim como nos programas de teste) comentados no início do programa.

Para saber mais sobre bordas de Canny e limiarização, além de outros pontos de visão computacional, recomenda-se procurar documentos oficiais da OpenCV.

Etapa 5: Fazer Aplicativo Que Repassa As Informações Para O Deficiente Visual

Para reproduzir este projeto é necessário criar um banco de dados no site data.sparkfun.com, o processo é muito intuitivo de forma que não será dada uma explicação mais detalhada aqui, mas colocaremos o link do banco que criamos para referência ().

Assim que um Dragonboard reconhece que há um obstáculo a sua frente ela posta em um banco de dados construído no data.sparkfun.com essa informação. O aplicativo faz uma consulta a este banco com o auxílio da classe okhttp3 obtendo as informações como um Json. Então fazemos um parser desse json para encontrarmos o último dado enviado. Com esse dado em mãos conseguimos dizer se um obstáculo no caminho, assim é emitido um sinal de voz para o usuário parar. Se o caminho está livre o aplicativo emite um sinal para prosseguir continuamente.

Seguem em anexo como classes e Interfaces utilizadas para o projeto, que são explicadas a seguir:

GetJson: é usado para fazer um get no banco de dados do data.sparkfun retornando um arquivo em formato json para um aplicativo.

JsonDownloader: é onde geramos uma asynctask para de fato usarmos uma classe GetJson, a importância do uso desta classe é para não travarmos uma interface do usuário e para isso precisamos criar uma thread diferente na aplicação.

MainActivity: nesta classe, implementamos uma lógica de aplicação que continuamente consulta o banco de dados, e informações o usuário por meio de um áudio se ele precisa para ou pode continuar caminhando.

RequestListener: é uma interface utilizada para forçar a Atividade Principal por certas características.

SdmSoundPlayer: esta classe é usada para gerenciar os comandos de voz da aplicação, caso você queira inserir como suas próprias gravações você deve criar uma pasta raw dentro da pasta res e incluir os arquivos de audio lá. Feito isso dentro do método initSoundHash () você deve colocar esses arquivos dentro de mSoundHash que é uma tabela de Hash. Para usar este áudio basta usar o método playSound (tecla int) e passar como parâmetro a chave escolhida para o sinal de voz.

Avisos: essa classe é utilizada para facilitar o parser do json retornado pelo banco de dados.

Seguem em anexo também os arquivos de voz utilizados.

O layout da aplicação consiste em um único botão que funcionava com o método Saia implementado na MainActivity, este método simplesmente forçava uma aplicação e parar uma consulta no banco de dados.

Qualquer dúvida adicional ou sugestão basta entrar em contato com o autor. Sugestões são sempre bem-vindas =).

O código não está bem comentado, mas acredito que as explicações acima devem ser suficientes para o entendimento do que está ocorrendo.

Etapa 6: Sugestões De Continuação

Poderiamos integrar um sistema de localaização. Existe o Qualcomm iZat SDK que possui um sistema de localização que usa GNSS, acelerômetro, magnetrômetro entre outros, já embutidos no próprio processador Qualcomm Snapdragon (presente na maioria dos celulares). No entanto, há pouca documentos e necessitava de testículos mais demorados.

Também gostaria de usar um sensor de distância ultrassônica, porém apresentou problemas quanto a uma comunicação com um Dragonboard, que poderia ser resolvido com mais calma. Se tiver tempo, obtenha como bibliotecas já presentes no kit de desenvolvimento, elas possuem diversos exemplos para cada tipo de sensor.

No site Developers Qualcomm existem fóruns e tutoriais que podem ajudar, e ainda há os tutoriais da 96Boards no you tube.

Recomendado: