Tabla de contenido:

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

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

Video: Vision 4all - Sistema Visão Assistida Para Deficientes Visuais Usando OpenCV, Dragonboard 410c E Aplicativo Android: 6 Pasos
Video: 🌟 ENG SUB | Versatile Mage | Full Version EP37-48 | Yuewen Animation 2024, Junio
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 visuais deficientes se locomoverem em ambientes interiores como casas o centros comerciales e aeroportos.

Una locomoção em ambientes já mapeados pode ou não ser considerado um problem bem resolvido. Um aplicativo disponível na App Store para isso, ainda que sirva apenas para 3 ambientes e apenas nos EUA, é o LowViz Guide. Além do limitado número de locais, tal aplicativo não detecta possíveis obstáculos e pessoas que possam estar no caminho do usuário. Assim, a missão deste projeto é, através de visão computacional e processamento de imagem, identificar possíveis obstáculos que posam surgir 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 submeter ou desenhar uma planta baixa do local de interesse, seja uma casa ou shopping. Com a placa integrada a uma cámara en la cintura del usuário, e um fone de ouvido, o aplicativo calcula a posição no ambiente y permite o usuário definir para onde quer ir e dá 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 a 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 cell) e ao mesmo tempo seja de baixo custo.

Paso 1: Materiais

Materiais
Materiais

Para este projeto vamos a utilizar:

- uma placa Qualcomm Dragonboard 410c;

- biblioteca de processamento de imagem OpenCV (versión 3.1);

- cámara que se comunique con una placa (usaremos na verdade um celular android com o aplicativo IP Webcan);

- celular con sistema Android para o aplicativo;

Paso 2: Instalando OpenCV Na Dragonboard

Instalando OpenCV Na Dragonboard
Instalando OpenCV Na Dragonboard

Com linux instalado en la placa, siga los procedimientos padrões para instalar una biblioteca de processamento de imagem - OpenCV - no device. Siga como instruções deste link:

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

Paso 3: Conectar una cámara con un Dragonboard

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

Precisamos conectar una cámara que sea de olhos do deficiente con una placa de desenvolvimento Dragonboard 410c. Existem vários jeitos de fazer isso. Una placa de control de entrada para flatcables, ou seja, é compatível com as câmeras used comumente em placas as a Raspberry pi.

Neste projeto, optamos usar como cámara um Moto G 3ª Geração com o aplicativo IP Webcam (disponível en Google Play) que permite que una imagen seja transferida por wifi.

Abaixo um programa que faz aquisição simples da imagem usando una biblioteca opencv. O link passado como parâmetro no construtor do objeto VideoCapture é o IP do celular (indicado no aplicativo) + “/ videofeed”. Na imagem acima, você encontra onde is 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 consiguió 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 a câmera default.

Paso 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).

Explicación: A ideia de identificação de obstáculo vem da determinação dos contornos mais drásticos nas imagens do video, 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 mostrados nas imagens deste paso). Estando a câmera na barriga do usuário, levemente inclinada para o chão, conforme o usuário se locomove, o programa identifica 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 especificada (caminho do usuário) (vide imagem do contorno da cadeira - caso o usuário se aproxime da cadeira haverá 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, es necesario um chão razoavelmente homogêneo, de forma que os detalhes do chão não sejam seleccionados contornos.

Obs. é possível ajustar un 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 da rede wifi através do sparkfun que deve ser um vídeo de um celular acoplado a barriga do usuário. O código manda condições de parada á um aplicativo de um outro celular que 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 de onde os vídeos são recebidos e para qual android as informações são encaminhadas. Os tipos de alterações são especificadas no próprio código (assim como nos programas de teste) comentados no início do programa.

Para saber más sobre bordas de Canny e limiarização, além de outros tópicos de visão computacional, recomenda-se procurar a documentação oficial da OpenCV.

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

Para reproducir este proyecto es necesario criar um banco de datos sin datos del sitio.sparkfun.com, o proceso é muito intuitivo de forma que não será dada uma explicação mais detalhada aqui, mas colocaremos o enlace del banco que criamos para referência ().

Assim que a Dragonboard reconhece que há um obstáculo a su frente ela posta em um banco de datos construido sin 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 há 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 as classes e Interfaces utilizadas para o projeto, que são explicadas a seguir:

GetJson: é usado para fazer um get no banco de datos do data.sparkfun retornando um arquivo em formato json para una aplicación.

JsonDownloader: é onde geramos uma asynctask para de fato utilizarmos a class GetJson, a importância del uso de sta class é para não travarmos una interfaz de usuário e para isso precisamos criar uma thread diferente na aplicação.

MainActivity: nesta classe implementamos una lógica de aplicación que continuamente consulta o banco de datos, e información o usuário por meio de um audio se ele precisa para ou pode continuar caminhando.

RequestListener: É uma interfaz utilizada para forçar o MainActivity ter certas características.

SdmSoundPlayer: esta clase fue usada para gerenciar los comandos de voz de la aplicación, caso você queira inserir as suas próprias gravações você deve criar uma pasta cruda dentro de la 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 Hash. Para usar este áudio basta usar o método playSound (int key) e passar como parâmetro a chave escolhida para o sinal de voz.

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

Seguem em anexo también os arquivos de voz utilizados.

O layout da aplicação consistia de um único botão que funcionava com o método Quit implementado na MainActivity, este método simplemente forçava a aplicação a parar a consulta no banco de datos.

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

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

Paso 6: Sugestões De Continuação

Poderiamos integrar um sistema de localaização. Existe o Qualcomm iZat SDK que posui um sistema de localización que usa GNSS, acelerômetro, magnetrômetro entre outros, já embutidos no próprio processador Qualcomm Snapdragon (presente na maioria dos celulares). No entanto, havia pouca documentação e necessitava de testes mais demorados.

También gostariamos de usar um sensor de distância ultrassonico, porém tivemos problemas quanto a comunicação com a Dragonboard, que poderia ser resolvido com mais calma. Se tiver tempo, procura como bibliotecas já presentes sin kit de desenvolvimento, elas possuem diversos ejemplos para cada tipo de sensor.

No hay desarrolladores de sitios Qualcomm existen foros e tutoriais que pueden ayudar, e incluso há os tutoriais de 96Boards no you tube.

Recomendado: