Computer >> 컴퓨터 >  >> 스마트폰 >> iPhone

매우 빠른 스마일 추적 앱을 구축하는 방법

ARKit이 위협적으로 보일 수 있지만 iOS 앱을 빌드하는 기본적인 경험이 이미 있다면 나쁘지 않습니다.

저는 배우면서 배우는 타입이기 때문에 ARKit을 가지고 놀면서 익숙해지기 위해 기본 앱을 구축했습니다. 이 게시물에서는 간단한 얼굴 추적 앱을 만들면서 배운 내용을 검토하겠습니다.

3부로 나누어 진행하겠습니다.

  1. 초기 설정 → 먼저 카메라 권한을 얻고 기기에서 ARKit을 사용할 수 있는지 확인하세요.
  2. 스마일 추적 → ARKit으로 미소 추적을 시작하세요. 이것이 아마도 당신이 여기 있는 이유일 것입니다.
  3. 사용자 인터페이스 → 미소에 반응하는 앱용 UI를 추가하세요.

이 글을 쓰는 시점에서 Xcode 시뮬레이터는 전면 카메라를 지원하지 않으므로 앱을 실행하려면 실제 장치가 필요합니다. 또한 기기에 TrueDepth 카메라가 있어야 합니다(iPhone X 이상은 괜찮음).

마지막으로 Copy Paste Club의 동료 회원을 위해 모든 코드는 Github에서 사용할 수 있습니다.

초기 설정

Xcode를 열고 "SmileTracker"(또는 원하는 이름)라는 새 프로젝트를 만드는 것으로 시작하십시오.

얼굴 추적을 시작하기 전에 다음 두 가지 작업을 수행해야 합니다.

  1. 기기가 ARKit을 지원하는지 확인
  2. 기기의 카메라에 액세스할 수 있는 권한 얻기

새 프로젝트에서 ViewController.swift을 엽니다. . 파일 상단 부근, import UIKit 아래 , import ARKit 줄을 추가합니다. . 이렇게 하면 얼굴 추적을 매우 쉽게 하기 위해 Apple에서 제공한 모든 기능에 액세스할 수 있습니다.

이제 viewDidLoad 안에 다음 코드를 추가합니다. :

guard ARFaceTrackingConfiguration.isSupported else {
    fatalError("Device does not support face tracking")
}

ARFaceTrackingConfiguration.isSupported 앱을 실행하는 장치가 얼굴 추적을 지원할 수 있으면 true이고 그렇지 않으면 false인 부울입니다. 이 경우 기기가 얼굴 추적을 지원하지 않으면 치명적인 오류와 함께 앱이 다운됩니다.

다음으로 카메라 사용 권한을 부여해 보겠습니다. viewDidLoad에 다음을 추가합니다. guard 아래 성명:

AVCaptureDevice.requestAccess(for: AVMediaType.video) { granted in
   if (granted) {
      Dispatch.main.sync {
          // We're going to implement this function in a minute
          self.setupSmileTracker()      
      }
   } else {      
      fatalError("User did not grant camera permission!")   
   }
}

여기서 우리는 장치에 카메라 권한을 요청하도록 요청합니다. 사용자가 권한을 부여하면 스마일 트래킹을 설정하는 기능을 실행합니다(오류에 대해 걱정하지 마십시오. 이 기능은 잠시 후에 구현됩니다).

함수를 Dispatch.main.sync로 래핑합니다. 메인 스레드에서만 수행할 수 있는 이 함수에 UI 요소를 추가할 것이기 때문입니다.

또한 Info.plist에 카메라 사용 설명을 추가해야 합니다. . Info.plist 열기 새 행을 추가합니다(마지막 행을 강조 표시하고 enter 키를 눌러 이 작업을 수행할 수 있습니다. ).

방금 만든 행에 Privacy — Camera Usage Description를 추가합니다. Key로 열을 만들고 Type 열은 문자열로 설정됩니다. Value를 남길 수 있습니다. 열을 비우거나 사용자에게 카메라 사용 방법을 설명하는 메시지를 추가하세요.

귀하의 Info.plist 이제 다음과 같아야 합니다.

매우 빠른 스마일 추적 앱을 구축하는 방법

지금까지 앱을 테스트하려면 setupSmileTracker()이라고 하는 줄을 주석 처리할 수 있습니다. . 나중에 주석 처리를 제거하는 것을 잊지 마십시오.

지금 앱을 실행하면 카메라 권한을 활성화하라는 팝업이 표시되어야 합니다. 아니요라고 하면 앱을 실행하려면 해당 권한을 활성화하기 위해 애플리케이션 설정으로 이동해야 합니다.

