我正在开发带有手势识别的ARKit
/ Vision
iOS 应用程序。我的应用程序有一个简单的 UI,其中包含单个UIView
. 根本没有ARSCNView
/ ARSKView
。我将一系列捕获的内容ARFrames
放入CVPixelBuffer
然后用于VNRecognizedObjectObservation
.
我不需要会话中的任何跟踪数据。我只currentFrame.capturedImage
需要CVPixelBuffer
. 而且我需要以 30 fps 的速度捕获 ARFrame。60 fps 是过高的帧速率。
preferredFramesPerSecond
在我的情况下,实例属性绝对没用,因为它控制渲染ARSCNView
/的帧速率ARSKView
。我没有 ARViews。而且它不会影响会话的帧速率。
因此,我决定使用run()
和pause()
方法来降低会话的帧速率。
问题
我想知道如何在指定的时间段内自动run
和一个ARSession?和方法pause
的持续时间必须是(或 0.016 秒)。我想可能通过. 但我不知道如何实现它。run
pause
16 ms
DispatchQueue
怎么做?
这是一个伪代码:
session.run(configuration)
/* run lasts 16 ms */
session.pause()
/* pause lasts 16 ms */
session.run(session.configuration!)
/* etc... */
PS我的应用程序中既不能使用 CocoaPod 也不能使用 Carthage。
更新:关于如何currentFrame.capturedImage
检索和使用 ARSession。
let session = ARSession()
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
session.delegate = self
let configuration = ARImageTrackingConfiguration() // 6DOF
configuration.providesAudioData = false
configuration.isAutoFocusEnabled = true
configuration.isLightEstimationEnabled = false
configuration.maximumNumberOfTrackedImages = 0
session.run(configuration)
spawnCoreMLUpdate()
}
func spawnCoreMLUpdate() { // Spawning new async tasks
dispatchQueue.async {
self.spawnCoreMLUpdate()
self.updateCoreML()
}
}
func updateCoreML() {
let pixelBuffer: CVPixelBuffer? = (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)
}
}