Vision Framework: при отслеживании лица пользователя, как можно, чтобы изображение (например, шляпа) двигалось синхронно с лицом? - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь сделать следующее:

  1. Запуск фронтальной камеры
  2. Определить лицо человека
  3. Поместите 3D / изображение поверх их лица (например, шляпу)

Используя пример проекта от Apple ( здесь ), первые два шага работают нормально. Однако теперь я хочу завершить третий шаг и добавить UIImage в качестве подпредставления, чтобы оно двигалось синхронно с лицом, чтобы шляпа (например) оставалась на месте на верхней части головы пользователя, пока они перемещают камеру.

Я могу добавить изображение и сделать так, чтобы оно двигалось с лицом, немного редактируя этот код из примера проекта:

fileprivate func addIndicators(to faceRectanglePath: CGMutablePath, faceLandmarksPath: CGMutablePath, for faceObservation: VNFaceObservation) {
    let displaySize = self.captureDeviceResolution

    let faceBounds = VNImageRectForNormalizedRect(faceObservation.boundingBox, Int(displaySize.width), Int(displaySize.height))
    faceRectanglePath.addRect(faceBounds)

    if let landmarks = faceObservation.landmarks {
        // Landmarks are relative to -- and normalized within --- face bounds
        let affineTransform = CGAffineTransform(translationX: faceBounds.origin.x, y: faceBounds.origin.y)
            .scaledBy(x: faceBounds.size.width, y: faceBounds.size.height)

        // Treat eyebrows and lines as open-ended regions when drawing paths.
        let openLandmarkRegions: [VNFaceLandmarkRegion2D?] = [
            landmarks.leftEyebrow,
            landmarks.rightEyebrow,
            landmarks.faceContour,
            landmarks.noseCrest,
            landmarks.medianLine
        ]
        for openLandmarkRegion in openLandmarkRegions where openLandmarkRegion != nil {
            self.addPoints(in: openLandmarkRegion!, to: faceLandmarksPath, applying: affineTransform, closingWhenComplete: false)
        }

        // Draw eyes, lips, and nose as closed regions.
        let closedLandmarkRegions: [VNFaceLandmarkRegion2D?] = [
            landmarks.leftEye,
            landmarks.rightEye,
            landmarks.outerLips,
            landmarks.innerLips,
            landmarks.nose
        ]
        for closedLandmarkRegion in closedLandmarkRegions where closedLandmarkRegion != nil {
            self.addPoints(in: closedLandmarkRegion!, to: faceLandmarksPath, applying: affineTransform, closingWhenComplete: true)
        }



        self.imageView.frame = CGRect(x: faceBounds.origin.x, y: faceBounds.origin.y, width: 300, height: 165)
        self.previewView?.addSubview(self.imageView)

    }
}

Но я не уверен, какие значения X и Y использовать для imageView.frame, поскольку при использовании faceBounds.origin результат не очень согласован.

Вот ссылка на измененный пример проекта, если вы хотите попробовать его: https://files.fm/f/zqzrd6gf

Спасибо заранее.

...