In questo articolo prenderemo in esame la funzionalità di Pulse Estimation.
L’articolo si riferisce alla versione 6.0.x dell’SDK di Intel® RealSense™ attualmente scaricabile all’indirizzo https://software.intel.com/en-us/intel-realsense-sdk/download
Cosa è Pulse Estimation
La funzionalità di Pulse Estimation permette di utilizzare la camera F200 per recuperare una stima dei battiti al minuto del cuore dell’utente il cui viso è stato “rilevato” dall’Intel RealSense SDK.
Si tratta di una funzionalità di Face Tracking che sfrutta diverse tecniche di misurazione del battito cardiaco. Non è scopo dell’articolo spiegare dettagliatamente il funzionamento di queste tecniche ma vi rimando all’articolo https://software.intel.com/it-it/articles/pulse-detection-with-intel-realsense-technology che le descrive in maniera esaustiva e dettagliata.
Abilitare il modulo di Face
Come già detto in precedenza, il Pulse Estimation è una funzionalità di Face Tracking ed è necessario, quindi, attivare il modulo di Face Tracking attraverso l’istanza di PXCMSenseManager ed in particolare utilizzando il metodo EnableFace:
SenseManager = PXCMSenseManager.CreateInstance(); SenseManager.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_COLOR, 1280, 720); SenseManager.EnableFace();
Una volta abilitato l’utilizzo del modulo di face tracking, è necessario recuperare l’istanza del modulo stesso e lo possiamo fare utilizzando il metodo QueryFace della PXCMSenseManager:
FaceModule = SenseManager.QueryFace();
Il valore di ritorno del metodo è un’istanza della classe PXCMFaceModule.
Il modulo PXCMFaceModule
La classe PXCMFaceModule incapsula tutte le funzionalità che riguardano il face tracking degli utenti.
La sua struttura è la seguente:
Image may be NSFW.
Clik here to view.
La classe espone due metodi il cui utilizzo è il seguente:
- CreateActiveConfiguration: restituisce un oggetto di tipo che ci consente di configurare il modulo per decidere quali funzionalità vogliamo utilizzare (ad esempio il tracking o i landmarks o il pulse estimation);
- CreateOutput: permette di ottenere un oggetto di tipo che è l’handler attraverso il quale recuperare effettivamente i dati del viso che ci interessano.
Configurare il modulo di face tracking
La configurazione del modulo di face tracking (una volta abilitato tramite la PXCMSenseManager) avviene attraverso l’istanza della classe PXCMFaceConfiguration recuperata grazie al metodo CreateActiveConfiguration della classe PXCMFaceModule.
Image may be NSFW.
Clik here to view.
Il metodo che ci serve per poter attivare la funzionalità di Pulse Estimation è il metodo QueryPulse il cui risultato è un oggetto di classe PXCMFaceConfiguration.PulseConfiguration:
Image may be NSFW.
Clik here to view.
I metodi messi a disposizione da questa classe sono:
- Disable: disabilita la funzionalità di pulse estimation;
- Enable: abilita la funzionalità di pulse estimation;
- IsEnabled: restituisce un valore boolean che ci informa se la funzionalità è attiva o meno.
Nel nostro caso, dunque, dovremo abilitare il face detection e il pulse estimation:
var config = FaceModule.CreateActiveConfiguration(); config.detection.isEnabled = true; config.landmarks.isEnabled = false; config.pose.isEnabled = false; config.strategy = PXCMFaceConfiguration.TrackingStrategyType.STRATEGY_CLOSEST_TO_FARTHEST; var pulseConfig = config.QueryPulse(); pulseConfig.Enable(); if (config.ApplyChanges().IsSuccessful()) { if (SenseManager.Init().IsError()) { MessageBox.Show("Errore nell'inizializzazione della camera"); Close(); } } config.Dispose();
Se la configurazione viene applicata con successo (metodo ApplyChanges) possiamo cominciare a recuperare i frame ed analizzarli alla scoperta di eventuali facce rilevate.
Gestire i frame
Come già visto in precedenti articoli, abbiamo due approcci possibili per gestire il recupero dei frame (in questo caso quelli del modulo di face tracking) e l’analisi degli stessi.
Data l’istanza di PXCMSenseManager, possiamo:
- Implementare un loop all’interno del quale eseguiamo le opportune query ed analizziamo i frame;
- Ci affidiamo agli “eventi” sollevati dalla PXCMSenseManager.
Nell’esempio di questo articolo useremo il primo dei due approcci.
Per prima cosa, dunque, è necessario creare un task al cui “interno” faremo girare il nostro loop:
private Task PollingTask; private CancellationTokenSource TaskCancellationTokenSource; private CancellationToken PollingTaskCancellationToken; private void ConfigurePollingTask() { TaskCancellationTokenSource = new CancellationTokenSource(); PollingTaskCancellationToken = TaskCancellationTokenSource.Token; PollingTask = new Task(PollingCode); PollingTask.Start(); }
Il metodo PollingCode contiene l’effettivo codice di recupero dei frame (il loop) e utilizza il CancellationTokenSource per essere informato del momento in cui deve chiudersi (ad esempio perché’ l’applicazione si sta chiudendo).
private void PollingCode() { PXCMFaceData faceData = FaceModule.CreateOutput(); while (!PollingTaskCancellationToken.IsCancellationRequested) { if (SenseManager.AcquireFrame().IsSuccessful()) { faceData.Update(); var face = faceData.QueryFaceByIndex(0); var sample = SenseManager.QuerySample(); ElaborateSample(sample, face); if (!PollingTaskCancellationToken.IsCancellationRequested) SenseManager.ReleaseFrame(); } } }
Il primo step fondamentale per poter recuperare i dati relativi al pulse estimation è quello di ottenere l’istanza di PXCMFaceData che ci occorre per effettuare la query per recuperare il battito cardiaco:
PXCMFaceData faceData = FaceModule.CreateOutput();
La classe PXCMFaceData ha la seguente struttura:
Image may be NSFW.
Clik here to view.
I metodi che ci interessano in questo caso sono:
- Update: permette di aggiornare l’handler PXCMFaceData con i dati correnti recuperati dalla camera relativamente ai volti tracciati;
- QueryFaceByIndex: permette di recuperare i dati di tracciatura (contenuti in un oggetto di classe PXCMFaceData.Face) del viso i-esimo.
In particolare per prima cosa abbiamo la necessità di dire all’SDK di eseguire l’acquisizione del frame attraverso la PXCMSenseManager:
if (SenseManager.AcquireFrame().IsSuccessful()) { // // ..... // }
In caso di acquisizione avvenuta con successo, possiamo aggiornare i dati relativi ai volti tramite il metodo Update:
faceData.Update();
e recuperare la prima faccia rilevata dall’SDK:
var face = faceData.QueryFaceByIndex(0);
Il metodo QueryFaceByIndex (nel nostro caso la prima rilevata in base alla strategia di rilevamento definita nella configurazione) restituisce un oggetto di classe PXCMFaceData.Face la cui struttura è la seguente:
Image may be NSFW.
Clik here to view.
Come possiamo vedere dalla precedente figura, la classe espone solamente dei metodi che ci consentono di recuperare le più svariate informazioni per la singola faccia.
Nel nostro caso, utilizzeremo il metodo QueryPose:
PXCMFaceData.PulseData pulseData = face.QueryPulse();
La classe PXCMFaceDetection.PulseData permette di eseguire la query per conoscere il battito cardiaco rilevato ed ha la seguente struttura:
Image may be NSFW.
Clik here to view.
Il metodo QueryHeartRate restituisce il valore dei BPM rilevati (calcolati) dall’SDK:
heartRate = pulseData.QueryHeartRate();
Il battito cardiaco non viene immediatamente rilevato. L’SDK impiega circa 10 secondi per calcolare e dedurre il battito cardiaco che, quindi, comincia ad essere disponibile solo dopo che il viso dell’utente è stato rilevato. Va inoltre ricordato che, pur relativamente preciso, si tratta di un’approssimazione che non sostituisce in alcun modo uno strumento specifico di misura del battito cardiaco.
Conclusioni
Il Pulse Estimation è una interessante funzionalità del modulo di Face Tracking che ci permette di capire che i possibili campi applicativi possono andare al di là del semplice rilevamento del viso. Il flusso infrarosso e la profondità possono essere utilizzati per scopi che sembrano non entrarci nulla con la visione tridimensionale ma che si rivelano, comunque, utili.
L’esempio riportato in questo articolo è disponibile all’indirizzo https://github.com/massimobonanni/RealSenseSamples in cui potete trovare tutte le demo presenti nei miei articoli su Real Sense.