Guia do desenvolvedor de rostos aumentados para iOS

Aprenda a usar o recurso de rostos aumentados nos seus próprios apps.

Pré-requisitos

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

Criar e executar o aplicativo de exemplo

Consulte o guia de início rápido para ver as etapas detalhadas.

  1. Clone ou faça o download do SDK do ARCore para iOS no GitHub para conseguir o código do app de exemplo.
  2. Abra uma janela de Terminal e execute pod install na pasta em que o projeto Xcode está.
  3. Abra o app de exemplo no Xcode versão 10.3 ou posterior e conecte o dispositivo à sua máquina de desenvolvimento via 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 rostos aumentados.
  5. Toque em “OK” para dar à câmera acesso ao app de exemplo. O app deve abrir a câmera frontal e rastrear seu rosto imediatamente no feed da câmera. Ele deve colocar imagens de orelhas de raposa sobre ambos os lados da testa e colocar um nariz de raposa sobre seu próprio nariz.

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

Importe 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 de Augmented Faces. Esta sessão é responsável por capturar imagens da câmera a 60 fps e retornará de forma assíncrona as atualizações faciais para um método delegado. Ao inicializar, basta transmitir o campo de visão do dispositivo de captura e não se esqueça de definir o delegado.

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

Transmitir 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 da captura de AVFoundation, que transmite a imagem, o carimbo de data/hora e uma rotação de reconhecimento para sua sessão facial.

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 aplicar efeitos a ele. Ela também contém o buffer de imagem e o carimbo de data/hora que você transmitiu para o método de atualização. Isso é útil para sincronizar os efeitos de rostos com as imagens. Esse objeto também oferece uma transformação de exibição e uma matriz de projeção para garantir a configuração das visualizações em 2D e do mundo em 3D de modo a facilitar a renderização dos efeitos faciais que aparecem associados ao rosto detectado.

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

Orientação da malha facial

Observe a orientação da malha de rostos para iOS:

Aplicar uma textura 2D na face

O app de exemplo (link em inglês) oferece uma classe para converter o rosto aumentado em um objeto SCNGeometry. É possível usar essa geometria para anexar facilmente um nó do SceneKit, que você colocará na transformação "Augmented Face Center" (Centro de rostos aumentados).

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 da face 2D é carregada como um UIImage e definida como um material anexado à geometria da malha da face.

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

faceMesh?.firstMaterial = faceTextureMaterial

Anexar objetos 3D ao rosto

O GARAugmentedFace recebido do callback delegado fornece três regiões, ou transformações, que você pode usar para anexar conteúdo a um rosto. Essas transformações permitem que você fique com o nariz, o lado esquerdo da testa e o direito da testa no espaço mundial. Aqui, uma transformação do 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 os recursos para o Xcode.

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