Face Tracking pro iOS - úvod

31.10.2023 Programování #ios #iphone #arkit

Jednoduchá ukázka, jak používat AR Face Tracking ke sledování obličeje pomocí TrueDepth kamery.


V první řadě se nastaví soubor Main.storyboard tak, že bude obsahovat třídu ARSCNView. V horním pravém rohu programu Xcode, klikněte na znaménko +. Ve vyhledávacím poli zadejte počáteční řetězec třídy ARKit SceneKit View. Tento objekt přeneste do storyboardu.

ARSCNView je třída v rámci frameworku ARKit od Apple, která kombinuje funkce z ARKit a SceneKit, aby umožnila vývojářům snadno vytvářet rozšířenou realitu (AR) aplikace na iOS a iPadOS zařízeních.

Klíčové vlastnosti ARSCNView:

  1. Integrace ARKit a SceneKit: ARSCNView integruje sledování pohybu a analýzu scény z ARKit s vykreslováním 3D grafiky a animacemi z SceneKit. To umožňuje vývojářům vytvářet bohaté a interaktivní AR zážitky s použitím 3D modelů a animací.

  2. Sledování pohybu: ARSCNView automaticky sleduje pohyb zařízení a upravuje pozici a orientaci virtuálních objektů ve scéně tak, aby odpovídaly pohybům v reálném světě.

  3. Detekce rovin a objektů: ARSCNView může detekovat roviny a objekty v reálném světě a umožňuje vývojářům umístit virtuální objekty na tyto roviny nebo v interakci s reálnými objekty.

  4. Osvětlení a stíny: ARSCNView automaticky odhaduje osvětlení scény v reálném světě a aplikuje odpovídající osvětlení a stíny na virtuální objekty, což zvyšuje realismus AR zážitku.

  5. Snadná integrace s UIKit: Jako UIView podtřída lze ARSCNView snadno integrovat do stávajících UIKit aplikací, což umožňuje vývojářům přidávat AR funkce do svých aplikací bez potřeby rozsáhlých úprav kódu.

  6. Podpora pro vlastní shadery a post-procesy: ARSCNView umožňuje vývojářům používat vlastní shadery a post-procesové efekty, což dává větší kontrolu nad vzhledem a chováním virtuálních objektů ve scéně.

Jak používat ARSCNView:

  1. Přidání ARSCNView do vašeho UIViewControleru: Můžete přidat ARSCNView buď programově, nebo pomocí Interface Builderu.

  2. Nastavení delegáta: Nastavte delegáta ARSCNView, aby reagoval na události AR a SceneKit.

  3. Konfigurace AR session: Vytvořte a nakonfigurujte instanci ARSessionConfiguration (např. ARWorldTrackingConfiguration) a spusťte AR session.

  4. Přidání 3D obsahu: Použijte SceneKit k vytvoření a správě 3D modelů a animací, které chcete zobrazit v AR scéně.

  5. Reakce na události AR: Implementujte metody delegáta, aby vaše aplikace reagovala na události AR, jako je detekce rovin, aktualizace polohy a orientace objektů a další.

ARSCNView poskytuje výkonný a flexibilní způsob, jak vytvářet působivé AR aplikace na iOS a iPadOS zařízeních, a je široce používán vývojáři pro vytváření her, vzdělávacích aplikací, nástrojů pro vizualizaci dat a mnoha dalších typů aplikací.

Do souboru ViewController.swift přidejte:

import UIKit
import ARKit

Vytvoření IBOutletv Xcode je proces, který vám umožňuje propojit uživatelské rozhraní definované ve storyboardu nebo xib souboru s kódem ve vaší třídě UIViewController. Tady je postup, jak vytvořit IBOutlet:

1. Otevřete svůj projekt v Xcode

Otevřete svůj projekt v Xcode a ujistěte se, že máte otevřený soubor storyboardu nebo xib, ve kterém chcete vytvořit IBOutlet.

2. Otevřete Assistant Editor

  • Klikněte na tlačítko "Assistant Editor" v pravém horním rohu Xcode. Tlačítko vypadá jako dva překrývající se obdélníky.
  • Ujistěte se, že v levém panelu Assistant Editoru je otevřený váš soubor storyboardu nebo xib a v pravém panelu je otevřený soubor kódu třídy UIViewController, do které chcete vytvořit IBOutlet.

3. Vyberte prvek uživatelského rozhraní

V levém panelu klikněte na prvek uživatelského rozhraní, ke kterému chcete vytvořit IBOutlet (např. tlačítko, štítek, zobrazení atd.).

