Guía para desarrolladores de rostros aumentados en iOS

Obtén información sobre cómo usar Rostros aumentados en tus propias apps.

Prerequisites

Para usar Rostros Aumentados, necesitarás lo siguiente:

  • Xcode versión 10.3 o posterior

  • CocoaPods

  • Un dispositivo Apple compatible con ARKit que ejecute iOS 11.0 o posterior (se requiere un destino de implementación de iOS 10.0 o una versión posterior)

Cómo compilar y ejecutar la app de muestra

Consulta la Guía de inicio rápido para obtener pasos detallados.

  1. Clona o descarga el SDK de ARCore para iOS desde GitHub a fin de obtener el código de la app de muestra.
  2. Abre una ventana de la terminal y ejecuta pod install desde la carpeta donde existe el proyecto de Xcode.
  3. Abre la app de muestra en Xcode 10.3 o una versión posterior y conecta el dispositivo a tu máquina de desarrollo mediante USB. Para evitar errores de compilación, asegúrate de compilar desde el archivo .xcworkspace y no el archivo .xcodeproj.
  4. Presiona Cmd+R o haz clic en Run. Usa un dispositivo físico, no el simulador, para trabajar con rostros aumentados.
  5. Presiona "Aceptar" para permitir que la cámara acceda a la app de muestra. La app deberá abrir la cámara frontal y realizar un seguimiento inmediato de tu rostro en el feed de la cámara. Deberías ubicar imágenes de orejas de zorro en ambos lados de la frente y colocar una nariz de zorro sobre tu propia nariz.

Descripción general de la implementación de rostros aumentados en tu app

Importa archivos *.scn a Xcode

Para agregar tus propios elementos, como texturas y modelos 3D, a un rostro detectado en tu app, arrastra el elemento *.scn a Xcode.

Cómo inicializar una sesión de rostros aumentados

Para usar la API de rostros aumentados desde tu app, inicializa una sesión de rostros aumentados. Esta sesión es responsable de tomar las imágenes de la cámara a 60 fps y mostrará actualizaciones de rostros de forma asíncrona a un método delegado. Cuando realices la inicialización, simplemente pasa el campo de visión del dispositivo de captura y asegúrate de configurar el delegado.

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

Pasar las imágenes de la cámara a la sesión

Ahora que tu sesión se inicializó y configuró de manera correcta, la app puede comenzar a enviar imágenes de la cámara a la sesión. La app de muestra obtiene imágenes de la cámara creando un AVCaptureSession con marcos de video desde la cámara frontal.

En la siguiente muestra de código, se muestra una implementación del método de delegado de captura de AVFoundation, que pasa la imagen, una marca de tiempo y una rotación de reconocimiento a tu sesión de rostros.

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

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

Después de que se procesa la imagen, la API de rostros aumentados envía una devolución de llamada delegada que muestra un GARAugmentedFaceFrame. Contiene un objeto de rostro aumentado que te ayuda a colocar efectos en el rostro. También contiene el búfer de imagen y la marca de tiempo que pasaste al método update. Esto es útil para sincronizar los efectos faciales con las imágenes. Este objeto también proporciona una transformación de pantalla y una matriz de proyección para garantizar que puedas configurar el mundo en 3D y las vistas en 2D de una manera que facilite la renderización de los efectos de rostro que aparecen conectados al rostro detectado.

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

Orientación de la malla facial

Observa la orientación de la malla de rostros para iOS:

Aplica una textura 2D al rostro

La app de ejemplo proporciona una clase para convertir tu rostro aumentado en un objeto SCNGeometry. Puedes usar esta geometría para adjuntarla fácilmente a un nodo de SceneKit, que colocarás en la transformación Center de 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

La textura del rostro en 2D se carga como un UIImage y se configura con un material adjunto a la geometría de la malla de rostros.

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

faceMesh?.firstMaterial = faceTextureMaterial

Adjunta objetos 3D al rostro

La GARAugmentedFace recibida de la devolución de llamada delegada proporciona 3 regiones o transformaciones diferentes que puedes usar para adjuntar contenido a un rostro. Estas transformaciones te permiten desplazarte por la nariz, a la izquierda de la frente y a la derecha de la frente en el espacio global. Aquí, se usa una transformación de nariz para adjuntar una esfera a la nariz.

// 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)

Importa tus propios elementos a Xcode

Para agregar elementos, como texturas y modelos 3D, a un rostro detectado en la app, primero debes importarlos a Xcode.

  1. Exporta un archivo *.dae (modelo 3D).
  2. Arrastra el archivo *.dae al proyecto de Xcode.
  3. Para convertir el archivo al formato .scn en Xcode, ve a Editor > Convert to SceneKit scene file format (.scn).