



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:

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:

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 HandDetectorNa linha três, importamos o módulo HandDetector da biblioteca cvzone, que é usada para detecção de mãos em vídeos.
conectado = FalseNa 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 = 115200Na 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.


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.
|
Descubra como transformar gestos das mãos em comandos de luz com o projeto de Visão Computacional usando Arduino! Aprenda a manipular dispositivos de forma intuitiva e inclusiva, eliminando a necessidade de interruptores físicos. Neste projeto você verá desde os fundamentos da visão computacional até a prática com Arduino e Python, incluindo detalhes sobre a integração com as poderosas bibliotecas OpenCV e cvzone.
Encontre tudo na Loja Eletrogate com frete grátis para compras acima de R$ 200