4. Vytvořte IBOutlet

  • Při držení klávesy Controlna klávesnici přetáhněte myší z vybraného prvku uživatelského rozhraní do kódu ve vaší třídě UIViewController v pravém panelu.
  • Pustěte myš a objeví se dialogové okno.
  • Vyberte "Outlet" z nabídky "Connection".
  • Zadejte název pro váš IBOutlet. Tento název použijete v kódu pro odkazování na prvek uživatelského rozhraní.
  • Klikněte na "Connect".

Výstup pojmenujete např. arView nebo sceneView:

Po dokončení těchto kroků byste měli vidět nový řádek kódu ve vaší třídě UIViewController, který vypadá nějak takto:

@IBOutlet weak var arView: ARSCNView!

Dále přidejte funkce tak, aby kontroler vypadal následovně:

class ViewController: UIViewController {

    @IBOutlet weak var arView: ARSCNView!

    override func viewDidLoad() {
        super.viewDidLoad()
        guard ARFaceTrackingConfiguration.isSupported else {
          fatalError("Face tracking is not supported on this device")
        }
        arView.delegate = self
    }

    override func viewWillAppear(_ animated: Bool) {
      super.viewWillAppear(animated)
        let config = ARFaceTrackingConfiguration()
        arView.session.run(config)
    }

    override func viewWillDisappear(_ animated: Bool) {
      super.viewWillDisappear(animated)
        arView.session.pause()
    }

}

Třída UIViewController je určena pro použití s ARKit a SceneKit pro sledování obličeje na zařízeních, které podporují tuto funkci.

    1. @IBOutlet weak var arView: ARSCNView!: Toto je propojení (IBOutlet) mezi kódem a uživatelským rozhraním v Interface Builderu. arView je odkaz na instanci ARSCNView, což je pohled, který zobrazuje 3D obsah a podporuje AR zážitky. Klíčové slovo weak znamená, že je to slabý odkaz, což znamená, že nezabraňuje automatickému uvolnění paměti (ARC) odstranění objektu, pokud na něj neodkazují žádné další silné odkazy.

    2. override func viewDidLoad(): Tato metoda je volána, když je pohled načten do paměti. V této metodě se kontroluje, zda je sledování obličeje podporováno na zařízení. Pokud není, aplikace skončí s chybovou zprávou. Pokud je podporováno, nastaví se delegát arView na self, což znamená, že tato třída ViewControllerbude reagovat na události z arView.

  • override func viewWillAppear(_ animated: Bool): Tato metoda je volána těsně předtím, než se pohled stane viditelným na obrazovce. V této metodě se vytvoří konfigurace pro sledování obličeje (ARFaceTrackingConfiguration) a spustí se AR session s touto konfigurací.

  • override func viewWillDisappear(_ animated: Bool): Tato metoda je volána, když pohled začíná být neviditelný. V této metodě se pozastaví AR session.

Celkově tento kód představuje základní nastavení pro aplikaci, která používá ARKit a SceneKit k sledování obličeje na zařízeních, které tuto funkci podporují.

Před spuštěním kódu se ještě musí povolit používání přední TrueDepth kamera. To se provede v souboru Info.plist, kde v navigátoru přidejte položku Privacy - Camera Usage Description. Ve výchozím nastavení by měl být typ String. Do value zadejte popis, proč je použita přední kamera.

Konfigurace sledování obličeje a související třídy Už jste se setkali s ARFaceTrackingConfiguration, což je nástroj pro nastavení zařízení k tomu, aby pomocí TrueDepth kamery sledovalo váš obličej. To je skvělé.

Nicméně, co dalšího byste měli vědět o sledování obličeje?

Existují tři klíčové třídy, které budete brzy využívat: ARFaceAnchor, ARFaceGeometry a ARSCNFaceGeometry.

ARFaceAnchor je odvozen od ARAnchor. Pokud jste již pracovali s ARKit, jistě víte, že ARAnchor je důvodem, proč je ARKit tak mocný a zároveň jednoduchý na použití. ARAnchor reprezentuje pozici ve fyzickém světě, kterou ARKit sleduje, a která zůstává stabilní i při pohybu telefonu. ARFaceAnchor navíc obsahuje informace specifické pro obličej, jako jsou topologie a výrazy obličeje.

ARFaceGeometry je přesně to, co název napovídá. Jedná se o 3D reprezentaci obličeje, včetně vrcholů (vertices) a texturovacích souřadnic (textureCoordinates).

