Automação Residencial

Visão Computacional – Controlando um relé com as mãos

Eletrogate 29 de maio de 2024

Introdução

A visão computacional é uma faceta da inteligência artificial que permite a máquinas e sistemas interpretarem e processarem informações visuais do mundo como humanos. Neste projeto, exploramos a capacidade da visão computacional de transformar simples movimentos das mãos em comandos efetivos para controlar uma lâmpada.

Utilizando a plataforma Arduino em conjunto com a biblioteca cvzone para processamento de imagem em Python, desenvolvemos um sistema que não apenas detecta, mas também interpreta gestos das mãos em tempo real. Este método não só elimina a necessidade de interruptores físicos, como também promove a inclusão, oferecendo uma nova forma de interação para pessoas com limitações físicas, tornando o ambiente doméstico mais acessível e inteligente.


O que é visão Computacional

A visão computacional é um campo da ciência da computação que envolve o desenvolvimento de técnicas para permitir que computadores interpretem e entendam o conteúdo visual do mundo. Seu objetivo principal é automatizar tarefas que o sistema visual humano pode fazer, como reconhecer objetos, pessoas, cenas, e realizar ações com base nessa informação.

As etapas que abrangem a visão computacional são:

  1. Aquisição de imagem: Envolve a captura de imagens ou vídeos através de câmeras ou outros dispositivos de entrada.
  2. Processamento de imagem: Após a captura, as imagens podem passar por várias etapas de processamento para melhorar a qualidade, remover ruído, ou destacar certas características importantes. Isso inclui técnicas como filtragem, ajuste de contraste e conversão para escalar cinzas.
  3. Análise da imagem: Esta etapa envolve entender o conteúdo da imagem. Métodos como detecção de bordas, segmentação, e reconhecimento de padrões são usados para identificar objetos, formas, e texturas na imagem.
  4. Interpretação e Tomada de Decisão: Com base na análise, o sistema tira conclusões sobre o que foi visto na imagem. Isso pode incluir identificar e classificar objetos, entender o layout de uma cena, ou estimar movimentos em vídeos.
  5. Ação: Em muitos sistemas de visão computacional, a interpretação das imagens leva a uma ação específica. Isso pode ser desde simples notificações até o controle de robôs em ambientes industriais.

Linguagem de Programação Python

Python é uma linguagem de programação de alto nível, interpretada e de script conhecida por sua simplicidade e legibilidade, além de sua ampla aplicabilidade.

Essa linguagem se destaca na área de visão computacional devido à sua simplicidade, flexibilidade e ao vasto ecossistema de bibliotecas disponíveis. Vamos explorar como Python é usado na visão computacional, destacando a principal biblioteca e sua aplicação:


Biblioteca OpenCV

A biblioteca OpenCV (Open Source Computer Vision Library) é uma da ferramentas mais populares e abrangentes para visão computacional.

Principais Características e suas Capacidades:

  1. Processamento de Imagem e Vídeo: OpenCV oferece funcionalidades para manipulação básica de imagens e vídeos, como filtros, transformações geométricas, conversões de cores, redução de ruído e melhoramento de imagem.
  2. Detecção e Reconhecimento de Objetos: A biblioteca inclui vários algoritmos pré-teinados e prontos para detecção  de rostos, pessoas, placas de carros, e outros objetos. Esses algoritmos incluem detecção de bordas, detecção de cantos, e reconhecimento de padrões usando métodos como SVM, redes neurais e deep learning.
  3. Análise Estrutural e Descrição de forma: A biblioteca OpenCV pode ser usada para analisar a forma e a estrutura de objetos em imagens, ajudando na classificação de objetos com base em suas características geométricas.
  4. Calibração de Câmera e Reconstrução 3D: A biblioteca suporta várias rotinas para estimar a pose de câmera e reconstruir ambientes 3D a partir de múltiplas imagens, o que é fundamental em aplicações de realidade aumentada e robótica.
  5. Rastreamento de objetos e Análise de Movimento: OpenCV fornece ferramentas para rastrear movimentos ou objetos em vídeos, útil em sistemas de vigilância, pesquisa em movimento humano e interfaces interativas.
  6. Integração com IA e aprendizado de máquinas: A biblioteca se integra bem com frameworks de aprendizado de máquina como TensorFlow e Pytorch, permitindo que desenvolvedores implementem e treinem modelos avançados de deep learning para tarefas complexas de visão computacional.

Exemplo Prático em Python:

Para desenvolver um sistema de visão computacional com Python, primeiro instale a biblioteca OpenCv, que pode ser feita usando o comando “pip install opencv-python” no cmd do computador (é necessário já ter o python instalado na máquina).

