gpt4 book ai didi

swift - CVPixelBuffer – 如何以每秒 60 帧的速度捕获每第三帧?

转载 作者:行者123 更新时间:2023-11-28 05:48:57 24 4
gpt4 key购买 nike

我只需要处理每秒 60 帧中的 20 帧(CVPixelBuffer)。

如何在 ARKit session 中捕获每三个 ARFrame?我需要大约 20 fps 的捕获速度(我知道可能会出现掉帧)。

这是一段代码:

func updateCoreML() {

let pixelBuffer: CVPixelBuffer? = (sceneView.session.currentFrame?.capturedImage)

if pixelBuffer == nil { return }
let ciImage = CIImage(cvPixelBuffer: pixelBuffer!)
let imageRequestHandler = VNImageRequestHandler(ciImage: ciImage, options: [:])

do {
try imageRequestHandler.perform(self.visionRequests)
} catch {
print(error)
}
}

最佳答案

我所知道的最简单的方法是使用 RxARKit 并将 .throttle() 运算符应用于 session.rx.didUpdateFrame。我认为跳过这么多事件是不明智的,因为不能保证帧速率始终为 60fps,因此最好使用 .throttle() 最多每隔一段时间获取一帧许多毫秒,无论实际帧速率是多少。您可以将它的结果插入 RxVision,这将确保 CoreML 使用该帧。

import RxSwift
import RxARKit
import RxVision


let disposeBag = DisposeBag()
let mlRequest: RxVNCoreMLRequest<CVPixelBuffer> = VNCoreMLRequest.rx.request(model: model, imageCropAndScaleOption: .scaleFit)

mlRequest
.observable
.subscribe { [unowned self] (event) in
switch event {
case .next(let completion):
let cvPixelBuffer = completion.value
if let result = completion.request.results?[0] as? VNClassificationObservation {
os_log("results: %@", type: .debug, result.identifier)
}
default:
break
}
}
.disposed(by: disposeBag)

session
.rx
.didUpdateFrame
.throttle(1/20)
.subscribe { event in
switch event {
case .next(let didUpdateFrame):
let frame: ARFrame = didUpdateFrame.frame
let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: frame.capturedImage, orientation: .up, options: requestOptions)
do {
try imageRequestHandler.rx.perform([mlRequest], with: frame.capturedImage) } catch {
print(error)
}
break
default:
break
}
}
.disposed(by: disposeBag)

关于swift - CVPixelBuffer – 如何以每秒 60 帧的速度捕获每第三帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53582882/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com