ARSCNFaceGeometry využívá data z ARFaceGeometry k vytvoření SCNGeometry, což je objekt, který lze použít k vytváření uzlů v SceneKit – tedy toho, co vidíte na obrazovce.

Přidání síťové masky

Na první pohled to vypadá, že je zapnutá pouze přední kamera. Co však není vidět je, že iPhone již sleduje obličej.

Přidejte následující kód za uzavírací složenou závorkou třídy ViewController:

extension ViewController: ARSCNViewDelegate {
  func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
    guard let device = arView.device else {
      return nil
    }
    let faceGeometry = ARSCNFaceGeometry(device: device)
    let node = SCNNode(geometry: faceGeometry)
    node.geometry?.firstMaterial?.fillMode = .lines

    return node
  }

    func renderer(
      _ renderer: SCNSceneRenderer,
      didUpdate node: SCNNode,
      for anchor: ARAnchor) {

      guard let faceAnchor = anchor as? ARFaceAnchor,
        let faceGeometry = node.geometry as? ARSCNFaceGeometry else {
          return
      }

      faceGeometry.update(from: faceAnchor.geometry)
    }
}

Tento kód definuje rozšíření (extension) třídy ViewController, které implementuje dvě metody protokolu ARSCNViewDelegate. Toto rozšíření umožňuje třídě ViewController reagovat na události spojené s AR a SceneKit.

1. Metoda renderer(_:nodeFor:)

Tato metoda je volána, když ARKit detekuje nový kotvu (ARAnchor) a potřebuje vytvořit SCNNodepro její vizualizaci.

  • guard let device = arView.device else { return nil }: Nejprve se zkontroluje, zda je k dispozici zařízení pro arView. Pokud ne, metoda vrátí nil.
  • let faceGeometry = ARSCNFaceGeometry(device: device): Vytvoří se nová instance ARSCNFaceGeometry pro dané zařízení. ARSCNFaceGeometry je třída, která reprezentuje 3D geometrii obličeje.
  • let node = SCNNode(geometry: faceGeometry): Vytvoří se nový SCNNode s geometrií obličeje.
  • node.geometry?.firstMaterial?.fillMode = .lines: Nastaví se vzhled geometrie tak, aby se zobrazovala pouze jako síť čar, nikoli jako plný povrch.
  • return node: Vrátí se vytvořený uzel.

2. Metoda renderer(_:didUpdate:for:)

Tato metoda je volána, když se aktualizuje stav kotvy (ARAnchor) a je potřeba aktualizovat odpovídající SCNNode.

  • guard let faceAnchor = anchor as? ARFaceAnchor, let faceGeometry = node.geometry as? ARSCNFaceGeometry else { return }: Nejprve se zkontroluje, zda je kotva typu ARFaceAnchor a zda geometrie uzlu je typu ARSCNFaceGeometry. Pokud ne, metoda se ukončí.
  • faceGeometry.update(from: faceAnchor.geometry): Aktualizuje se geometrie uzlu na základě aktuální geometrie obličeje získané z kotvy.

Celkově tento kód umožňuje aplikaci sledovat obličej uživatele v reálném čase a zobrazovat jeho 3D model jako síť čar.

Celkový kód

import UIKit
import ARKit

class ViewController: UIViewController {

    @IBOutlet weak var arView: ARSCNView!

    override func viewDidLoad() {
        super.viewDidLoad()
        guard ARFaceTrackingConfiguration.isSupported else {
          fatalError("Face tracking is not supported on this device")
        }
        arView.delegate = self
    }

    override func viewWillAppear(_ animated: Bool) {
      super.viewWillAppear(animated)
        let config = ARFaceTrackingConfiguration()
        arView.session.run(config)
    }

    override func viewWillDisappear(_ animated: Bool) {
      super.viewWillDisappear(animated)
        arView.session.pause()
    }

}


extension ViewController: ARSCNViewDelegate {
  func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
    guard let device = arView.device else {
      return nil
    }
    let faceGeometry = ARSCNFaceGeometry(device: device)
    let node = SCNNode(geometry: faceGeometry)
    node.geometry?.firstMaterial?.fillMode = .lines

    return node
  }

    func renderer(
      _ renderer: SCNSceneRenderer,
      didUpdate node: SCNNode,
      for anchor: ARAnchor) {

      guard let faceAnchor = anchor as? ARFaceAnchor,
        let faceGeometry = node.geometry as? ARSCNFaceGeometry else {
          return
      }

      faceGeometry.update(from: faceAnchor.geometry)
    }
}

Literatura:

https://www.kodeco.com/5491-ar-face-tracking-tutorial-for-ios-getting-started