mercoledì 2 aprile 2014

Depth Map di Kinect con PyOpenNi e Meshlab

Su richiesta di un amico, ho provato ad usare il Kinect per fare un modello 3D del viso
Il lavoro e' diviso in due parti. In fase di acquisizione vengono salvati i dati del sensore di distanza del Kinect ogni 5 secondi (il Kinect genera una mappa di 640x480 punti per ogni immagini ed i dati acquisiti da PyOpenNi sono espressi direttamente in millimetri)



Successivamente si lancia lo script di lettura.py come

python lettura.py > dati.asc

il file .asc viene poi utilizzato dal programma Meshlab (presenti anche repository di Ubuntu) per visualizzare la nuvola dei punti. (Nell'esempio sono stati i punti a distanza maggiore di 1 metro per selezionare solo i punti del volto) 


acquisisci.py
-----------------------------------------------
import time
import pickle
import numpy as np
import Image
import scipy


ctx = Context()
ctx.init()

# Create a depth generator
depth = DepthGenerator()
depth.create(ctx)

# Set it to VGA maps at 30 FPS
depth.set_resolution_preset(RES_VGA)
depth.fps = 30

# Start generating
ctx.start_generating_all()

contatore =1
while True:
    # Update to next frame
    nRetVal = ctx.wait_one_update_all(depth)

    depthMap = depth.map
    depthMap2 = np.array(depthMap)
    f = open("faccia"+str(contatore)+".txt","w+b")
    pickle.dump(depthMap2,f)
    f.close()

    print contatore

    contatore = contatore + 1
    time.sleep(5)
-----------------------------------------------
lettura.py
-----------------------------------------------
import pickle
import numpy

posizione = 0

f = open("faccia5.txt")
data = pickle.load(f)
f.close

for i in range(img.size[0]):
for j in range(img.size[1]):
print str(i)+","+str(j)+","+str(data[posizione]) 
posizione = posizione + 1