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.
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:
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:
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:
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:

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.
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:
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:

Diagrama do circuito eletrônico
Neste diagrama, é possível observar os seguinte componentes:
Conexões:
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.

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.

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).
O funcionamento nosso projeto você pode conferir no vídeo a seguir
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.
|
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!