jueves, 12 de marzo de 2015

Controlamos las Maquinas Aplicando la Visión Artificial (II)

Aquí estamos de nuevo. ¡¡Preparad Arduinos, servos y cables. que empezamos¡¡

Hoy, partiendo de lo que vimos en la entrada anterior, lo adaptaremos, modificaremos y lo enlazaremos con nuestros robots.



Vaya por delante que yo no invento nada, que todo lo que voy a decir aquí ya está inventado y realizado cien mil veces mejor de lo que lo pueda hacer yo. Esto lo hago por satisfacción personal, para aprender, divertirme y divertirme junto a mi hija. Si buscáis en la red, encontrareis miles de páginas con esta información, tesis universitarias y miles de robonautas que han investigado esto antes y que gracias a ellos yo hago mis pinitos.

Con este blog solo intento aportar mi granito de arena a la hora de compartir el conocimiento y si con ello, ayudo a alguien, pues mejor que mejor.

Vamos a empezar

Si recordamos de la entrada anterior, la instrucción que nos devolvía las caras detectadas era:

     caras = detector.detectMultiScale(
        gris,
        scaleFactor=1.1,
        minNeighbors=5,
        minSize=(30, 30),
        flags=cv.CV_HAAR_SCALE_IMAGE
    )


Con dicha instrucción lo que obtenemos es una lista de objetos detectados y de cada uno de ellos tenemos el origen (X e Y) y sus dimensiones (w --> ancho y h --> alto) .

O sea, que si conocemos todos esos datos resulta fácil calcular cual es el centro del rectángulo que enmarca la cara:

        centroCaraX = x + (w/2)
        centroCaraY = y + (h/2)


y mas fácil aun es calcular el centro de la pantalla o imagen donde mostramos la captura de la cámara:

        imgAncho = 640
        imgAlto = 480
        ...
        centroPantallaX = (imgAncho/2)
        centroPantallaY = (imgAlto/2)


Bien, pues la magia está preparada. Ya tenemos todos los ingredientes preparados para lo que queremos a hacer. 

 Si conocemos el centro de la imagen y conocemos el centro de la cara detectada, podemos calcular el desplazamiento de nuestra cara respecto al centro de la cámara cada vez que nos movemos.

    angX = centroCaraX - centroPantallaX
    angY = centroCaraY - centroPantallaY


Pues bien, si cogemos estos valores y los enviamos a nuestro arduino que tiene un programa cargado para mover un sistema Pan-Tilt, el resultado es:





¡¡¡A que mola!!!

Podemos manejar un sistema Pan-Tilt con el movimiento de nuestra cabeza. ¡¡ Genial !!

Os imagináis la de cosas que se pueden hacer. Hemos utilizado una de las muchas características de OpenCV, pero se pueden explorar y experimentar muchísimas más. 

¡¡¡Imaginación al poder!!!

Como siempre, en este enlace os dejo las fuentes de los programas utilizados y los ficheros Freecad, stl y step de las piezas impresas

En los próximos días subiré el programa de detectar caras programado con Processing. 

Aquí os pongo el video del resultado con Processing






Espero que os haya gustado y como diría Arantxa "Si yo he podido hacerlo, seguro que vosotros también".

No hay comentarios:

Publicar un comentario