ARG*_*Geo -6 augmented-reality ios swift arkit dispatch-queue
我正在使用手势识别开发ARKit/ VisioniOS应用程序.我的应用程序有一个包含单个的简单UI UIView.没有ARSCNView/ 根本没有ARSKView.我正在将一系列捕获ARFrames到CVPixelBuffer我用于的内容中VNRecognizedObjectObservation.
我不需要会话中的任何跟踪数据.我只需要currentFrame.capturedImage为CVPixelBuffer.我需要以30 fps捕获ARFrame.60 fps是过高的帧速率.
preferredFramesPerSecond在我的情况下,实例属性绝对没用,因为它控制渲染ARSCNView/的帧速率ARSKView.我没有ARViews.并且它不会影响会话的帧速率.
所以,我决定使用run()和pause()方法来降低会话的帧速率.
题
我想知道如何在指定的时间内自动run和pauseARSession?持续时间run和pause方法必须16 ms(或0.016秒).我想通过它可能是可能的DispatchQueue.但我不知道如何实现它.
怎么做?
这是一个伪代码:
session.run(configuration)
/* run lasts 16 ms */
session.pause()
/* pause lasts 16 ms */
session.run(session.configuration!)
/* etc... */
Run Code Online (Sandbox Code Playgroud)
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)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
497 次 |
| 最近记录: |