앱이 충돌하는 경우 콘솔에서 두 가지 오류 메시지 중 하나를 확인하여 무엇이 잘못되었는지 확인하세요.

스마일 추적

ViewController.swift 열기 ViewController 상단에 다음 변수를 추가합니다. :

class ViewController: UIViewController {   
   let sceneView = ARSCNView()
   
   override func viewDidLoad() {...}
}

ARSCNView ARSession와 함께 제공됩니다. iPhone이 AR 경험을 조정하는 데 사용합니다. sceneView을 사용하겠습니다. 의 ARSession 전면 카메라를 통해 사용자의 얼굴을 분석합니다.

viewDidLoad 아래의 파일에 이 함수를 추가하세요. :

func setupSmileTracker() {   
   let configuration = ARFaceTrackingConfiguration()   
   sceneView.session.run(configuration)   
   sceneView.delegate = self   
   view.addSubview(sceneView)
}

여기에서 얼굴 추적을 처리하는 구성을 만들고 이를 사용하여 sceneViewARSession .

그런 다음 sceneView를 설정합니다. 의 대리인을 자신에게 위임하고 이를 우리 보기에 추가합니다.

Xcode는 ViewController 이후에 문제가 있음을 알려줍니다. ARSCNViewDelegate을 준수하지 않습니다. . ViewController 위치로 이동 파일 상단 근처에 선언되고 행을 다음과 같이 변경합니다.

class ViewController: ViewController, ARSCNViewDelegate {   
   ...
}

이제 ARSCNViewDelegate을 추가하세요. ViewController의 기능 클래스 setupSmileTracker :

func renderer(_renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
   ...
}

renderer 장면이 업데이트될 때마다 실행되고 ARAnchor 사용자의 얼굴에 해당합니다.

얼굴 추적 경험을 더 쉽게 만들 수 있도록 Apple은 자동으로 ARFaceAnchor 사용할 때 세션에 추가합니다. ARFacetrackingConfiguration 실행합니다. 이 ARFaceAnchor는 renderer로 전달됩니다. ARAnchor으로 .

다음 코드를 렌더러에 추가하세요.

