www.mokapp.com
Daniele Galiotto
Freelance Senior iOS Developer
www.g8production.com
genius@g8production.com
iOS7 - filtri fotografici,
sorrisi e cheese!
Core Image
Core Image
• Core Image è una tecnologia per
processare ed analizzare immagini,
quasi a real-time
• Opera in framework quali Core
Graphics, Core Video e Image I/O
usando GPU o CPU
Core Image
• CI permette di lavorare a basso
livello, tramite API
• Senza conoscere OpenGL o
OpenGL ES (GPU)
• Senza conoscere il GCD per
beneficiare dei processori multicore
(CPU)
Core Image
Core Image
• Permette di accedere ai filtri per
processare le immagini
• Di scovare le caratteristiche di una
immagine (es. volto)
• Concatenare filtri per creare effetti
custom
Filtri
Filtri
• Esistono oltre 90 filtri installati in
iOS (120 in OS X)
• Esistono decine di categorie di filtri
• I nomi dei filtri iniziano col prefisso
CI (Core Image)
Filtri
Mono, Tonal, Noir, Fade,
Chrome, Process, Transfer, Instant
CIFilter
• La classe base è CIFilter
• CIImage è l’immagine non mutable
• CIContext è il contesto dove
disegna l’immagine
How to?
• CIImage dall’immagine originale
• CIFilter e setta i valori di input
• Crea un CIContext
• Applica il filtro ed effettua il
rendering dell’output (CIImage) in
una CGImage tramite il context
[DEMO]
Detector
CIDetector
• Processa le immagini alla ricerca di
elementi
• CIDetectorTypeFace permettere di
scovare volti in una foto
• Usa un CIContext
CIFaceFeature
• Permette di determinare volto,
occhi e bocca che vengono scovati
da un CIDetector
• Funzionare sia su immagini che
video
• Nei video permette il tracking di un
volto
CIFaceFeature
• Determina un bounds: un
rettangolo che indica la posizione e
la dimensione di un volto, nelle
coordinate della immagine
CIDetector &
CIFaceFeature
• Poiché può richiedere qualche
secondo di esecuzione, è
consigliabile eseguire il codice in
una queue in background e
restituire un risultato nel thread
principale
How to?
• CIImage dall’immagine originale
• CIDetector di tipo CIFaceFeature
• NSDictionary di “cosa ricercare”
(es. sorriso)
How to?
• Avvio la ricerca delle caratteristiche
nella immagine CIImage con le
opzioni prima definite
NSArray *features = [detector
featuresInImage:image
options:imageOptions];
How to?
• Ciclo tra le features gli
CIFaceFeature scovati e le loro
caratteristiche:
es:
hasFaceAngle
hasMouthPosition
leftEyeClosed
[DEMO]
Video
AVCaptureSession
• AVFoundation.framework
• Gestire il flusso dati da un device
AV input e output
• Input: AVCaptureDeviceInput
• Output: AVCaptureMovieFileOutput
• Audio e/o video
AVCaptureSession
• [session setSessionPreset:…]]
Il metodo setSessionPreset permette di
customizzare qualità, bitrate, e altri
settings per l’output.
Presets di defaults sono già disponibili
nella classe AVCaptureSession.
AVCaptureSession
• Input: AVCaptureDeviceInput
imposto il device di input (es.
camera frontale)
• Output: AVCaptureMovieFileOutput
imposto la classe dove processare i
frame video
• Output: AVCaptureStillImageOutput
la classe per catturare l’immagine a
video
AVCaptureSession
• Input e output vanno poi aggiunti
alla sessione che li userà
if([session
canAddOutput:stillImageOutput])
[session addOutput:stillImageOutput];
AVCaptureSession
AVCaptureSession *captureSession = [[AVCaptureSession alloc] init];
AVCaptureDevice *audioCaptureDevice = [AVCaptureDevice
defaultDeviceWithMediaType:AVMediaTypeAudio];
NSError *error = nil;
AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput
deviceInputWithDevice:audioCaptureDevice error:&error];
if (audioInput) {
[captureSession addInput:audioInput];
}
Audio Capture Session
AVCaptureVideoPreviewLayer
• AVCaptureVideoPreviewLayer è il
layer che permette di mostrare a
video cosa sta catturando il device
di input
CIDetector
• CIDetector permette di scovare i
volti nel video
AVCaptureSession
• [session startRunning]
• [session stopRunning]
I metodi startRunning e stopRunning sono
bloccanti perciò, per “liberare” il thread
principale, andrebbero eseguiti in modo
asincrono in una coda seriale (FIFO)
DISPATCH_QUEUE_SERIAL.
AVCaptureSession
dispatch_async([self sessionQueue],
^{…
[session startRunning];
…});
AVCaptureSession
• [session beginConfiguration]
• [session commitConfiguration]
Permettono di aggiornare al volo la
sessione (es. per saltare dalla fotocamera
anteriore alla posteriore e viceversa)
AVCaptureVideoDataOutpu
tSampleBufferDelegate
• AVCaptureVideoDataOutputSampl
eBufferDelegate
Tramite il protocollo
AVCaptureVideoDataOutputSampleBuffer
Delegate, otteniamo i buffer video
catturati.
AVCaptureVideoDataOutpu
tSampleBufferDelegate
• Con CVPixelBufferRef recupero
immagine del frame, tramite
l'oggetto Core Video pixel buffer, un
CIImage object
CIDetector
• Come in precedenza, avvio la
ricerca di caratteristiche in una foto
(es. volti) e li elaboro ciclando su di
essi
Activity Sharing
UIActivityViewController
• Permette di condividere contenuti
tramite iOS con FB, Twitter,
Messaggi, E-mail, Airdrop, Cloud
ecc…
[DEMO]
[GRAZIAS]
Freelance
Senior iOS
Developer
www.g8production.
com
genius@g8production.
com
News
next mokapp
iOS8 HomeKit HealthKit Domotics
www.mokapp.com
Cosa c’è dopo il
coffe break?
Aula Nerd - 11:20
Emanuele Palazzetti
Send your Android game to the next le
Creare una universal app
Aula Geek - 11:20
Daniele Galiotto

Mokapp2014 - Daniele Galiotto - Camera e sorrisi

Editor's Notes

  • #38  Come in precedenza, avvio la ricerca di caratteristiche in una foto (es. volti) e li elaboro ciclando su di essi.
  • #40  Come in precedenza, avvio la ricerca di caratteristiche in una foto (es. volti) e li elaboro ciclando su di essi.