PDA

Ver la versión completa : Chroma en Linux con Kinect



juanvvc
02/01/2012, 03:18
Bueno, habíamos pedido a los reyes un Kinect para la X360. Pero como queríamos usarlo este mismo fin de año (lo pasamos en una masía apartada del mundo) se han adelantado y sin abrir siquiera me lo llevé. Y tonto de mí, olvidé llevarme el mando. Sí, mucho "tú eres el mando", pero necesitas un mando real para darle a "OK" la primera vez :D

Así que no pude probarlo en fin de año, pero sí esta noche que ya hemos vuelto a casa. Y en vez de a la consola lo he enchufado al ordenador. En Linux y con el driver freenect es sorprendentemente sencillo de programar. Pero muy sorprendentemente. Así que he hecho un pequeño vídeo con opencv para probarlo.

Un "efecto chroma": las cosas que están lejos desaparecen para poner cualquier imagen que se nos ocurra. Por ejemplo, la masía de la Villawey de este año:


http://www.youtube.com/watch?v=F2Xe7UPzqY0

(el vídeo no tiene sonido porque no he programado que tome el audio de los micros del Kinect, pero también puede hacerse)

¡Apenas media hora me ha llevado programar esto en Python! ¡Y sin saber nada de antemano!

Librerías:

- freenect (http://openkinect.org/wiki/Main_Page) para conectarse al Kinect y obtener las imágenes de sus cámaras y el sonido en tiempo real. La distancia de los objetos a la cámara se obtiene como un mapa de profundidad (http://en.wikipedia.org/wiki/Depth_map). El primer programa ha sido en C para mover el motor de la cámara del Kinect, y el segundo éste en Python. En ambos lenguajes es igual de fácil conectarse al Kinect.
- frame_convert es un pequeño módulo que viene con los ejemplos de uso de freenect para Python. Convierte las imágenes del Kinect en el formato de opencv. Utiliza numpy (http://numpy.scipy.org/), la librería de procesado matemático de Python para matrices grandes similar a Matlab, así que numpy tiene que estar instalada.
- opencv (http://opencv.willowgarage.com/wiki/) para procesar vídeo en tiempo real. Tiene versión Python. Permite procesar las imágenes para hacer la composición, verlas en la pantalla y guardarlas en un archivo de vídeo, todo a la vez. Incluye algunas funciones de reconocimiento de objetos, así que ése será el siguiente paso para probar.



#!/usr/bin/python
# -*- coding: utf-8 -*-
#
import freenect
import cv
import frame_convert

cv.NamedWindow('Chroma')
print('Press ESC in window to stop')

fondo = cv.LoadImageM('fondo.jpg')
video = cv.CreateVideoWriter("out.avi", cv.CV_FOURCC('P','I','M','1'), 30, (640, 480), 1)

THRESHOLD = 200

def get_chroma():
# Toma la imagen de distancias
im = frame_convert.pretty_depth_cv(freenect.sync_get_de pth()[0])
# crea la máscara: todo lo que esté más lejos de THRESHOLD es negro, el resto blanco
mask = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_8U, 1)
cv.Threshold(im, mask, THRESHOLD, 1, cv.CV_THRESH_BINARY_INV)

# toma la imagen de la cámara
im = frame_convert.video_cv(freenect.sync_get_video()[0])
# crea el doble buffer
dst = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_8U, 3)

# copia el fondo completo y la imagen real usando la máscara
cv.Copy(fondo, dst)
cv.Copy(im, dst, mask)

cv.WriteFrame(video, dst)

return dst

while 1:
cv.ShowImage('Chroma', get_chroma())
if cv.WaitKey(10) == 27:
break


100€ con Adventures, Gunstringer y nosequé Fruit. Aún no he probado ninguno de los tres :D

Como en la consola sea la mitad de divertido, es una compra enorme.

Endor
02/01/2012, 07:14
Juer, Juan, no probaste el kinect en villawey? yo creo que es una gran inversión, incluso aunque sólo sea para ejercitarse!!!

chipan
02/01/2012, 09:05
¡Kinect y Linux! ¡Dos de mis mayores enemigos juntos en un hilo! NOOOOOOOOOOOOOOOOoooOoOOOooOOooo
Chipan implosiona y se desintegra.


Chorreces aparte, está guay ese efecto "cortina virtual"

GameMaster
02/01/2012, 09:09
Lo probé ayer por primera vez y ahora no podria venir en mejor momento la noticia

juanvvc
02/01/2012, 09:41
Chipan, en Windows debería funcionar igual. Exactamente el mismo script, sin cambiar nada de nada. Solo habría que instalar Python, freenect, numpy y opencv en Windows (que según sus webs se puede) Pero no tengo ningún Windows para probarlo. Lo que me ha llamado la atención es que en Linux esté soportado así, enchufar y listo, y que además sea tan sencillísimo programar para él: con un hardware tan extraño eso no es ni mucho menos normal.

Endor, sí que lo probé en Villawey. De hecho si se lo pedimos a los reyes es porque As lo estaba pidiendo desde el verano :D

GameMaster, parece que ahora es un buen momento para comprar Kinect porque por 100€ lleva el Gunstringer (descargable, no físico) además del Adventures. Me lo encontré de sorpresa dentro de la caja, por fuera solo pone que incluye el Adventures. Mirando por internet parece que es una promoción de Microsoft solamente hasta reyes. De hecho estuve con el Gunstringer en la mano a punto de comprarlo pero me pareció carísimo (40 pavos nada menos).

dardo
02/01/2012, 09:52
Ostia, ¡el Punset!

< - >

Chipan, en Windows debería funcionar igual. Exactamente el mismo script, sin cambiar nada de nada. Solo habría que instalar Python, freenect, numpy y opencv en Windows (que según sus webs se puede) Pero no tengo ningún Windows para probarlo. Lo que me ha llamado la atención es que en Linux esté soportado así, enchufar y listo, y que además sea tan sencillísimo programar para él: con un hardware tan extraño eso no es ni mucho menos normal.

Endor, sí que lo probé en Villawey. De hecho si se lo pedimos a los reyes es porque As lo estaba pidiendo desde el verano :D

GameMaster, parece que ahora es un buen momento para comprar Kinect porque por 100€ lleva el Gunstringer (descargable, no físico) además del Adventures. Me lo encontré de sorpresa dentro de la caja, por fuera solo pone que incluye el Adventures. Mirando por internet parece que es una promoción de Microsoft solamente hasta reyes. De hecho estuve con el Gunstringer en la mano a punto de comprarlo pero me pareció carísimo (40 pavos nada menos).

No es un hardware extraño, aunque sean muchos dispositivos es un sólo cacharro muy conocido.

Intenta hacer algo parecido con dos webcam cualquiera y un micrófono y ya verás como es menos fácil.

juanvvc
02/01/2012, 09:56
Intenta hacer algo parecido con dos webcam cualquiera y un micrófono y ya verás como es menos fácil.

De hecho la webcam integrada de uno de mis portátiles no hay bemoles de hacerla funcionar: para Linux, no existe :confused: Y la parte mala del driver de Kinect para Linux es que el kernel, o Alsa, o PulseAudio, o lo que sea que se utilice ahora para el sonido, parece que no lo reconoce como micrófono externo :( Supongo que será cuestión de tiempo porque los cuatro (lleva 4 micros internos) streams de sonido están ahí y son accesibles desde Python ó C para guardarlo en un WAV, por ejemplo.

(estas cosas las mimo mucho porque hago constantemente videoconferencias)

http://imgs.xkcd.com/comics/python.png

La verdad es que Python tiene de todo. Cuando tenía el Lego Mindstorm, había una librería Python para comunicarse con el robot a través de Bluetooth y enviarle comandos :D

dardo
02/01/2012, 11:30
De hecho la webcam integrada de uno de mis portátiles no hay bemoles de hacerla funcionar: para Linux, no existe :confused: Y la parte mala del driver de Kinect para Linux es que el kernel, o Alsa, o PulseAudio, o lo que sea que se utilice ahora para el sonido, parece que no lo reconoce como micrófono externo :( Supongo que será cuestión de tiempo porque los cuatro (lleva 4 micros internos) streams de sonido están ahí y son accesibles desde Python ó C para guardarlo en un WAV, por ejemplo.

(estas cosas las mimo mucho porque hago constantemente videoconferencias)

http://imgs.xkcd.com/comics/python.png

La verdad es que Python tiene de todo. Cuando tenía el Lego Mindstorm, había una librería Python para comunicarse con el robot a través de Bluetooth y enviarle comandos :D

te has dejado sin comentar la parte interesante del comentario, que no es acerca de Kinect ni python, si no de tu similitud a Punset en la expresión corporal.

juanvvc
04/01/2012, 01:37
Aunque probablemente no os interese sigo probando cosillas del Kinect éste. Ya lo he probado en la tele y el Fruit Ninja es mucho más divertido de lo que parecía. As y yo nos hemos pasado la noche ahí cortando piñas :D

En el PC empiezo a hacer un juego de Pong. Los rectángulos azules marcan dónde están las manos y como podéis ver por ahora no son demasiado fiables. Si pongo las dos manos se hace un lío del copón.


http://www.youtube.com/watch?v=NSQ5zS4bqzA

Lo más sorprendente es el poco código necesario para hacer esto: en un rato de Python estaba funcionando. La parte del programa que detecta la posición de las manos es tan simple como esto:



# Toma la imagen de distancias
im = frame_convert.pretty_depth_cv(freenect.sync_get_de pth()[0])
# crea la máscara: todo lo que esté más lejos de THRESHOLD es negro, el resto blanco
mask = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_8U, 1)
cv.Threshold(im, mask, THRESHOLD, 1, cv.CV_THRESH_BINARY_INV)
# busca los contornos de la imagen tras aplicar el umbral
seq = cv.FindContours(mask, cv.CreateMemStorage(), mode=cv.CV_RETR_EXTERNAL, method=cv.CV_CHAIN_APPROX_SIMPLE)
if seq:
# calculamos los límites de la mano como un rectángulo
x, y, w, h = cv.BoundingRect(seq, update=0)
# le decimos a nuestro rectángulo dónde está ahora
rect.update_pos(x+w/2, y+h/2)


Sigue sin haber sonido porque tengo un trancazo encima que no me reconozco ni yo.

_-Caleb-_
04/01/2012, 01:55
Dios que grande Juan... por cierto el primer video merece audio... :D

Joer que currada :D

juanvvc
04/01/2012, 02:00
Qué va, si esa es la gracia: no hay apenas trabajo porque todo es sencillísimo.

A ver si me pongo con la librería OpenNI para detectar el esqueleto completo del cuerpo, pero por ahora me hace ilusión detectar yo mismo las manos y seguiré tirando por ahí.

Asly
04/01/2012, 02:06
Cuidado juan, mis sensores me indican que están bajando considerablemente tus niveles de procastinación :D

Menudo crack estás hecho ******

Molondro
04/01/2012, 07:34
http://www.youtube.com/watch?v=F2Xe7UPzqY0

Irene tiene que ver ésto si o si xD

Estás hecho un crack.

juanvvc
06/01/2012, 05:09
Bueno, y ya el último y como mi regalo de reyes al foro, un juego "completo". Quiero decir, jugable. Aún le faltarían muchas cosas por hacerle pero seamos serios, no lo voy a hacer :D

Os cuento: el tiempo dedicado ha sido mientras las sobrinillas veían la cabalgata, y desde que As se ha ido a dormir hasta ahora. En total menos de 4 horas con el diseño de los niveles incluidos (hay 20 que salen aleatorios) y comprender cómo funciona cinelarra para haceros el vídeo también.

La idea es tapar las partes verdes y no las rojas. El vídeo se ha grabado acelerado porque no le he puesto limitador de FPS.


http://www.youtube.com/watch?v=zqb9psoGmGs

(el pijama que llevo también es regalo de reyes)

En adjuntos el código y los niveles por si alguien quiere echarle un vistazo. Aviso: no hay un solo comentario y como lo he escrito muy deprisa el código no está bien organizado. Pero funciona en Linux y debería funcionar también en Windows si todas las librerías necesarias están instaladas.

GPL y eso. Mañana pruebo el modo dos jugadores, que si despierto a As por esto me corre a gorrazos :D

GameMaster
06/01/2012, 10:26
Pero te compraste el kinect separao ? Yo me pille el pack con xbox de Kung fu panda 2 (solo habia este y el de kinectic sports), y el juego de opcion se tiene que sacar de internet, en el mio no decia nada del gunstringer, ya veo que viene solo con el kinect suelto...

Mo1
06/01/2012, 10:59
Pero te compraste el kinect separao ? Yo me pille el pack con xbox de Kung fu panda 2 (solo habia este y el de kinectic sports), y el juego de opcion se tiene que sacar de internet, en el mio no decia nada del gunstringer, ya veo que viene solo con el kinect suelto...

Hay dos packs de kinetc.

Kinect + Adventures fisico

Kinect + Adventures físico + Gunstringer y otro más descargables. Además en Carrefour regalaban uno de Bob Sponja físico tb, y por el mismo precio lol XD

juanvvc
06/01/2012, 12:28
Compre el kinect solo por 100 euros, x360 ya tenía. Estoy empezando a pensar que en el Game me metieron la tarjeta del Gunstringer por mi cara bonita, porque en la caja no ponía nada y el pack completo lo he visto considerablemente más caro en otros sitios :D

Lo malo de comprar kinect+consola es que así no trae el transformador externo, que es necesario para conectarlo al PC.

GameMaster
06/01/2012, 12:46
Que !? Transformador externo ! No joas....

juanvvc
06/01/2012, 12:59
si te fijas, el conector no es USB, es un poco mas grueso y no cabe. parece que el kinect necesita mas potencia que la que da el usb normal.

si compras el kinect separado, trae un adaptador a usb con toma de corriente externa y transformador. Es necesario para x360 antiguas... y PCs.

GameMaster
06/01/2012, 13:28
Me siento profundamente timao, lo pone en la caja ?
Ahora vete a saber donde pillarlo y cuanto cuesta, no me he dao cuenta antes por no haberlo probao todavia en PC...

otto_xd
06/01/2012, 13:33
Me siento profundamente timao, lo pone en la caja ?
Ahora vete a saber donde pillarlo y cuanto cuesta, no me he dao cuenta antes por no haberlo probao todavia en PC...

Mira en hcgamer, seguro que luis tiene alguno por la tienda

GameMaster
06/01/2012, 13:55
http://www.elotrolado.net/hilo_el-pack-de-kinect-con-xbox-s-no-incluye-adaptador-ac_1514368

Si ya lo esperaba... 28 pavos...

otto_xd
06/01/2012, 13:57
http://www.elotrolado.net/hilo_el-pack-de-kinect-con-xbox-s-no-incluye-adaptador-ac_1514368

Si ya lo esperaba... 28 pavos...

Pero que dices?
http://www.hardcore-gamer.net/tienda/product_info.php/cPath/258_263/products_id/10045

GameMaster
06/01/2012, 14:49
Ya, pero me refiero al oficial.

juanvvc
06/01/2012, 17:18
Como no me dejan subir vídeo completo, solo una fotillo del juego de dobles.

¡Con este juego se pilla cacho!

vizales77
08/01/2012, 17:38
eres un crack!!