func renderer(_renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {   
   // 1      
   guard let faceAnchor = anchor as? ARFaceAnchor else { return }
   
   // 2   
   let leftSmileValue = faceAnchor.blendshapes[.mouthSmileLeft] as! CGFloat
   let rightSmileValue = faceAnchor.blendShapes[.mouthSmileRight] as! CGFloat
   
   // 3
   print(leftSmileValue, rightSmileValue)
}

이 함수 내에서 많은 일이 진행 중이므로 단계에 번호를 매겼습니다(Ray Wenderlich 스타일).

1단계 에서 ARAnchor을 변환합니다. ARFaceAnchor으로 faceAnchor에 할당합니다. 변수.

ARFaceAnchor 현재 위치 및 방향, 토폴로지 및 얼굴 표정에 대한 정보가 포함되어 있습니다. 우리가 추적하는 얼굴의.

ARFaceAnchor 변수 blendShapes에 얼굴 표정에 대한 정보를 저장합니다. . blendShapes 다양한 얼굴 특징에 해당하는 계수를 저장하는 사전입니다. 관심이 있다면 Apple 문서에서 얼굴 기능의 전체 목록을 확인하는 것이 좋습니다. (힌트 :찌푸린 추적을 추가하려면 여기에서 방법을 찾을 수 있습니다.)

2단계에서 , 우리는 faceAnchor.blendShapes를 사용합니다. mouthSmileLeft 키를 사용하여 사용자 입의 왼쪽과 오른쪽이 웃는 정도에 해당하는 CGFloat를 가져옵니다. 및 mouthSmileRight .

마지막으로 3단계 제대로 작동하는지 확인할 수 있도록 두 값을 출력하면 됩니다.

이 시점에서 다음과 같은 앱이 있어야 합니다.

  • 사용자로부터 카메라 및 얼굴 추적 권한을 얻습니다.
  • ARKit을 사용하여 사용자의 표정 추적
  • 사용자가 입의 왼쪽과 오른쪽에 웃는 정도를 콘솔에 출력

많은 진전을 이루었으므로 잠시 시간을 내어 모든 것이 제대로 실행되는지 확인하겠습니다.

앱을 처음 실행할 때 카메라 권한을 부여할 것인지 묻는 메시지가 표시됩니다. 예라고 말하십시오.

그런 다음 빈 화면으로 보내지지만 CGFloat 값이 콘솔에 인쇄되는 것을 보기 시작해야 합니다(보기 전에 잠시 지연될 수 있음).

전화기를 보고 웃을 때 인쇄되는 값이 올라가는 것을 확인해야 합니다. 웃을수록 숫자가 높아집니다.

제대로 작동한다면 축하합니다. ?! 오류가 발생하면 장치가 얼굴 추적을 지원하고 카메라 권한이 켜져 있는지 다시 확인하십시오. 처음부터 이 글을 따랐다면 콘솔은 두 경우 모두 오류를 출력합니다.

사용자 인터페이스

얼굴을 추적하고 있으므로 이제 미소에 반응하는 UI를 빌드해 보겠습니다.

먼저 새 UILabel을 추가합니다. smileLabel이라고 함 파일 상단, sceneView 바로 아래 .

class ViewController: UIViewController {   
   let sceneView = ARSCNView()      
   let smileLabel = UILabel()
   
   ...
}

사용자의 표정에 반응하는 뷰입니다.

setupSmileTracker 하단에 다음 코드를 추가하세요. 기능:

smileLabel.text = "?"smileLabel.font = UIFont.systemFont(ofSize: 150) 

view.addSubview(smileLabel)

// Set constraints
smileLabel.translatesAutoresizingMaskIntoConstraints = false
smileLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
smileLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

여기에서는 smileLabel에 기본 UI 속성을 추가합니다. 및 화면 중앙에 있도록 제약 조건을 설정합니다. 이제 앱을 실행하면 거대한 ? 가운데 이모티콘.

매우 빠른 스마일 추적 앱을 구축하는 방법

이모티콘이 표시되면 ViewController에 다음 기능을 추가하세요. :

func handleSmile(leftValue: CGFloat, rightValue: CGFloat) {
   let smileValue = (leftValue + rightValue)/2.0
   switch smileValue {      
   	  case _ where smileValue > 0.5:         
      	 smileLabel.text = "?"      
      case _ where smileValue > 0.2:         
         smileLabel.text = "?"      
      default:         
         smileLabel.text = "?"      
   }
} 

이 기능은 smileLabel의 이모티콘을 변경합니다. 사용자가 카메라에 얼마나 미소를 짓고 있는지에 따라. smileValue을 계산합니다. ARFaceAnchor에서 제공한 왼쪽 및 오른쪽 미소 값의 평균을 취하여 (매우 과학적인 것으로 알고 있습니다).

그 값을 switch 문에 연결하면 사용자가 웃을수록 이모티콘이 더 행복해집니다.

마지막으로 renderer로 돌아갑니다. 함수를 만들고 이것을 하단에 추가하여 왼쪽 및 오른쪽 스마일 값을 handleSmile에 연결합니다. :

DispatchQueue.main.async {   
   self.handleSmile(leftValue: leftSmileValue, rightValue: rightSmileValue)
}

다시 DispatchQueue을 사용합니다. 메인 스레드에서 수행해야 하는 UI를 변경하기 때문입니다.

이제 앱을 실행하면 얼마나 웃느냐에 따라 이모티콘이 변경되는 것을 볼 수 있습니다.

아래 gif에는 이모티콘과 함께 카메라 출력과 함께 작동하는 것을 볼 수 있도록 내 얼굴을 추가했습니다.

매우 빠른 스마일 추적 앱을 구축하는 방법
작동 방식을 보여주기 위해 카메라 출력을 추가했습니다

앱에 카메라 출력이 없지만 ARSCNView을 추가하여 추가할 수 있습니다. , sceneView , 슈퍼뷰로 이동하고 치수를 지정합니다.

마무리

이 게시물이 ARKit으로 앱 제작을 시작하는 데 도움이 되었기를 바랍니다.

이 앱을 더 확장하려면 추적할 수 있는 다른 모든 얼굴 기능과 함께 위에서 언급한 목록을 확인하세요. 찡그린 표정도 확인하기 위해 이것을 확장하는 방법에 대한 힌트를 남겼습니다.

돌아와서 직접 만든 멋진 프로젝트에 대해 의견을 말하세요. 여전히 이 작업으로 발을 담그고 있으므로 더 복잡한 앱을 보게 되어 기쁩니다.

피드백과 질문을 위해 이 앱의 모든 코드를 Github에 게시했습니다. 읽어주셔서 감사합니다. 행운을 빕니다!

읽어주셔서 감사합니다! 이 이야기가 마음에 드셨다면 Twitter에서 제가 작업하고 있는 이야기와 현재 하고 있는 일에 대한 업데이트를 게시하는 저를 팔로우하세요.