Introduction: Código Para Acionar Motores Através De Visão Computacional(Python) - FACENS

Este é um código foi desenvolvido para mover um barco a partir de visão computacional. Utilizando linguagem de programação Python, GNU/Linux baseado em Debian(Linaro), placa Qualcomm Dragonboard 410c e bibliotecas relacionadas ao open source OpenCV. O código consiste em:

  • Detecção de cores
  • Tracking de objetos
  • Localização por coordenadas
  • Acionamento de motores.

Attachments

Step 1: Importando Bibliotecas Importantes

Primeiro devemos importar as bibliotecas que vamos utilizar no código. Bibliotecas para visão computacional, analise de argumentos, delay, assistencia ao Python e auxilio de pinagem.

ps.: biblioteca imutils esta comentada por não é necessaria para a utilização do produto final.

Step 2: Indicando E Mapeando Os Pinos Da Dragonboard

Este step é necessário se você for usa a dragonboard como microcontrolador dos motores.

Esta parte do código indica para placa quais pinos serão utilizados e quais suas funções (input ou output,entrada

ou saida), neste caso output.

Se caso de erro indicando que a placa não esta reconhecendo os pinos como output você deve indicar manualmente no " /sys/class/gpio" , utilizando "echo 'numero_da_GPIO' > export", logo após entre no diretório da GPIO "/sys/class/gpio/gpionumero_da_GPIO" e utilizar "echo out > export"

Ps.: Lembrando que nesse caso toda a operação deve ser feito como root e sendo executa na dragonboard 410c com sistema operacional GNU/linux baseado em debian.

Step 3: Funções De Movimento E Acionamento Dos Motores

Estas funções definem como motores serão acionados, podendo ser acionar um motor em um sentido e o outro em outro sentido, ou ligar um motor e desligar o outro, ou desligar os dois motores.

Ps.: Foi necessário o uso de um módulo ponte H para inverter os sentidos dos motores e um level shifter(https://www.instructables.com/id/Level-Shifter-Robô-Aquático); O level shifter foi usado porque as saídas da Dragonboard são 1.8V e o módulo ponte H é 5V.

Step 4: Construindo Argumentos

Nesta parte do código criamos a possibilidade de pegarmos e colocarmos um video gravado como argumento do nosso programa, isso no terminal do linux, como por exemplo "python main.py -v /home/linux/Documentos/video.mp4" e dizer o buffer máximo também.

Step 5: Iniciando Variáveis Necessárias

Nesta parte do código iniciamos variáveis necessárias como variáveis de localização e contadora de frames, que vão auxiliar o código futuramente.

Step 6: Captura De Video

Nas duas primeira linhas iniciamos duas variáveis que vão definir o "range" da cor, ou seja, a faixa de cores(HSV) que a câmera irá detectar, neste caso a câmera detectará um range de amarelo.

Nas próximas linhas de código temos um "if" para decidir se iremos capturar o vídeo através de um vídeo gravado ou vídeo-stream(webcam).

E utilizando funções da biblioteca de OpenCV capturamos o vídeo que desejamos.

Ps.: O "0" dentro da função cv2.VideoCapture(0) indica a webcam a ser utilizada.

Step 7: Utilizando Funções Do OpenCV

Começamos criando o loop em que o programa ira ser executado.

Na próxima linha de código pegamos o frame que iremos utilizar para fazer toda a analise do vídeo, vale ressaltar que o programa funciona analisando frame a frame do vídeo.

Logo após verificamos através de um if se a captura do vídeo esta seguindo como previsto.

Nas próximas duas linhas resolvemos problemas da imagem e convertemos as cores da imagem de BRG (cores trabalhadas pelo o OpenCV; blue,red e green) para HSV.

Nas quatro linhas seguintes são criada as "mascaras" que vão separar a cor amarela de todas as outras cores e jogar dentro de outro frame que a partir dai ele sera analisado este frame, e também retirada de erros capturados pela câmera para melhorar o processamento da imagem.

E nas duas ultimas linhas encontra-se os contornos da mascara e inicializa a localização do centro do objeto.

Step 8: Verificação De Quantidade E Tamanho Do Objeto

Nesta parte do código ocorre a verificação se contém um contorno através do primeiro if. Dentro deste mesmo if nas próximas quatros linhas contém funções que procuram o mais largo contorno que esta na mascara e usa isso para calcular o tamanho minimo do circulo.

O segundo if é para verificar se o contorno tem o tamanho minimo para o calculo de posição, nas três linhas de códigos seguintes é desenhado o circulo e o centroide no frame, e é atualizado a lista do tracking.

Step 9: Entrando No Loop De Movimento

O loop é necessário para analisar os movimentos do barco. Logo em seguida tem um if para verificar se tem algum ponto para fazer o tracking, caso não tiver ele pula as funções de movimento.

O próximo if verifica se foram acumuladas pontos suficientes no buffer.

Nas próximas quatro linhas de código é introduzidos os respectivos valores as variáveis inicializadas anteriormente.

Os próximos quatro if verifica onde esta localizado o objeto e envia uma letra para uma variável para mostra em qual posição esta o objeto.

Step 10: Acionamento Dos Motores

Esta sequência de if faz a verificação da posição do objeto e de acordo com a posição do objeto são acionados os motores.

Step 11: Verificação De Movimentos E Direções

Os dois primeiros if verificam se tem algum movimento significativo para trocar as posições dos motores.

Os outros dois verificam em quais direções foram feitas esses movimentos.

As duas ultimas funções são para conectar as linhas nas novas coordenadas.

Step 12: "Printando" No Frame As Posições

As primeiras 4 funções "printam" na tela a posição do objeto no exato momento em que é feito o vídeo stream.

A função seguinte mostra ao usuário o resultado final do tracking(imagem a cima).

Step 13: Saindo Do Programa

A primeira linha e segunda desta parte do código indica para o programa que espere uma tecla do teclado a ser acionada para finalizar o programa

O if indica qual tecla sera acionada para o fim do programa.

As duas ultimas linhas desliga a câmera e fecha as janelas.