Non si tratta di una funzione molto bene documentata (anche perche' non presente nella cartella degli esempi) ma con PyOpenNi e' possibile acquisire immagini RBG da Kinect
il codice di riferimento (sostanzialmente autoesplicativo) e' il seguente
---------------------------------------------- from openni import * from PIL import Image ctx = Context() ctx.init() depth = DepthGenerator() rgb = ImageGenerator() depth.create(ctx) rgb.create(ctx) depth.set_resolution_preset(RES_VGA) depth.fps = 30 rgb.set_resolution_preset(RES_VGA) rgb.fps = 30 ctx.start_generating_all() ctx.wait_one_update_all(rgb) im = Image.fromstring('RGB',(640,480),rgb.get_raw_image_map()) im.save("rgb.jpg") ctx.wait_one_update_all(depth) de = Image.fromstring('L',(640,480),depth.get_raw_depth_map_8()) de.save("depth.jpg")
Sovrapponendo le immagini RGB e di profondita' di Kinect si vede chiaramente, indipendentemente se l'oggetto e' in primo piano o sullo sfondo
Leggendo questo link, si osserva che i parametri di calibrazioni delle camere sono codificate (e diversi) all'interno di ogni Kinect in funzione di come sono state montate e calibrate in fabbrica
Usando la versione completa di OpenNi (o l'SDK Microsoft) sono presenti specifiche funzioni che effettuano la fusione delle immagini dai due sensori come depth.GetAlternativeViewPointCap().SetViewPoint(image);
Di solito quando installo software di controllo remoto su Windows uso LogMeIn ma in questo caso dovevo utilizzare un client Linux e la procedura di uso di Hamachi per LogMeIn non e' proprio lineare, cosi' ho provato ad utilizzare TeamViewer
A questo punto da linea di comando si lancia il comando
./teamview
viene richiesto un account (che corrisponde ad una e-mail ed una password)
in seguito si imposta la password specifica per il computer client. Sono previsti codici che consentire il controllo remote anche ad altri utenti
La cosa carina e' che al successivo riavvio Teamview viene caricato automaticamente senza modificare nessun script di boot
Per controllare la macchina Linux ho scelto di usare un Mac. La procedura di installazione e' semplicissima e l'interfaccia grafica e' identica a quella per Linux
Una volta loggati vengono mostrate le macchine client accese e facendo doppio clic ci si collega
A differenza di LogMeIn non si utilizza il browser (almeno non in modo esplicito) e non e' richiesta l'installazione di nessun plugin dato che il lavoro viene fatto tutto dall'applicazione scaricata all'inizio
E' anche disponibile un client Android anche se la sua usabilita' non e' molto buona
Per completare i testi con il Kinect ho provato a creare uno scanner 3D.
L'oggetto e' stata la caffettiera sotto riportata il cui centro di rotazione e' stato posto a 65 cm dal Kinect ed e' stato ripreso da 4 fotogrammi ruotando ogni volta l'oggetto di 90°
Ovviamente e' stata una prova casalinga e ci sono forti errori di allineamento tra il sensore Kinect e l'asse di rotazione.
L'oggetto reale
La sua scansione (da notare che era posto sopra una scatola)
Per l'acquisizione e' stato usato il seguente script
------------------------------------------------- from openni import * 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() # Update to next frame nRetVal = ctx.wait_one_update_all(depth) depthMap = depth.map depthMap2 = np.array(depthMap) f = open("ca_2700.txt","w+b") pickle.dump(depthMap2,f) f.close()
-------------------------------------------------
i vari file salvati con pickle sono stati poi trattati con i seguenti programmi (uno ogni 90°, di fatto l'immagine viene centrata e vengono filtrati solo i dati > 0 ed inferiori a 70 cm)
-------------------------------- #!/usr/bin/python import pickle import numpy as np import Image f = open("ca_000.txt") data = pickle.load(f) f.close() t = 0 for y in range(0,480): for x in range (0,640): if ((data[t] < 700) and (data[t]>0)): print str(x-320)+","+str(y-240)+","+str(660-data[t]) t = t + 1
-------------------------------- #!/usr/bin/python import pickle import numpy as np import Image f = open("ca_180.txt") data = pickle.load(f) f.close() t = 0 for y in range(0,480): for x in range (0,640): if ((data[t] < 700) and (data[t]>0)): print str(x-320)+","+str(y-240)+","+str(-(660-data[t])) t = t + 1
-------------------------------- #!/usr/bin/python import pickle import numpy as np import Image f = open("ca_090.txt") data = pickle.load(f) f.close() t = 0 for y in range(0,480): for x in range (0,640): if ((data[t] < 700) and (data[t]>0)): print str(660-data[t]) + "," + str(y-240) + "," + str(x-320) #non funziona t = t + 1
-------------------------------- #!/usr/bin/python import pickle import numpy as np import Image f = open("ca_090.txt") data = pickle.load(f) f.close() t = 0 for y in range(0,480): for x in range (0,640): if ((data[t] < 700) and (data[t]>0)): print str(-(660-data[t])) + "," + str(y-240) + "," + str(x-320) t = t + 1
--------------------------------
L'output e' stato dirottato su file testo che poi sono importati in Meshlab.
A distanza di quasi un anno, viste le condizioni favorevoli, ho provato di nuovo a fotografare ISS mentre passa sopra Caldine
Nel tentativo precedente i risultati erano stati scarsini piu' che altro per l'uso di una fotocamera compatta mentre questa volta ho impiegato una reflex digitale (con un cavalletto che lascia un po' a desiderare in rapporto al peso della fotocamera)
La magnitudo prevista di -3.3 era perfetta per l'osservazione, di contro l'ora del passaggio era subito dopo il tramonto (si vede chiaramente che ancora non e' arrivata la notte sull'orizzonte)
Avevo sentito parlare del fatto che in alcuni centri commerciale veniva effettuatao il tracking dei clienti leggendo in modo passivo il MAC Address dei telefoni anche quando questi non sono associati ad un access point. Francamente non pensavo che si potesse fare o meglio che non si potesse fare in modo semplice
In realta' usando Airmon ed una antenna WiFi adeguata la cosa e' piuttosto semplice
Kali Linux
Per la prova ho lanciato in macchina virtuale Kali Linux collegando una scheda WiFi USB Alpha (basata su RTL8187)
in seguito e' sufficiente inserire i due seguenti comandi airmon-ng start wlan0 airodump-ng mon0
per visulalizzare i Mac Address di tutti i dispositivi presenti nel raggio d'azione dell'antenna (nella parte superiore gli access point, in quella inferiore i client). Due dei dispositivi tracciati sono i miei due telefoni di prova
Semplice e banale e c'e' anche la possibilita' di effettuare un log su file di testo
L'unica cosa che mi rimane un po' dubbia e' il perche' il dispositivo mobile venga agganciato praticamente in tempo reale (nel momento in cui viene accesa l'antenna) mentre compare per lungo tempo in lista anche quando l'antenna viene spenta
Questo tipo di sistema puo' essere utilizzato come sistema di prossimita' basato sul WiFi