📷
[Swift] Vision Framework のハンドラを Concurrency で書いてみる
概要
Vision Framework を使う機会があり、その際 VNImageRequestHandler
を非同期で実行させたので、その際の備忘録みたいなものを書こうと思います。
書いたもの
今回は VNDetectFaceLandmarksRequest
を使いました。
Vision のリクエスト、preferBackgroundProcessing
っていうプロパティがあるみたいなので、これを true
にしておくと幸せになれると思います👀
func performFaceLandmarksRequest(
sourceImage: CIImage,
imageOrientation: CGImagePropertyOrientation
) async throws -> [VNFaceObservation]? {
let faceLandmarksRequest: VNDetectFaceLandmarksRequest = .init()
faceLandmarksRequest.preferBackgroundProcessing = true
let imageRequestHandler: VNImageRequestHandler = .init(
ciImage: sourceImage,
orientation: imageOrientation
)
return try await withTaskCancellationHandler {
try Task.checkCancellation()
return try await withCheckedThrowingContinuation { continuation in
do {
try imageRequestHandler.perform([faceLandmarksRequest])
continuation.resume(returning: faceLandmarksRequest.results)
} catch {
continuation.resume(throwing: error)
}
}
} onCancel: {
faceLandmarksRequest.cancel()
}
}
こんな感じで書きました。
もし間違っていればお気軽にコメントしていただければ幸いです🙇🏻♂️
Discussion