Para vermos um exemplo simples de como usar OpenCV, vamos utilizar o Visual Studio Code, e faremos um código para ler e exibir uma imagem:

Blog-Eletrogate-OpenCv

Código de exemplo da biblioteca OpenCv

Este projeto demonstra a facilidade com que se pode começar a usar OpenCV em Python para tarefas básicas de processamento de imagem.


Biblioteca CVZONE

A biblioteca cvzone é um módulo Python desenvolvido para simplificar o trabalho com visão computacional, especialmente em projetos que envolvem o processamento de imagem e vídeo. Ela funciona como uma camada de abstração sobre bibliotecas como OpenCV, tornando mais acessíveis algumas das tarefas mais comuns e complexas na área de visão computacional.

Principais Características e suas Funcionalidades:

  • Detecção de mãos: Um dos módulos mais utilizados da biblioteca cvzone é o ‘HandTrackingModule’, que permite detectar e rastrear as mãos em tempo real utilizando modelos de aprendizado de máquina. é capaz de identificar a posição das mãos, como também os estados dos dedos (levantados ou baixados.) É essa funcionalidade que veremos no nosso projeto.
  • Rastreamento de pose: Essa biblioteca também é utilizada para aplicações que envolvem captura de movimento e análise corporal.
  • Controle de gestos: Além de detectar mãos e poses, essa biblioteca pode ser usada para desenvolver a interface do usuário baseada em gestos, permitindo interações sem contato físico com o computador.

Prática com o Arduino

O coração do nosso projeto é um Arduino Uno. Usamos uma webcam conectada ao computador, mas se for da sua preferência também pode utilizar uma câmera compatível com Arduino para capturar o vídeo.

Veja o diagrama do projeto a seguir:

Blog-Eletrogate-Diagrama-circuito-Visao_Computacional

Diagrama do circuito eletrônico

Neste diagrama, é possível observar os seguinte componentes:

  • Arduino Uno: O microcontrolador principal do circuito.
  • Relé: Um módulo de relé azul está conectado ao Arduino. Os relés são usados para permitir que um que um circuito de baixa potência controle um elemento de maior potência, agindo como um interruptor
  • A Lâmpada está conectada ao relé. A energia para acionar a lâmpada vem de uma fonte externa, indicada como VCC e GND no diagrama.

Conexões:

  • Os fios vermelhos e pretos fornecem energia e terra ao módulo de relé, conectados no 5V e no GND do arduino respectivamente.
  • O fio verde conecta conecta a entrada do relé ao pino 3 do arduino para controle do relé.
  • O fio amarelo, conectado ao relé é o fio de carga que fornece energia à lâmpada quando o relé é acionado.

Programação

Para obter sucesso com nosso código, precisamos instalar as seguintes bibliotecas através do nosso CMD além de já possuir o Python versão 3.9 ou superior instalado. Também utilizamos o VS Code como ambiente de desenvolvimento, mas você pode utilizar a IDE de sua preferência.

Os comandos para a instalação das bibliotecas são:

OpenCv – pip install opencv-python

cvzone – pip install cvzone

mediapipe – pip install mediapipe

Veja o código a seguir:

import cv2
import serial
from cvzone.HandTrackingModule import HandDetector

conectado = False
porta = 'COM18'
velocidadeBaud = 115200

try: 
   SerialArduino = serial.Serial(porta, velocidadeBaud, timeout=0.2)
   conectado = True
except serial.SerialException: 
   print("Erro ao conectar. Verifique a porta serial ou religue o Arduino")


video = cv2.VideoCapture(1)
detector = HandDetector(detectionCon=0.7)
while True:
   check, img = video.read()
   hands, img = detector.findHands(img)
   if hands:
      finges = detector.fingersUp(hands[0])
      if finges[0] == 1 and finges[1] == 1 and finges[2] == 0 and finges[3] == 0 and finges[4] == 1:
         SerialArduino.write('1\n'.encode())
      
      if finges[0] == 0 and finges[1] == 0 and finges[2] == 0 and finges[3] == 0 and finges[4] == 0:
         SerialArduino.write('0\n'.encode())

   cv2.imshow('IMG', img)
   cv2.waitKey(1)

Detalhando o código, primeiramente importamos as bibliotecas cv2 e OpenCV para processamento de imagens e vídeo. Em seguida, importamos a biblioteca serial para a comunicação serial, usada para comunicação com o Arduino.

from cvzone.HandTrackingModule import HandDetector

Na linha três, importamos o módulo HandDetector da biblioteca cvzone, que é usada para detecção de mãos em vídeos.

conectado = False

Na linha 4 definimos uma variável booleana para verificar o estado de conexão com o Arduino.

porta = 'COM5'

