Face Tracking with ARKit에서 할 수 있는 거.

7115 단어 Swift

문서



  • ARFaceGeometry 중 1220개vertex

  • vertex는 얼굴의 점을 가리키는 좌표 정보
  • 번호의 배열 순서가 공개되지 않아 자체 조사(조사기능 실시)
  • 필요

    할 수 있는 일


  • BlendShapeLocation를 사용하면 얼굴 각 부위의 상태를 얻을 수 있다

  • 계수 0.0~1.0 사이BlendShapeLocation에서 얻은 각 부위의 운동
  • 을 얻을 수 있다
  • 현재cheekPuff의 값이 0.2이상이면 개구(변경 가능)
  • 로 판정됨

  • mouthFunnel 입이 0.25 이상이면 동그랗게 판정
  • 이동
    등록 정보
    두 볼 바깥쪽의 동작
    cheekPuff
    왼쪽 볼 주위 위로 이동
    cheekSquintLeft
    오른쪽 볼 주위 위로 이동
    cheekSquintRight
    입술의 수축
    mouthFunnel
    혀가 있는지 여부(iOS 12)
    tongueOut
  • 각 부위의 위치를 지정하여 얻을 수 없다.
  • 단, 색인 상수를 사용하여 특정 위치를 얻을 수 있습니다.
  • 코 윗부분은 9로 고정
  • 그래서 볼 근처 색인을 알면 얻을 수 있나요?
  • 그러나 미래의 하드웨어 등 인덱스가 유효할지 모르겠다.

    오른쪽 볼에서 왼쪽 볼까지의 거리 계산 정밀도 검증


    앱이 측정한 길이와 자가 측정한 길이로 통상 입꼬리를 벌린 표정의 빨갛고 파란 거리를 비교한다.
    자.
    응용 프로그램
    정상시
    8.1cm
    8.0~8.6cm
    입을 벌리다
    9.0cm
    9.0~9.7cm
  • 대체적으로 +0.7cm 정도의 오차
  • 줄지 않음
  • 각도를 바꾸거나 부근을 바꿀 때의 오차는 0.2~0.3 정도
  • 입꼬리 거리 계산의 정밀도 검증


    앱이 측정한 길이와 자가 측정한 길이로 통상 입꼬리를 벌린 표정의 빨갛고 파란 거리를 비교한다.
    자.
    응용 프로그램
    정상시
    4.2cm
    4.1~4.4cm
    입을 벌리다
    5.4cm
    5.3~5.7cm
    입을 다물다
    2.7cm
    2.6~3.0cm
  • 약 0.4cm의 오차(거리가 짧으니 시도해보세요)
  • 구조


  • 루트 노드에 마스크 정보 포함
  • 점이나 선을 추가하려면 뿌리 노드에 냉장 노드로 등록하고 그리기
  • 냉장 노드에name을 등록하고 루트에dd를 붙입니다.
    name을 키로 처리합니다.
    qiita.swift
    // マスクがレンダリングされるとき
        func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
            guard let faceAnchor = anchor as? ARFaceAnchor else { return nil }
            let faceGeometry = ARSCNFaceGeometry(device: device)
            let rootNode = SCNNode(geometry: faceGeometry)
            node.geometry?.firstMaterial?.fillMode = .lines
    
            let rightCheekNode = SphereNode(with: 0.003, color: .blue)
            rightCheekNode.name = Constants.FacePart.RightCornerOfMouth.rawValue
            node.addChildNode(rightCheekNode)
    
            let leftCheekNode = SphereNode(with: 0.003, color: .red)
            leftCheekNode.name = Constants.FacePart.LeftCornerOfMouth.rawValue
            node.addChildNode(leftCheekNode)
    
            return rootNode
        }
    

    좋은 웹페이지 즐겨찾기