Я использую следующее, которое отлично работает на отдельных изображениях. Как я могу адаптировать это для нескольких изображений (из массива изображений)? Я попытался поместить VNImageRequestHandler
& requestHandler.perform
в цикл for для всех изображений в массиве, но поскольку completionHandler
является асинхронным, мой метод addFaceLandmarksToImage
вызывается в случайном порядке. Таким образом, я понятия не имею, для какого изображения индекса массива я получаю вызов.
- Есть ли лучший способ сделать это без цикла изображений?
- Как вернуть исходное изображение из параметра VNRequest
completionHandler
?
Код:
@IBAction func process(_ sender: UIButton) {
var orientation:CGImagePropertyOrientation = .down
switch image.imageOrientation {
case .up:
orientation = .up
case .right:
orientation = .right
case .down:
orientation = .down
case .left:
orientation = .left
default:
orientation = .down
}
let requestHandler = VNImageRequestHandler(cgImage: image.cgImage!, orientation: orientation ,options: [:])
do {
try requestHandler.perform([VNDetectFaceLandmarksRequest(completionHandler: self.handleFaceFeatures)])
} catch {
print(error)
}
}
func handleFaceFeatures(request: VNRequest, errror: Error?) {
guard let observations = request.results as? [VNFaceObservation] else {
fatalError("unexpected result type!")
}
for face in observations {
addFaceLandmarksToImage(face)
}
}