Na linha 5 definimos a porta serial para conexão com o Arduino. No meu caso, a porta padrão é COM5 (Lembre-se de ajustar conforme a sua porta padrão, o sistema operacional e configuração).

velocidadeBaud = 115200

Na linha 6 definimos a velocidade de comunicação serial em baud rate para 155200.

video = cv2.VideoCapture(0)
detector = HandDetector(detectionCon=0.7)

Nas linhas 17 e 18, iniciamos a captura de vídeo utilizando a primeira câmera conectada ao sistema. (Conferir qual é a sua primeira câmera e se não for utilizá-la, trocar o número 0 para o número que sua câmera estará conectada).

Em seguida criamos um objeto detector para detectar mãos no vídeo com 70% de nível de confiança.

while True:
check, img = video.read()
hands, img = detector.findHands(img)
   if hands:
      finges = detector.fingersUp(hands[0])
      if finges[0] == 1 and finges[1] == 1 and finges[2] == 0 and finges[3] == 0 and finges[4] == 1:
         SerialArduino.write('1\n'.encode())
      if finges[0] == 0 and finges[1] == 0 and finges[2] == 0 and finges[3] == 0 and finges[4] == 0:
         SerialArduino.write('0\n'.encode())

   cv2.imshow('IMG', img)
   cv2.waitKey(1)

No loop infinito While True, lemos um frame do vídeo, retornando um booleano que indica se foi bem sucedido e o próprio frame. Detectamos as mãos no frame capturado e retornamos uma imagem com as mãos detectadas marcadas.

Quando uma mão é detectada, determinamos quais dedos da primeira mão detectada estão levantados. Com esse resultado verificamos se determinados dedos são correspondentes aos da mão da imagem a seguir indicando um gesto específico.

blog-eletrogate-sinal-acender

Sinal para acender a lâmpada

Quando correspondente a esse sinal, envia-se um comando ao Arduino para acionar o relé e acender a lâmpada.

blog-eletrogate-sinal-apagar

Sinal para apagar as mãos

Caso o sinal seja o da imagem 2, envia-se um comando ao Arduino para desligar o relé, e consequentemente a lâmpada.

Para fazer o Arduino receber os comandos, temos o seguinte código:

String comando = ""; //Variável que guarda o comando 
bool comandoFinalizado = false; //Variável que confirma se recebeu o comando completo ou não 

void setup() { 
  Serial.begin(115200); 
  comando.reserve(200); // reserva 200 caracteres para o comando 
  pinMode(3, OUTPUT); 
  digitalWrite(3, HIGH); 
} 

void loop() { 
  
  if(comandoFinalizado){ //Se o comando foi finalizado 
    if(comando.startsWith("0")){ // E se o comando recebido for 0 
      digitalWrite(3, HIGH); // Desliga a lâmpada através do relé 
    } 
    if(comando.startsWith("1")){// Se o comando recebido for 1 
      digitalWrite(3, LOW); //Acende a lâmpada através do relé 
    } 
    comando = ""; // Limpa a variável do comando 
    comandoFinalizado = false; // retorna a variável comandoFinalizado como falsa 
  } 
}
 
 void serialEvent(){
    while (Serial.available()){
      char inChar = (char)Serial.read();
      comando += inChar;
      if(inChar == '\n'){
        comandoFinalizado = true;
      }
    }
  }

Neste código, conferimos se o comando enviado em Python para o Arduino através do monitor serial foi recebido e se está completo. Ao confirmar, verificamos se este comando corresponde a alguma das opções (0 – para apagar a lâmpada e 1 – para acender a lâmpada).


Vídeo

O funcionamento nosso projeto você pode conferir no vídeo a seguir


Conclusão

Este projeto demonstrou eficazmente como a visão computacional pode ser aplicada para controlar interfaces e dispositivos domésticos de maneira inovadora e acessível. Através do uso do Arduino e da biblioteca cvzone, conseguimos transformar gestos das mãos em comandos práticos para acender e apagar uma lâmpada, destacando o potencial de tais tecnologias para melhorar a acessibilidade e a interatividade em ambientes inteligentes.


Referências

  • https://www.youtube.com/watch?v=N-70d6Cp8xo
  • https://www.youtube.com/watch?v=winCGaZNy_c
  • https://www.youtube.com/watch?v=_qg-fQT0DRs

Sobre o Autor


Lívia Gonçalves
Livia-Goncalves-01
@liviagoncalves_dev

Estudante de Engenharia da Computação e Instrutora de tecnologia e programação.


Eletrogate

29 de maio de 2024

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Conheça a Metodologia Eletrogate e Lecione um Curso de Robótica nas Escolas da sua Região!

Eletrogate Robô

Assine nossa newsletter e
receba  10% OFF  na sua
primeira compra!