Przewodnik dla programistów dotyczący aplikacji Augmented Faces na iOS

Dowiedz się, jak używać funkcji rozszerzonych twarzy w swoich aplikacjach.

Wymagania wstępne

  • Xcode w wersji 13.0 lub nowszej.
  • Cocoapods w wersji 1.4.0 lub nowszej, jeśli używasz Cocoapods.
  • zgodne z ARKit urządzenie Apple z systemem iOS 12.0 lub nowszym (wymagane jest wdrożenie w systemie iOS 12.0 lub nowszym).

Tworzenie i uruchamianie przykładowej aplikacji

Szczegółowe instrukcje znajdziesz w krótkim wprowadzeniu.

  1. Aby uzyskać przykładowy kod aplikacji, skopiuj lub pobierz pakiet SDK ARCore SDK na iOS z GitHuba.
  2. Otwórz okno terminala i uruchom pod install z folderu, w którym istnieje projekt Xcode.
  3. Otwórz przykładową aplikację w Xcode w wersji 10.3 lub nowszej i podłącz urządzenie do komputera programisty przez USB. Aby uniknąć błędów kompilacji, upewnij się, że tworzysz kompilację z pliku .xcworkspace, a nie z pliku .xcodeproj.
  4. Naciśnij Cmd+R lub kliknij Run. Do pracy z rozszerzonymi twarzami używaj urządzenia fizycznego, a nie symulatora.
  5. Kliknij „OK”, aby przyznać dostęp aparatu do przykładowej aplikacji. Aplikacja powinna uruchomić przedni aparat i od razu śledzić Twoją twarz na obrazie z kamery. Zdjęcia lisa powinny znajdować się na obu stronach czoła, a nad własnym nosem nakładać nos lisa.

Omówienie wdrażania funkcji rozszerzonych w aplikacji

Importuj pliki *.scn do Xcode

Aby dodać własne zasoby, takie jak tekstury i modele 3D, do wykrytej twarzy w aplikacji, przeciągnij zasób *.scn do Xcode.

Inicjowanie sesji rozszerzonych twarzy

Aby użyć w aplikacji interfejsu Augmented Faces API, zainicjuj sesję rozszerzonych twarzy. Ta sesja odpowiada za robienie zdjęć z użyciem aparatu z szybkością 60 klatek na sekundę i asynchronicznie zwraca aktualizacje twarzy do metody przedstawiciela. Podczas inicjowania po prostu przekaż pole widzenia urządzenia, na którym będzie się znajdować, oraz ustaw osobę, której przekazujesz dostęp.

// Session takes a float for field of view
let faceSession = try? GARAugmentedFaceSession(fieldOfView: cameraFieldOfView)
faceSession?.delegate = self

Przekaż zdjęcia z aparatu do sesji

Gdy sesja zostanie zainicjowana i prawidłowo skonfigurowana, aplikacja może zacząć wysyłać do niej obrazy z kamery. Aplikacja przykładowa pobiera obrazy z aparatu, tworząc AVCaptureSession z klatkami wideo z przedniego aparatu.

Poniższy przykładowy kod ilustruje implementację metody delegowania danych wyjściowych rejestrowanych przez AVFoundation, która przekazuje obraz, sygnaturę czasową i rotację rozpoznawania do sesji twarzy.

func captureOutput(_ output: AVCaptureOutput,
                     didOutput sampleBuffer: CMSampleBuffer,
                     from connection: AVCaptureConnection) {

     faceSession.update(with: imageBuffer,
                        timestamp: frameTime,
                        recognitionRotation: rotationDegrees)
}

Po przetworzeniu obrazu interfejs Augmented Faces API wysyła wywołanie zwrotne delegata, które zwraca wartość GARAugmentedFaceFrame. Zawiera obiekt rozszerzonej twarzy, który umożliwia dodawanie efektów do twarzy. Zawiera on też bufor obrazów oraz sygnaturę czasową przesłaną do metody aktualizacji. Jest to przydatne do synchronizowania efektów twarzy ze zdjęciami. Obiekt ten zapewnia również przekształcenie wyświetlacza oraz macierz projekcji, dzięki czemu możesz skonfigurować świat 3D i widoki 2D w taki sposób, aby łatwo renderować efekty twarzy, które wyglądają na przymocowane do wykrytej twarzy.

var face: GARAugmentedFace? { get }
var capturedImage: CVPixelBuffer { get }
var timestamp: TimeInterval { get }

Orientacja siatki twarzy

Zwróć uwagę na orientację siatki twarzy w iOS:

Nałóż teksturę 2D na twarz

Przykładowa aplikacja udostępnia klasę, która pozwala przekonwertować twarz rozszerzoną na obiekt SCNGeometry. Za pomocą tej geometrii możesz łatwo przymocować go do węzła SceneKit, który zostanie umieszczony w przekształceniu środkowej twarzy rozszerzonej.

let faceNode = SCNNode()

// Gets the most recent frame's face
let face = faceSession.currentFrame?.face

// This is instantiated once, not with every frame
let faceGeometryConverter = FaceMeshGeometryConverter()

// Converts Augmented Face to SCNGeometry object
let faceMesh = faceGeometryConverter.geometryFromFace(face)

// Assigns geometry to node and sets the pose
faceNode.geometry = faceMesh
faceNode.simdTransform = face.centerTransform

Tekstura ścianki 2D jest wczytywana jako UIImage i ustawiona na materiał przylegający do geometrii siatki płaszczyznowej.

faceTextureMaterial = SCNMaterial()
faceTextureMaterial.diffuse.contents = UIImage(named:@"face.png")

faceMesh?.firstMaterial = faceTextureMaterial

Załączaj obiekty 3D do twarzy

Element GARAugmentedFace otrzymany w ramach wywołania zwrotnego przez osobę, której przekazano dostęp, zawiera 3 różne regiony lub przekształcenia, za pomocą których możesz dołączać treści do twarzy. Przekształcenia te umożliwiają położenie nosa na lewo od czoła i na prawo od czoła w kosmosie. W tym przypadku do nosa przymocowuje się kulę.

// Create node and add to scene
let node = SCNNode(geometry: SCNSphere(radius: .02))
sceneView.rootNode.addChild(node)

// Every frame updates the node's position
node.simdWorldTransform = session.currentFrame.face.transform(for: .nose)

Importuj własne zasoby do Xcode

Aby dodać zasoby, takie jak tekstury i modele 3D, do wykrytej twarzy w aplikacji, najpierw zaimportuj je do Xcode.

  1. Wyeksportuj plik *.dae (model 3D).
  2. Przeciągnij plik *.dae do projektu Xcode.
  3. Przekonwertuj plik na format .scn w Xcode, wchodząc na stronę Editor > Convert to SceneKit scene file format (.scn).