Conceptul de Realitate Augmented (AR) a primit o poveste de interes în ultimii ani, deoarece iPhone și alte dispozitive mobile au pus procesoare, senzori și aparate de fotografiat tot mai puternice în mâinile a milioane de oameni din întreaga lume. Pentru prima dată de la înființarea acestui termen în anii '90, consumatorul mediu poate acum să se uite prin ecranul smartphone-ului lor și să găsească un nivel de realitate pe care niciodată nu știa că a existat. Această serie premium Mobiletuts + se va aventura în lumea realității augmentate și a realității mixte. Acesta va demonstra pas cu pas modul de îmbinare a camerei și a senzorilor iPhone cu grafica computerizată pentru a crea o versiune îmbunătățită, modificată sau chiar distorsionată a lumii din jurul dvs..
Accentul acestei serii de tutorial este acela de a înțelege componentele disponibile pe iPhone care permit experiențe de realitate augmentată și realitate mixtă. Acest lucru se va realiza prin crearea unui simplu demo AR, iar acest tutorial ne va porni pe acea cale prin abordarea celei mai fundamentale sarcini în multe aplicații AR: obținerea accesului programatic la fluxul video al dispozitivului.
Începeți prin lansarea Xcode și crearea unui nou proiect. Selectați "Aplicație bazată pe vizualizare" ca tip de șablon și dați clic pe "Următorul":
În ecranul următor, introduceți "MobiletutsAR" ca numele produsului.
Pentru Identificatorul companiei , am folosit "com.mobiletuts.ardemo", dar va trebui să furnizați identificatorul unic care să se potrivească cu propriul dvs. dezvoltator sau cu profilul de furnizare distribuție ad hoc.
Procesul de instalare a unui dispozitiv pentru testarea aplicațiilor este dincolo de scopul acestui tutorial, dar documentația privind acest proces este disponibilă din următoarele surse:
După cum sa menționat mai sus, va trebui să fii membru al programului dezvoltator plătit iOS pentru a testa aplicațiile pe dispozitive fizice iOS.
Selectați "iPhone" pentru Familia de dispozitive scapă jos. În timp ce acest tutorial se va concentra pe construirea unei aplicații AR simple pentru iPhone, principiile demonstrate vor fi aplicate oricărui alt dispozitiv iOS cu hardware-ul necesar.
Debifați caseta "Include unități de testare", apoi faceți clic pe "Următorul". Testarea unităților este inutilă pentru acest proiect demo AR, dar poate fi un mare ajutor în ciclul de viață al dezvoltării software-ului real (documentația oficială Apple privind testarea unităților).
Pasul final în acest proces este de a selecta locul în care doriți să stocați proiectul pe hard disk și faceți clic pe "Creați".
Pentru a începe să lucrați cu datele camerei și pentru a finaliza acest tutorial, vom avea nevoie de cadrul AVFoundation. Cadrul AVFoundation oferă funcționalitatea necesară pentru capturarea imaginilor de pe camera aparatului, care este punctul central al acestui tutorial. De asemenea, oferă metode de creare, gestionare și redare a altor resurse media.
Pentru informații mai detaliate, consultați documentația oficială AVFoundation Reference and Programming Guide de la Apple.
Procesul de import al unui cadru într-un proiect Xcode 4 este simplu și probabil bine înțeles, dar pentru cei care sunt noi în Xcode 4, va fi demonstrat totuși.
Selectați proiectul "ARDemo" din Xcode 4 Project Navigator. Apoi faceți clic pe țintă "ARDemo" și apoi faceți clic pe fila "Construiți faze" înainte de a extinde meniul derulant "Link Binary With Libraries".
Faceți clic pe simbolul "+" și selectați valoarea "AVFoundation.framework" din listă. Faceți clic pe "Adăugați".
După ce a fost adăugat cadrul și este afișat în Xcode Project Navigator, trageți-l în directorul "Cadre" pentru a menține proiectul ordonat.
Repetați acest proces pentru a adăuga atât "CoreMedia.framework", cât și "CoreVideo.framework".
Acum, că avem cadrele de mai sus în proiectul nostru, trebuie să le punem la dispoziție codului nostru. Deschis ARDemoViewController.h
și adăugați următoarea linie:
#import
Pentru această lecție, va trebui să declarăm doi membri de date și o metodă în ARDemoViewController.h
fişier:
@ interfață ARDemoViewController: UIViewController AVCaptureSession * cameraCaptureSession; AVCaptureVideoPreviewLayer * cameraPreviewLayer; - (void) initializeCaptureSession; @Sfârșit
Pe linia 3, o instanță de AVCaptureSession
este declarată. AVCaptureSession
clasa este componenta de bază utilizată pentru a gestiona intrarea video recepționată de la camera aparatului. În plus față de gestionarea intrării camerei, clasa oferă, de asemenea, metode delegate care fac fiecare cadru disponibil aplicației dvs. pentru procesarea personalizată. Din acest motiv, îmi place să mă gândesc la aceasta ca pe o "conductă".
Pe linia 4, o instanță de AVCaptureVideoPreviewLayer
este declarată. Aceasta este o subclasă specială de CALayer
concepute pentru a lucra cu un AVCaptureSession
afișând ieșirea video transmisă de la cameră.
Pe linia 7 -(Void) initializeCaptureSession
este declarată metoda. Această metodă va inițializa cameraCaptureSession
, legătură cameraPreviewLayer
cu cameraCaptureSession
, si adauga cameraCaptureSession
la vedere.
Restul tutorialului se va concentra pe -initializeCaptureSession
metoda declard în pasul 3. Această metodă trebuie apelată de la -viewDidLoad
deoarece dorim ca camera aparatului să înceapă imediat să ruleze în flux atunci când se încarcă aplicația. Să mergem mai departe și să stabilim acest lucru:
- (vid) viewDidLoad [super viewDidLoad]; [self initializeCaptureSession]; - (void) initializeCaptureSession
Dacă ați lucrat mult cu camera UIKit
, probabil sunteți deja familiarizați cu UIImagePickerController
clasă +availableMediaTypesForSourceType:
care returnează un NSArray
din tipurile de surse disponibile. Puteți apoi să repetați peste matricea returnată în căutarea tipului de sursă dorit pentru a determina dacă dispozitivul poate sau nu poate înregistra video.
platformei AV Foundation
cadru oferă funcționalități similare pentru a găsi surse de intrare disponibile (numite "dispozitive de captare").
// Încercarea de a inițializa AVCaptureDevice cu camera din spate NSArray * videoDevices = [Devices AVCaptureDeviceWithMediaType: AVMediaTypeVideo]; AVCaptureDevice * captureDevice = nil; pentru (dispozitiv AVCaptureDevice * în videoDevices) if (device.position == AVCaptureDevicePositionBack) captureDevice = dispozitiv; pauză; // Dacă camera este accesibilă prin sesiunea de captare dacă (capturaDevice) // AVCaptureDevice dorită este disponibilă altceva // AVCaptureDevice dorit nu este disponibil. Alertați utilizatorul și cauțiunea. UIAlertView * alert = [[UIAlertView alloc] initWithTitle: @ "Camera nu este disponibilă" mesaj: @ "" delegat: nil cancelButtonTitle: @ "Bine" altButtonTitles: nil]; [alertă spectacol]; [release release];
Pe linia 2 este creată o serie de dispozitive de captare disponibile pentru captarea video streaming. Pe liniile 4 - 11, acea matrice este repetată în încercarea de a găsi un dispozitiv cu valoarea poziției AVCaptureDevicePositionBack
(dacă preferați să completați acest tutorial cu camera frontală, puteți căuta în loc AVCaptureDevicePositionFront
).
Restul codului de mai sus stabilește doar o condiție pentru teste captureDevice
pentru a ne permite să răspundem în mod dinamic dacă, din orice motiv, dispozitivul dorit nu este disponibil.
După ce vă asigurați că dispozitivul de intrare dorit este de fapt disponibil, să mergem mai departe și să configurați sesiunea de captura video:
// Dacă camera este accesibilă prin sesiunea de capturare dacă (captureDevice) // Alocarea sesiunii de captare a camerei cameraCaptureSession = [[AVCaptureSession alloc] init]; cameraCaptureSession.sessionPreset = AVCaptureSessionPresetMedium; // Configurarea intrării sesiunii de captare AVCaptureDeviceInput * videoIn = [AVCaptureDeviceInput deviceInputWithDevice: captureDevice error: zero]; [cameraCaptureSession addInput: videoIn]; // Configurați ieșirea sesiunii de captare AVCaptureVideoDataOutput * videoOut = [[AVCaptureVideoDataOutput alloc] init]; [videoOut setAlwaysDiscardsLateVideoFrames: YES]; [cameraCaptureSession addOutput: videoOut]; [release video];
Pe linia 6, cameraCaptureSession
este alocată (aceasta va fi lansată mai târziu).
Pe linia 7, specificăm că calitatea ieșirii video generate de această sesiune de captare ar trebui să fie AVCaptureSessionPresetMedium
. Documentele oficiale ale Apple conțin următoarele opțiuni disponibile pentru această setare:
- AVCaptureSessionPresetPhoto
- Specifică setările de captură potrivite pentru ieșirea de calitate foto de înaltă rezoluție.
- AVCaptureSessionPresetHigh
- Specifică setările de captură potrivite pentru ieșirea video și audio de înaltă calitate.
- AVCaptureSessionPresetMedium
- Specifică setările de captare potrivite pentru redarea semnalelor video și audio potrivite pentru partajarea prin WiFi.
- AVCaptureSessionPresetLow
- Specifică setările de captare potrivite pentru biruri de ieșire video și audio adecvate pentru partajarea pe 3G.
- AVCaptureSessionPreset640x480
- Specifică setările de captură potrivite pentru ieșirea video de calitate VGA (640x480 pixeli).
- AVCaptureSessionPreset1280x720
- Specifică setările de captură adecvate pentru ieșirea video de 720p (1280x720 pixeli).
Setarea unei valori de ieșire mai mari înseamnă că aveți mai multe date disponibile pentru procesare și analiză, pe lângă o imagine de ieșire finală cu o calitate vizuală superioară. Cu toate acestea, aceste beneficii au un preț: viteze de prelucrare mai mici. Când lucrați cu un videoclip sau încercați să recunoașteți dinamic obiecte, veți afla că ajustarea acestei setări poate ajuta dramatic.
De asemenea, rețineți că, în timp ce sunt disponibile presetări de captură specifice (de ex. 1280x720, 640x480), este recomandabil să folosiți una dintre valorile mai generale "Înaltă", "Medie" sau "Înaltă". Acest lucru face ca aplicația dvs. să fie mai portabilă și mai robustă, deoarece poate funcționa pe dispozitive (actuale sau viitoare!) Care nu suportă o anumită valoare codificată.
Linile 8 - 10 creează un AVCaptureDeviceInput
obiect, folosind dispozitivul de captare pe care l-am creat mai devreme, apoi adăugăm obiectul în sesiunea noastră de captare.
Linii 14 - 17 configurare an AVCaptureDeviceOutput
obiect și adăugați-o la sesiunea de capturare. Pe linia 15, configuram videoOut
să eliminați întotdeauna cadrele primite cu întârziere. Trebuie să rețineți că sesiunea de capturare va gestiona mai multe cadre în fiecare secundă și, datorită variațiilor în sarcina procesorului, este posibil ca unele dintre aceste cadre să poată ajunge mai târziu decât altele. Pentru că construim o aplicație care încearcă să genereze o fereastră live în lumea din spatele iPhone-ului, nu ne pasă de cadre târzii, deci le debarasăm. Vrem doar să procesăm și să afișăm imagini cât mai apropiate de actualul milisecundă posibil.
După ce ați configurat intrarea și ieșirea sesiunii de captare, este timpul să legați stratul de previzualizare declarat în interfață la fluxul video de sesiune de captare. Acest lucru va oferi utilizatorilor o fereastră digitală a realității din jurul lor.
// Preluați stratul de previzualizare pentru a capta date de sesiune cameraPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession: cameraCaptureSession]; CGRect layerRect = auto.view.bounds; cameraPreviewLayer.bounds = auto.view.bounds; cameraPreviewLayer.position = CGPointMake (CGRectGetMidX (layerRect), CGRectGetMidY (layerRect)); cameraPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; // Adăugați stratul de previzualizare în layerul UIView [self.view.layer addSublayer: cameraPreviewLayer];
Primele cinci linii din fragmentul de cod de mai sus alocă stratul de previzualizare și redimensionează limitele stratului pentru a umple ecranul dispozitivului.
Următoarea linie stabilește videGravity
proprietate. Această setare controlează modul în care cadrele video trebuie redate în stratul de previzualizare. Documentația oficială Apple descrie următoarele posibilități:
- AVLayerVideoGravityResize
- Specifică faptul că videoclipul trebuie întins pentru a umple limitele stratului.
- AVLayerVideoGravityResizeAspect
- Specifică faptul că jucătorul trebuie să păstreze raportul de aspect al videoclipului și să se potrivească cu videoclipul în limitele stratului.
- AVLayerVideoGravityResizeAspectFill
- Specifică faptul că jucătorul trebuie să păstreze raportul de aspect al videoclipului și să umple limitele stratului.
După cum puteți spune din codul de mai sus, cred că asta AVLayerVideoGravityResizeAspectFill
se potrivește cel mai bine cazului nostru de utilizare.
Linia finală de mai sus este responsabilă de adăugarea efectivă a previzualizării CALayer
la nivelul controlerului de vizualizare, făcându-l vizibil pentru utilizator.
În cei șase pași de mai sus, am creat proiectul și am creat un proiect AVCaptureSession
legat de camera din spate pentru intrare și un strat de previzualizare personalizat pentru ieșire. Tot ce rămâne în această etapă este de a începe efectiv streaming video începând sesiunea de capturare:
// Începeți capturarea camerei [cameraCaptureSession startRunning];
Odată cu finalizarea inițializării sesiunii de captare, acum pare a fi un moment bun pentru eliberarea memoriei pe care am alocat-o. Faceți acest lucru cu următorul cod:
- (vid) viewDidUnload [super viewDidUnload]; [cameraCaptureSession stopRunning]; [cameraCaptureSession release], cameraCaptureSession = zero; [eliberarea camereiPreviewLayer], cameraPreviewLayer = zero; - (void) dealloc [cameraCaptureSession stopRunning]; [release cameraCaptureSession]; [eliberarea camereiPreviewLayer]; [super dealloc];
Dacă salvați, construiți și executați proiectul după ce ați adăugat liniile de mai sus de cod, ar trebui să puteți să aruncați o privire asupra lumii din jurul dvs. direct prin ecranul iPhone.
Acest tutorial te-a urmărit prin procesul de utilizare a cadrului AVFoundation pentru a iniția captura video și pentru a afișa fiecare cadru în timp real în timp real pe un ecran iPhone. Datorită ubicuității camerelor video din jurul nostru (precum și a aplicației iPhone Camera), acest lucru nu pare să fie o realizare importantă, dar este într-adevăr! Acesta este primul pas în multe aplicații ale realității augmentate: digitizarea vederii utilizatorului asupra lumii percepute. De aici, am putea continua în orice număr de direcții, de la depășirea pur și simplu a vederilor personalizate în cadrul real al lumii, pentru a manipula efectiv datele pixelilor din lume pentru a îmbunătăți sau a modifica viziunea noastră asupra realității.
Următorul tutorial Mobiletuts + din această serie va continua prin luarea ferestrei noastre digitale a lumii și făcându-l un pic mai interesant. Rămâi bine, și mulțumesc pentru lectură!