Guia do desenvolvedor de rostos aumentados para iOS

Aprenda a usar os rostos aumentados nos seus apps.

Pré-requisitos

  • Xcode versão 13.0 ou mais recente
  • Cocoapods 1.4.0 ou mais recente, se estiver usando o Cocoapods
  • Um dispositivo Apple compatível com ARKit com iOS 12.0 ou mais recente (destino de implantação do iOS 12.0 ou posterior obrigatório)

Criar e executar o app de exemplo

Veja as etapas detalhadas no Guia de início rápido.

  1. Clone ou faça o download do SDK do ARCore para iOS no GitHub para ver o código do app de exemplo.
  2. Abra uma janela do Terminal e execute pod install na pasta em que o projeto do Xcode está localizado.
  3. Abra o app de exemplo no Xcode versão 10.3 ou mais recente e conecte o dispositivo à máquina de desenvolvimento por USB. Para evitar erros de build, verifique se você está criando a partir do arquivo .xcworkspace, e não do arquivo .xcodeproj.
  4. Pressione Cmd+R ou clique em Run. Use um dispositivo físico, não o simulador, para trabalhar com o recurso de rostos aumentados.
  5. Toque em "OK" para conceder acesso à câmera ao app de exemplo. O app vai abrir a câmera frontal e rastrear imediatamente o rosto no feed da câmera. Ele deve colocar imagens de orelhas de raposa em ambos os lados da testa e colocar um nariz de raposa sobre o próprio nariz.

Visão geral da implementação de rostos aumentados no seu app

Importar arquivos *.scn para o Xcode

Para adicionar seus próprios recursos, como texturas e modelos 3D, a um rosto detectado no app, arraste o recurso *.scn para o Xcode.

Inicializar uma sessão de rostos aumentados

Para usar a API Augmented Faces no seu app, inicialize uma sessão Augmented Faces. Essa sessão é responsável por capturar imagens da câmera a 60 QPS e retorna atualizações faciais de forma assíncrona a um método delegado. Ao inicializar, basta transmitir o campo de visão do dispositivo de captura e definir o delegado.

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

Passar imagens da câmera para a sessão

Agora que a sessão foi inicializada e configurada corretamente, o app pode começar a enviar imagens de câmera para ela. O app de exemplo recebe imagens da câmera criando uma AVCaptureSession com frames de vídeo da câmera frontal.

O exemplo de código a seguir mostra uma implementação do método delegado de saída de captura do AVFoundation, que transmite a imagem, um carimbo de data/hora e uma rotação de reconhecimento para a sessão de rosto.

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

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

Depois que a imagem é processada, a API Augmented Faces envia um callback delegado que retorna um GARAugmentedFaceFrame. Ele contém um objeto de rosto aumentado, que ajuda você a adicionar efeitos ao rosto. Ele também contém o buffer de imagem e o carimbo de data/hora que você transmitiu no método de atualização. Isso é útil para sincronizar os efeitos faciais com as imagens. Esse objeto também oferece uma transformação de tela e uma matriz de projeção para garantir que você possa configurar o mundo 3D e as visualizações em 2D de uma maneira que facilite a renderização dos efeitos faciais que aparecem anexados ao rosto detectado.

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

Orientação da malha de rosto

Observe a orientação da malha da face para iOS:

Aplicar uma textura 2D ao rosto

O app de exemplo fornece uma classe para converter o rosto aumentado em um objeto SCNGeometry. Você pode usar essa geometria para anexar facilmente a um nó do SceneKit, que será colocado na transformação do centro do rosto aumentado.

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

A textura de face em 2D é carregada como UIImage e definida como um material anexado à geometria da malha de face.

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

faceMesh?.firstMaterial = faceTextureMaterial

Anexar objetos 3D ao rosto

O GARAugmentedFace recebido do callback do delegado fornece três regiões ou transformações diferentes que podem ser usadas para anexar conteúdo a um rosto. Essas transformações permitem que você coloque o nariz, a esquerda da testa e a direita da testa no espaço do mundo. Aqui, uma transformação de nariz é usada para anexar uma esfera ao 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)

Importar seus próprios recursos para o Xcode

Para adicionar recursos, como texturas e modelos 3D, a um rosto detectado no seu app, primeiro importe esses recursos para o Xcode.

  1. Exporte um arquivo *.dae (modelo 3D).
  2. Arraste o arquivo *.dae para o projeto Xcode.
  3. Converta o arquivo para o formato .scn no Xcode acessando Editor > Convert to SceneKit scene file format (.scn).