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

Dowiedz się, jak używać rozszerzonej twarzy we własnych aplikacjach.

Wymagania wstępne

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

Tworzenie i uruchamianie przykładowej aplikacji

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

  1. Skopiuj lub pobierz ARCore SDK na iOS z GitHuba, aby uzyskać przykładowy kod aplikacji.
  2. Otwórz okno terminala i uruchom pod install z folderu, w którym znajduje się projekt Xcode.
  3. Otwórz przykładową aplikację w Xcode w wersji 10.3 lub nowszej i podłącz urządzenie do komputera przez USB. Aby uniknąć błędów kompilacji, upewnij się, że kompilujesz na podstawie pliku .xcworkspace, a nie .xcodeproj.
  4. Naciśnij Cmd + R lub kliknij Run. Do pracy z rozszerzonymi twarzami używaj fizycznego urządzenia, a nie symulatora.
  5. Kliknij „OK”, aby umożliwić aplikacji przykładowej dostęp do aparatu. Aplikacja powinna otworzyć przedni aparat i natychmiast śledzić Twoją twarz na podglądzie aparatu. Powinien umieścić zdjęcia uszu lisa po obu stronach czoła i umieścić lisa na nosie.

Omówienie implementacji rozszerzonych twarzy w aplikacji

Importuj *.scn pliki do Xcode

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

Zainicjuj sesję rozszerzonej twarzy

Aby używać interfejsu Augmented Faces API w aplikacji, zainicjuj sesję Augmented Faces. Ta sesja odpowiada za robienie zdjęć aparatem z szybkością 60 kl./s, a synchronicznie zwraca aktualizacje twarzy do metody delegacji. Podczas inicjowania wystarczy przejść przez pole widzenia urządzenia do rejestrowania i ustawić delegowanie.

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

Przekazywanie obrazów z kamery do sesji

Po zainicjowaniu i prawidłowym skonfigurowaniu sesji aplikacja może zacząć wysyłać do niej zdjęcia z aparatu. Przykładowa aplikacja uzyskuje obrazy z kamery, tworząc AVCaptureSession z ramek wideo z przedniej kamery.

Poniższy przykładowy kod pokazuje implementację metody AVFoundation capture output delegate, która przekazuje obraz, sygnaturę czasową i rotację rozpoznawania do sesji rozpoznawania 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 delegowane, które zwraca GARAugmentedFaceFrame. Zawiera on obiekt Augmented Face, który ułatwia dołączanie efektów do twarzy. Zawiera ona też bufor obrazu i sygnaturę czasową przekazane do metody update. Jest to przydatne do synchronizowania efektów twarzy z obrazami. Ten obiekt zawiera też transformację wyświetlania i macierz projekcji, dzięki którym możesz skonfigurować widoki świata 3D i 2D w sposób ułatwiający renderowanie efektów twarzy, które są widoczne w powiązaniu z wykrytą twarzą.

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

Orientacja siatki twarzy

Zwróć uwagę na orientację siatki twarzy na urządzeniach z iOS:

Zastosuj teksturę 2D do twarzy

Przykładowa aplikacja zawiera klasę, która umożliwia przekształcenie rozszerzonego obrazu twarzy w obiekt SCNGeometry. Za pomocą tej geometrii możesz łatwo dołączyć węzeł SceneKit, który umieścisz w centrum transformacji Augmented Face.

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 płaszczyzny 2D jest ładowana jako UIImage i ustawiona na materiał dołączony do geometrii siatki płaszczyzny.

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

faceMesh?.firstMaterial = faceTextureMaterial

Dołączanie obiektów 3D do twarzy

GARAugmentedFace otrzymany z wywołania zwrotnego delegowanego zawiera 3 różne regiony lub przekształcenia, których możesz użyć do dołączania treści do twarzy. Te transformacje umożliwiają uzyskanie nosa, lewej i prawej części czoła w przestrzeni świata. Tutaj wykorzystuje się przekształcenie nosa, które pozwala dołączyć kulę do nosa.

// 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 te zasoby do Xcode.

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