Introduccion al motion capture con kinect/Blender

Foro dedicado a la integración e interacción entre Blender 3D y Kinect para animación, modelado, motion capture, etc.
Xianur0
Mensajes: 14
Registrado: Sab Feb 26, 2011 8:56 pm
Nombre:
Contactar:

Introduccion al motion capture con kinect/Blender

Mensaje por Xianur0 » Lun Feb 28, 2011 4:55 pm

Hola, me presento mi nombre es Oscar García López y moderare esta sección del foro. Comenzaremos hablando un poco de motion capture con kinect, antes que nada vamos a comenzar entendiendo el como funcionan las librerías que utilizaremos, para esta practica utilizaremos OpenNi/Nite.

OpenNi: Es una especie de framework/driver liberado por la empresa PrimeSense (involucrada con el desarrollo del hardware de kinect) que entre otras cosas nos permite tener acceso al sensor de profundidad.
Nite: Una extensión de OpenNi que nos permite reconocer gestos (movimientos) y realizar \"skeleton tracker\".

de momento no nos centraremos en como se instalan estas herramientas, mas bien en su uso, sobre la instalación: http://www.beta2k.es/instalar-driver-de ... penninite/

aquí unos vídeos de lo que se vio en la conferencia de \"Hacking kinect\" que di en enli, pronto subiré mas.


[youtube=425,350]http://www.youtube.com/watch?v=iwboC-akMlY[/youtube] (este vídeo demuestra lo que se vera en esta introducción)

[youtube=425,350]http://www.youtube.com/watch?v=pnGtkImPdW8[/youtube]

(como podrán ver para cualquier persona esta clase de control es completamente natural... incluyendo los niños).

ya que se tenga funcionando las librerías vamos a comenzar a trabajar con los movimientos, en mi caso reutilice parte del código escrito por Oz Magal para \"facilitar\" un poco este ejemplo, pero próximamente terminaremos el plugin para blender.

Tuvimos un problema con blender al utilizar hilos y actualizar la ventana (debido a que kinect trabaja a 30 frames por segundo blender simplemente desbordaba, aunque quizás también se debía a la incompatibilidad con la tarjeta gráfica que utilizamos).

Para comenzar se requiere tener instalado OpenNi y Nite (y sensor), vamos a realizar este ejemplo en base al código de Oz Magal (que se encuentra en los ejemplos de Nite) llamado \"Players\", únicamente editaremos el archivo SceneDrawer.cpp (para trabajar con OpenNi/Nite se requiere saber un poco de c/c++), de momento este ejemplo lo realizaremos para trabajar sobre X11, pero próximamente subiremos el código para otras plataformas que no lo soportan.

Una vez cumplidos los requisitos previos continuemos:

