📷

[Swift] Vision Framework のハンドラを Concurrency で書いてみる

2023/05/21に公開

概要

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