Как нанести 3D-модель на обнаруженное лицо с помощью Apple Vision "NO AR" - PullRequest
0 голосов
/ 23 мая 2019

С камерой iPhoneX True-Depth можно получить 3D-координаты любого объекта и использовать эту информацию для позиционирования и масштабирования объекта, но на старых iPhone у нас нет доступа к AR на передней камере, что я До сих пор было сделано определение лица с использованием каркаса Apple Vison и рисование двухмерных контуров вокруг лица или ориентиров. я сделал SceneView и применил его в качестве переднего слоя моего просмотра с чистым фоном, а под ним - AVCaptureVideoPreviewLayer , после обнаружения лица мой 3D-объект появляется на экране, но позиционируется и корректно масштабируя его в соответствии с гранью лица, которая требует непроецирования и других вещей, которые я там застрял, я также пытался преобразовать 2D BoundingBox в 3D, используя CATransform3D , но мне не удалось! мне интересно, возможно ли то, чего я хочу достичь? я помню, что Snapchat делал это до того, как ARKit был доступен на iPhone, если я не ошибаюсь!

Imgur

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.addSubview(self.sceneView)

        self.sceneView.frame = self.view.bounds
        self.sceneView.backgroundColor = .clear
        self.node = self.scene.rootNode.childNode(withName: "face", 
        recursively: true)!

    }

    fileprivate func updateFaceView(for result: 
    VNFaceObservation, twoDFace: Face2D) {
        let box = convert(rect: result.boundingBox)
        defer {
            DispatchQueue.main.async {
                self.faceView.setNeedsDisplay()
            }
        }

        faceView.boundingBox = box
        self.sceneView.scene?.rootNode.addChildNode(self.node)

        let unprojectedBox = SCNVector3(box.origin.x, box.origin.y, 
        0.8)

        let worldPoint = sceneView.unprojectPoint(unprojectedBox)

         self.node.position = worldPoint 
        /* Here i have to to unprojecting 
         to convert the value from a 2D point to 3D point also 
         issue here. */
    }
...