En este ejemplo se mostrara como mover objetos en blender con la mano derecha (como \"mouse\") e izquierda (para tomar objetos).

Para localizar la ubicación de algún punto del usuario sincronizado (posición \"Psi\") podemos realizar lo siguiente:

Código: Seleccionar todo

XnPoint3D getpost(XnUserID player, XnSkeletonJoint eJoint1) {
	XnSkeletonJointPosition joint1;
	g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(player, eJoint1, joint1);
	return joint1.position;
}
esta función nos retornara las coordenadas (X,Y,Z) del punto solicitado, Nite nos soporta los siguientes puntos:

Nombre del punto/Valor int
XN_SKEL_HEAD/1
XN_SKEL_NECK/2
XN_SKEL_TORSO/3
XN_SKEL_LEFT_SHOULDER/6
XN_SKEL_LEFT_ELBOW/7
XN_SKEL_LEFT_HAND/9
XN_SKEL_RIGHT_SHOULDER/12
XN_SKEL_RIGHT_ELBOW/13
XN_SKEL_RIGHT_HAND/15
XN_SKEL_LEFT_HIP/17
XN_SKEL_LEFT_KNEE/18
XN_SKEL_LEFT_FOOT/20
XN_SKEL_RIGHT_HIP/21
XN_SKEL_RIGHT_KNEE/22
XN_SKEL_RIGHT_FOOT/24

el tipo XnUserID es de tipo int y sera el id del usuario del cual queremos que nos retorne sus coordenadas (se pueden sincronizar los usuarios que sean (siempre y cuando el espacio lo permita...), solo se requiere hacer algunas pequeñas ediciones en el código).

Código: Seleccionar todo

		FILE *datos = fopen(\"skeleto.txt\",\"w\"); // abrimos el archivo donde guardaremos los datos
		XnPoint3D cabeza = getpost(player, XN_SKEL_HEAD);
		XnPoint3D hombrod = getpost(player, XN_SKEL_RIGHT_SHOULDER);
		XnPoint3D hombroi = getpost(player, XN_SKEL_LEFT_SHOULDER);
		XnPoint3D caderecha = getpost(player, XN_SKEL_RIGHT_HIP);
		XnPoint3D manod = getpost(player, XN_SKEL_RIGHT_HAND);
		XnPoint3D manoi = getpost(player, XN_SKEL_LEFT_HAND);
		if(sizebrazo < 1) { // si no tenemos el tamaño del brazo lo establecemos
			cabezainicial = cabeza.Z;
			sizebrazo = (manod.Y-hombrod.Y)/2;
			printf(\"Taño brazo: %f\\n\",sizebrazo);
		}
		float centrox = (hombrod.X+hombroi.X)/2; // el centro X
		float centroy = (hombrod.Y+hombroi.Y)/2;
		float x;
		float y;
		float zoom = 50-(cabeza.Z-cabezainicial)/((sizebrazo*2)/50); // según que tan cerca esta la cabeza del usuario calculamos el zoom de la cámara que seria 50 maximo.
		if(abs(manod.X-centrox) > (sizebrazo*2) || (abs(manod.Y-centroy) > (sizebrazo*2))) { // si la mano derecha del usuario se paso del limite de la pantalla establecida para blender
			if((abs(manod.Y-centroy) > (sizebrazo*2))) { // si es en y entonces 20
				y = 20;
			} else x = 20; // si es en x igual
		} else { // de lo contrario esta en los limites y podemos calcular la medida para blender
			x = abs(manod.X-centrox)/(sizebrazo/20);
			y = abs(manod.Y-centroy)/(sizebrazo/20);
			if(x > 20) x = 20; // algo fallo
			if(y > 20) y = 20; // algo fallo
			if(manod.X < centrox) x = x-(x*2);
			if(manod.Y < centroy) y = y-(y*2);
		}
		int estado = 0;
		if(manoi.Z < (hombroi.Z-(sizebrazo))) estado = 1; // esto seria cuando se tiene la izquierda enfrente, es decir se quiere mover algun objeto
		ablender(datos,\"DERECHA\",y,x,estado,zoom); // guardamos en el archivo
		tecla(XK_A); // esta tecla solo se envia para decirle a blender que tiene que actualizar (por el bug con hilos)
ahora va el código de blender (python).

Código: Seleccionar todo

import Blender
from Blender import *
import threading
from threading import Thread

class kinect(Thread):
	def __init__ (self):
		threading.Thread.__init__(self)
		self.bucle = 1
	def stop(self):
		self.bucle = 0
	def run(self):
		global Blender
		ob = Blender.Object.Get(\'Sphere\') # tomamos a la esfera como \"puntero\"
		ob.LocX = 0
		ob.LocY = 0
		ob.LocZ = 0
		while(self.bucle):
			f = open(\"/tmp/skeleto.txt\") # direccion del archivo de coordenadas
			t = f.read()
			lineas = t.split(\'\\n\')
			t = \"\"
			linea = \"\"
			anteriorx = 0
			anteriory = 0
			for linea in lineas:
				if linea != \"\":

					d = linea.split(\'|\')

					if(d[0] == \"DERECHA\"):
						ob.LocX = float(d[1])
						ob.LocY = float(d[2])
						anteriorx = ob.LocX
						anteriory = ob.LocY
						estado = int(d[3])
						objetos = Blender.Object.Get()
						camara = Blender.Camera.Get(\"Camera\")
						if(estado == 1):
							for objeto in objetos:
								ob.LocZ = 0
								if(objeto != ob and objeto != camara and abs(objeto.LocX-ob.LocX) < 2 and abs(ob.LocY-objeto.LocY) < 2):

									objeto.LocX = ob.LocX
									objeto.LocY = ob.LocY
									print \'clicked \',objeto.name,\'!\'

						zoom = float(d[4])

						camara.lens = zoom

		print \'Hilo finalizado!\'
k = kinect()
k.start()
def draw():
	Blender.BGL.glClear(Blender.BGL.GL_COLOR_BUFFER_BIT)
	Blender.Draw.String(\"Hacking Kinect By Los Caballeros! ... Blender PoC 1\", 1, 300, 300, 350, 30, \"\", 2)

def event(evt,val):

	if evt == Blender.Draw.AKEY:
 # leemos la tecla A
		Blender.Window.Redraw()
 # actualizamos...
	if evt == Blender.Draw.ESCKEY:
 # entonces salimos con escape
		k.stop()
 # finalizamos el hilo
		Blender.Draw.Exit()
		return

 

def button(evt):
	if evt == 1:
		Blender.Window.Redraw()
Blender.Draw.Register(draw,event,button)


adjunto los códigos.
Adjuntos
Blender1.zip
(52.91 KiB) Descargado 731 veces

ALEX006
Mensajes: 5
Registrado: Dom Feb 27, 2011 3:17 pm
Nombre:

Re: Introduccion al motion capture con kinect/Blender

Mensaje por ALEX006 » Mar Mar 01, 2011 5:38 pm

OLA OYE DISCULPA LA PREGUNTA PERO PS AL EVENTO TUVE LA OPRTUNIDAD DE IR PERO NO ENTRE A LAS CONFERENCIAS Y PS LA VERDAD ME AN COMENTADO MIS COMPAÑEROS MUCHO ACERCA DE ESTA CONFERENCIA Y ME GUSTARIA Q ME RESPONDIERS SI ES POSIBLE ANIMAR CON BLENDER DESDE KINECT Y PS ME GUSTARIA PODER ESTAR EN CONTACTO PARA PODER APRENDER MAS ESPERO Y ESTES BIEN UN SALUDO.

Xianur0
Mensajes: 14
Registrado: Sab Feb 26, 2011 8:56 pm
Nombre:
Contactar:

Re: Introduccion al motion capture con kinect/Blender

Mensaje por Xianur0 » Mié Mar 02, 2011 12:02 pm

claro, de hecho en el segundo vídeo como podrás ver se esta moviendo al caracter, esos movimientos se están enviando directamente a keyframes de modo que todos tus movimientos ya están guardados y listos para renderar la animación,puedes obtener mi email en mi perfil, saludos.

Avatar de Usuario
soliman
Mensajes: 5501
Registrado: Jue Sep 01, 2005 1:13 pm
Nombre: soliman
Contactar:

Re: Introduccion al motion capture con kinect/Blender

Mensaje por soliman » Mié Mar 02, 2011 12:36 pm

Necesito algunas aclaraciones..
Primero.. todo esto esta hecho con blender versión 2.49b (supongo que con la 2.56 no funciona?)

Segundo: Veo que para windows dice que se necesita Visual Studio ...?

Tercero: ¿se puede utilizar un portatil con una webcam incorporada o necesita algun aparato diferente (camara, microfono, sensor..)

Gracias por todos los datos....
Y bienvenido al Foro G-Blender

Xianur0
Mensajes: 14
Registrado: Sab Feb 26, 2011 8:56 pm
Nombre:
Contactar:

Re: Introduccion al motion capture con kinect/Blender

Mensaje por Xianur0 » Mié Mar 02, 2011 1:56 pm

Necesito algunas aclaraciones..
Primero.. todo esto esta hecho con blender versión 2.49b (supongo que con la 2.56 no funciona?)

Segundo: Veo que para windows dice que se necesita Visual Studio ...?

Tercero: ¿se puede utilizar un portatil con una webcam incorporada o necesita algun aparato diferente (camara, microfono, sensor..)

Gracias por todos los datos....
Y bienvenido al Foro G-Blender
lo primero, se hizo en esa versión por que la mas reciente tiene algunos bugs al "redibujar" la ventana (desborda por la velocidad del kinect), pero si correría solo hay que hacer cambios mínimos (mas que nada al importar las librerías).

Segundo: no realmente, pasa que la libreria Nite tiene soporte para programar en .NET, es decir puedes programar en .NET con ella, el detalle de por que no corre este código con windows es por la tecla A que se utiliza para decirle a blender que actualice la ventana (por el bug de actualizado que tiene con hilos) se envía a X11 (que windows obviamente no utiliza), en el caso de windows se puede remplazar con SendKey().

Tercero: como podrás ver este foro es de (hacking) Kinect Sensor (xbox 360) con blender, de modo que requieres el kinect sensor, lo que se veía en la otra ventana en azul es la representación en 2d de la persona (humana) que se movía, estamos trabajando en desarrollar un sustituto para kinect con cualquier cámara, pero vamos a tardar un poco ya que no se tiene las medidas de profundidad...

Saludos espero que tus dudas hayan quedado aclaradas.

Avatar de Usuario
soliman
Mensajes: 5501
Registrado: Jue Sep 01, 2005 1:13 pm
Nombre: soliman
Contactar:

Re: Introduccion al motion capture con kinect/Blender

Mensaje por soliman » Mié Mar 02, 2011 4:37 pm

Gracias... ahora ya se por lo menos lo que es el Kinect
http://www.xbox.com/es-ES/Kinect/GetStarted

mercury
Mensajes: 288
Registrado: Lun Oct 11, 2004 1:48 pm
Nombre:

Re: Introduccion al motion capture con kinect/Blender

Mensaje por mercury » Lun Mar 07, 2011 9:42 am

que tal...
estoy tratando de instalar los controladores para poder usar mi futuro kinect, pero no consigo instalar al Nite...
esto es lo que me dice en la linea de consola:
sudo ./install.bash
./install.bash: línea 9: 5712 Instrucción ilegal niReg /usr/lib/libXnVFeatures.so /usr/etc/primesense/XnVFeatures
he intentado varias veces en diferentes distros de Ubuntu, pero siempre me detengo en este punto...
te agradeceré si me puedes ayudar.
saludos.
Pd:saludotes... :hammer:






Xianur0
Mensajes: 14
Registrado: Sab Feb 26, 2011 8:56 pm
Nombre:
Contactar:

Re: Introduccion al motion capture con kinect/Blender

Mensaje por Xianur0 » Mié Mar 09, 2011 12:14 am

el detalle esta en que no instalaste antes OpenNi (por lo que no existe /usr/lib/libXnVFeatures.so ni /usr/etc/primesense/XnVFeatures), primero instala OpenNi y luego ya Nite, puedes guiarte del siguiente enlace:

http://www.beta2k.es/instalar-driver-de ... penninite/

saludos! ;)...

mercury
Mensajes: 288
Registrado: Lun Oct 11, 2004 1:48 pm
Nombre:

Re: Introduccion al motion capture con kinect/Blender

Mensaje por mercury » Mié Mar 09, 2011 2:20 pm

que tal...
gracias por la respuesta.
pues creo que ese no es el caso; ya lo tengo instalado según el primer enlace que publicaste y no se cual sea la razón...
alguna otra idea???
Pd:saludotes... :hammer:
Adjuntos
captura.jpg
(106.59 KiB) No descargado aún






Xianur0
Mensajes: 14
Registrado: Sab Feb 26, 2011 8:56 pm
Nombre:
Contactar:

Re: Introduccion al motion capture con kinect/Blender

Mensaje por Xianur0 » Mié Mar 09, 2011 6:10 pm

por favor pega la salida del comando:

cat /proc/cpuinfo | grep ssse3


pasa que OpenNi nativamente viene con soporte para sse3...
quizás tenga algunos problemas y tengas que re-compilar...

en caso de que no tenga soporte para sse3:
ve a la carpeta del OpenNi y necesitas editar el archivo Platform/Linux-x86/Build/CommonMakefile b/Platform/Linux-x86/Build/CommonMakefile

localiza la linea:

Código: Seleccionar todo

SSE_GENERATION = 3
(aparentemente es la linea 27)
y cambiarla por:

Código: Seleccionar todo

SSE_GENERATION = 2
y re-compilar, eso debería de funcionar.

saludos! ;)...

mercury
Mensajes: 288
Registrado: Lun Oct 11, 2004 1:48 pm
Nombre:

Re: Introduccion al motion capture con kinect/Blender

Mensaje por mercury » Jue Mar 10, 2011 12:56 am

pues el

Código: Seleccionar todo

cat /proc/cpuinfo | grep ssse3
no me regreso nada en la consola...
te pongo el condenido del "cpuinfo"
processor : 0
vendor_id : AuthenticAMD
cpu family : 6
model : 8
model name : AMD Athlon(tm) XP 2200+
stepping : 1
cpu MHz : 1799.947
cache size : 256 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 mtrr pge mca cmov pat pse36 mmx fxsr sse syscall mmxext 3dnowext 3dnow up
bogomips : 3599.89
clflush size : 32
cache_alignment : 32
address sizes : 34 bits physical, 32 bits virtual power
management: ts
modifique el "SSE_GENERATION" de 3 a 2 y al compilar el nite me mostró lo siguiente:
sudo ./install.bash
./install.bash: línea 9: 6894 Instrucción ilegal niReg /usr/lib/libXnVFeatures.so /usr/etc/primesense/XnVFeatures
espero que esta información sea de ayuda y gracias por el interés ;)
saludos.
Pd:saludotes... :hammer:






Xianur0
Mensajes: 14
Registrado: Sab Feb 26, 2011 8:56 pm
Nombre:
Contactar:

Re: Introduccion al motion capture con kinect/Blender

Mensaje por Xianur0 » Jue Mar 10, 2011 12:10 pm

entonces parece que no tienes soporte para ssse3, Nite te seguirá tirando errores hasta que vuelvas a compilar e instalar el OpenNi (con los datos cambiados).

y en teoria seria todo :)...

mercury
Mensajes: 288
Registrado: Lun Oct 11, 2004 1:48 pm
Nombre:

Re: Introduccion al motion capture con kinect/Blender

Mensaje por mercury » Vie Mar 11, 2011 12:22 pm

ahora si ya estoy preocupado...
ya tengo el Kinect en mis manos y no lo puedo echar a andar xD
pues creo que tengo problemas al recompilar...
cada que trato de recompilar, parece que ya no hace nada...
que opciones le tengo que dar al \"make\" para que ignore la compilación anterior e inicie de cero???
o en su caso; como puedo eliminar la compilación pasada y tener todo desde cero???
saludos.
Pd:saludotes... :hammer:






seyacat
Mensajes: 19
Registrado: Mar Sep 07, 2004 1:05 am
Nombre:
Contactar:

Re: Introduccion al motion capture con kinect/Blender

Mensaje por seyacat » Vie Mar 11, 2011 12:39 pm

Recien me llego ayer el kinect, hoy lo voy a probar con OpenKinect a ver como lo integro al blender

mercury
Mensajes: 288
Registrado: Lun Oct 11, 2004 1:48 pm
Nombre:

Re: Introduccion al motion capture con kinect/Blender

Mensaje por mercury » Vie Mar 11, 2011 12:52 pm

con el OpenKinect ya me funciono (y fue realmente fácil ;)); al menos ya vi que si funciona el Kinect xD
Pd:saludotes... :hammer:






Responder