Face Tracker usando OpenCV y Arduino © GPL3+
Componentes y suministros
Aplicaciones y servicios en línea
|
||||
|
||||
|
Acerca de este proyecto
El reconocimiento facial es una herramienta muy útil integrada en muchos dispositivos modernos para detectar rostros humanos con fines de seguimiento, biometría y reconocimiento de actividad humana. En este proyecto, utilicé los clasificadores en cascada Harr de OpenCV para detectar rostros humanos y el servomecanismo de movimiento horizontal/vertical para rastrear el rostro del usuario usando Arduino UNO.
¿Cómo funciona?
La detección de rostros identifica y ubica rostros humanos e ignora todos los objetos de fondo, como cortinas, ventanas, árboles, etc. OpenCV usa la cascada de clasificadores de Harr donde cada fotograma del video pasa por etapas de clasificadores y si el fotograma pasa por todos los clasificadores, el rostro está presente; de lo contrario, el fotograma se elimina del clasificador, es decir, el rostro no se detecta.
OpenCV devuelve las coordenadas cartesianas de la imagen tras la detección junto con la altura y el ancho. A partir de estas coordenadas, se pueden calcular las coordenadas del centro de la imagen usando x+ancho/2 e y+alto/2.
Estas coordenadas se pasan al Arduino UNO usando la biblioteca pyserial cuando se detecta la cara. El servo conectado al Arduino proporciona un mecanismo de giro/inclinación donde la cámara está conectada a uno de los servos. Cuando las coordenadas de la cara están alejadas del centro, el servo se alineará 2 grados (incremento o disminución) para devolverlo al centro de la pantalla.
detectar cara
He utilizado ‘haarcascade_frontalface_default.xml’ que es un modelo preentrenado para detectar rostros humanos y se puede descargar desde Git-Hub(aquí). Al descargar, el archivo xml se puede cargar usando cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
La función utilizada para la detección de rostros es cv2.CascadeClassifier.detectMultiScale()
con valor de ‘factor de escala’ en 1.1 (predeterminado) y valor de ‘minNeighbour’ en 6. Esto devuelve las coordenadas cartesianas de la imagen con alto y ancho. El aumento de ‘minNeighbour’ puede mejorar la detección de rostros pero sacrificar las velocidades de tiempo de ejecución, lo que daría como resultado una respuesta servo retrasada. Por lo tanto, el valor 6 parecía óptimo.
Para tener un reconocimiento facial preciso, se recomendaría un fondo liso ya que me enfrenté a una detección falsa debido a las cortinas en el fondo.
Cálculo de coordenadas
OpenCV devuelve las coordenadas de la cara en términos de valores de píxeles. De manera predeterminada, la resolución de video se establece en 640*480. Las coordenadas describen los valores de píxel superior izquierdo (x e y), así como la altura y el ancho. Usé las coordenadas del centro de la cara como referencia y puedo calcularlo usando x+ancho/2 y y+alto/2 y puedo verlo como un punto verde. Estas coordenadas se envían al arduino para mover el ángulo de la cámara.
El cuadrado en el centro del marco blanco describe el área en la que debería estar el centro de la cara, es decir, el punto verde. Si está fuera de la región cuadrada cuando se mueve la cara, el servo alineará la cámara para llevarla dentro de la región.
Enviar datos en serie a Arduino
Encontré esta parte difícil porque probé muchas formas de enviar las coordenadas secuencialmente al arduino, pero la respuesta fue lenta. Después de pasar horas averiguándolo, comencé a buscar proyectos similares en línea hasta que encontré este proyecto (aquí). Esto me hizo consciente de la función Serial Serial.parseInt()
que toma entradas enteras de una serie entrante de bytes. Mi enfoque para enviar datos en serie es similar al que se usa en este proyecto.
Python envía las coordenadas del centro en una sola cadena. Por ejemplo: «X100Y200», el valor 100 después de X representa la coordenada x central y 200 representa la coordenada y central.
Diseño de servos
Adjunté el servo de cambio horizontal al eje del servo de cambio vertical en el que está montada la cámara. Todos los archivos adjuntos están hechos con bandas de goma simples (no lo recomendaría ya que usé material existente disponible en casa).
Como estoy usando 2 servos para el seguimiento, se recomendaría un suministro adicional de 9 V (a través de un adaptador) al Arduino para proporcionar suficiente corriente para ambos servos. En su ausencia noté en ellos una especie de vibración sin que se movieran.
bibliotecas e instalaciones
Este proyecto requiere pisérico y opencv bibliotecas que descargué usando pip. Mi versión actual de python y OpenCV es 3.8 y 4.4.0, así que asegúrese de tener una versión similar o superior. También asegúrese de que el archivo XML para la detección de rostros esté guardado en el mismo directorio que contiene el script de python.
El script de python también requiere alguna modificación (en la línea 9) ingresando el puerto COM correcto de su arduino antes de la ejecución.
Aquí hay un video (gif) capturado por la cámara que sigue mi rostro.