Я пытаюсь сделать следующее:
- Запуск фронтальной камеры
- Определить лицо человека
- Поместите 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
Спасибо заранее.