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 z pliku .xcworkspace, a nie z pliku .xcodeproj.
  4. Naciśnij klawisze Cmd + R lub kliknij Run. Do pracy z ulepszonymi twarzami używaj urządzenia fizycznego, a nie symulatora.
  5. Kliknij „OK”, aby przyznać aparatowi dostęp do aplikacji przykładowej. Aplikacja powinna otworzyć przedni aparat i natychmiast śledzić Twoją twarz na obrazie z kamery. 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ć własne zasoby, takie jak tekstury i modele 3D do wykrytej twarzy w aplikacji, przeciągnij zasób *.scn do Xcode.

Zainicjuj sesję rozszerzonej twarzy

Aby używać interfejsu Augmented Faces API w aplikacji, zainicjuj sesję rozszerzonej twarzy. Ta sesja odpowiada za robienie zdjęć aparatem z szybkością 60 kl./s, a synchronicznie zwraca aktualizacje twarzy do metody delegacji. Podczas inicjowania po prostu przekaż pole widzenia urządzenia do przechwytywania i pamiętaj, aby ustawić osobę z przekazanym dostępem.

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

Przekazywanie zdjęć 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 pobiera zdjęcia z aparatu przez utworzenie elementu AVCaptureSession z klatkami wideo z przedniego aparatu.

Poniższa próbka kodu przedstawia implementację metody przekazywania danych wyjściowych w AVFoundation, która przekazuje obraz, sygnaturę czasową i obrót 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 do przedstawiciela, które zwraca GARAugmentedFaceFrame. Zawiera obiekt Rozszerzona twarz, który pomaga dołączać do twarzy efekty. Zawiera on również bufor obrazu oraz sygnaturę czasową przesłaną do metody aktualizacji. Przydaje się to do synchronizowania efektów twarzy z obrazami. Ten obiekt udostępnia również przekształcenie wyświetlacza i matrycę rzutowania, dzięki czemu możesz skonfigurować świat 3D i widoki 2D w sposób ułatwiający renderowanie efektów Twojej twarzy, które są powiązane 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:

Nałóż na twarz teksturę 2D

Przykładowa aplikacja zawiera klasę umożliwiającą konwertowanie rozszerzonej twarzy na obiekt SCNGeometry. Za pomocą tej geometrii możesz łatwo dołączyć do węzła SceneKit, który zostanie umieszczony w przekształceniu centralnym płaszczyzny powiększonej.

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łącz obiekty 3D do twarzy

GARAugmentedFace odebrane z wywołania zwrotnego przedstawiciela, zawiera 3 różne regiony lub przekształcenia, których możesz używać do dołączania treści do twarzy. Te przekształcenia pozwalają ułożyć nos, lewą część czoła i prawą część czoła w kosmosie. 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ć do wykrytej twarzy w aplikacji zasoby, takie jak tekstury i modele 3D, 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, przechodząc do Editor > Convert to SceneKit scene file format (.scn).
.