mokapp2014 - daniele galiotto - camera e sorrisi
TRANSCRIPT
![Page 2: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/2.jpg)
Daniele Galiotto
Freelance Senior iOS Developerwww.g8production.com
![Page 3: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/3.jpg)
iOS7 - filtri fotografici, sorrisi e
cheese!
![Page 4: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/4.jpg)
Core Image
![Page 5: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/5.jpg)
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
![Page 6: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/6.jpg)
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)
![Page 7: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/7.jpg)
Core Image
![Page 8: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/8.jpg)
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
![Page 9: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/9.jpg)
Filtri
![Page 10: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/10.jpg)
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)
![Page 11: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/11.jpg)
Filtri
Mono, Tonal, Noir, Fade,
Chrome, Process, Transfer, Instant
![Page 12: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/12.jpg)
CIFilter
• La classe base è CIFilter
• CIImage è l’immagine non mutable
• CIContext è il contesto dove disegna l’immagine
![Page 13: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/13.jpg)
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
![Page 14: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/14.jpg)
[DEMO]
![Page 15: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/15.jpg)
Detector
![Page 16: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/16.jpg)
CIDetector
• Processa le immagini alla ricerca di elementi
• CIDetectorTypeFace permettere di scovare volti in una foto
• Usa un CIContext
![Page 17: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/17.jpg)
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
![Page 18: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/18.jpg)
CIFaceFeature
• Determina un bounds: un rettangolo che indica la posizione e la dimensione di un volto, nelle coordinate della immagine
![Page 19: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/19.jpg)
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
![Page 20: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/20.jpg)
How to?
• CIImage dall’immagine originale
• CIDetector di tipo CIFaceFeature
• NSDictionary di “cosa ricercare” (es. sorriso)
![Page 21: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/21.jpg)
How to?
• Avvio la ricerca delle caratteristiche nella immagine CIImage con le opzioni prima definite
NSArray *features = [detector featuresInImage:image options:imageOptions];
![Page 22: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/22.jpg)
How to?• Ciclo tra le features gli
CIFaceFeature scovati e le loro caratteristiche:
es:
hasFaceAnglehasMouthPosition
leftEyeClosed
![Page 23: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/23.jpg)
[DEMO]
![Page 24: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/24.jpg)
Video
![Page 25: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/25.jpg)
AVCaptureSession• AVFoundation.framework
• Gestire il flusso dati da un device AV input e output
• Input: AVCaptureDeviceInput
• Output: AVCaptureMovieFileOutput
• Audio e/o video
![Page 26: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/26.jpg)
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.
![Page 27: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/27.jpg)
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
![Page 28: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/28.jpg)
AVCaptureSession
• Input e output vanno poi aggiunti alla sessione che li userà
if([session canAddOutput:stillImageOutput])
[session addOutput:stillImageOutput];
![Page 29: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/29.jpg)
AVCaptureSessionAVCaptureSession *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
![Page 30: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/30.jpg)
AVCaptureVideoPreviewLayer
• AVCaptureVideoPreviewLayer è il layer che permette di mostrare a video cosa sta catturando il device di input
![Page 31: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/31.jpg)
CIDetector
• CIDetector permette di scovare i volti nel video
![Page 32: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/32.jpg)
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.
![Page 33: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/33.jpg)
AVCaptureSession
dispatch_async([self sessionQueue], ^{…
[session startRunning];…});
![Page 34: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/34.jpg)
AVCaptureSession
• [session beginConfiguration]
• [session commitConfiguration]
Permettono di aggiornare al volo la sessione (es. per saltare dalla fotocamera anteriore alla posteriore e viceversa)
![Page 35: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/35.jpg)
AVCaptureVideoDataOutputSampleBufferDel
egate• AVCaptureVideoDataOutputSa
mpleBufferDelegate
Tramite il protocollo AVCaptureVideoDataOutputSampleBufferDelegate, otteniamo i buffer video catturati.
![Page 36: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/36.jpg)
AVCaptureVideoDataOutputSampleBufferDel
egate
• Con CVPixelBufferRef recupero immagine del frame, tramite l'oggetto Core Video pixel buffer, un CIImage object
![Page 37: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/37.jpg)
CIDetector
• Come in precedenza, avvio la ricerca di caratteristiche in una foto (es. volti) e li elaboro ciclando su di essi
![Page 38: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/38.jpg)
Activity Sharing
![Page 39: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/39.jpg)
UIActivityViewController
• Permette di condividere contenuti tramite iOS con FB, Twitter, Messaggi, E-mail, Airdrop, Cloud ecc…
![Page 40: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/40.jpg)
[DEMO]
![Page 41: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/41.jpg)
[GRAZIAS]
Freelance
Senior iOS
Developerwww.g8production.com
![Page 42: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/42.jpg)
Newsnext
mokapp
iOS8 HomeKit HealthKit Domotics
![Page 44: Mokapp2014 - Daniele Galiotto - Camera e sorrisi](https://reader035.vdocuments.site/reader035/viewer/2022062419/5585d641d8b42ab1518b465a/html5/thumbnails/44.jpg)
Cosa c’è dopo il coffe break?
Aula Nerd - 11:20
Emanuele Palazzetti
Send your Android game to the next level!
Creare una universal app
Aula Geek - 11:20
Daniele Galiotto