我有一个非常简单的ARKit演示应用程序,我在其中放置一些带有标签的对象。我目前正使用snapshot()
上的ARSCNView
功能获取视频输入的屏幕截图,其中包含我在视图中的所有渲染对象。
但是,我想获得原始相机输入的UIImage,而不需要任何额外的渲染对象,最好是与屏幕上显示的分辨率相同的分辨率。我不确定最好的办法是什么。有没有办法剥离渲染的内容?我应该直接绑在相机上吗?
目前它看起来像这样:
class ViewController: UIViewController, ARSCNViewDelegate, ARSessionDelegate {
@IBOutlet weak var sceneView: ARSCNView!
var nodeModel:SCNNode!
...
override func viewDidLoad() {
let scene = SCNScene()
sceneView.scene = scene
let modelScene = SCNScene(named: ...
nodeModel = modelScene?.rootNode.childNode(...
...
self.view.addSubview( ...
}
...some ARKit stuff...some model stuff...
}
extension ViewController {
func renderer(_ renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: TimeInterval) {
if self.captureButton.capturing && time > self.captureTime {
captureScreenshot(scene)
self.captureTime = time + TimeInterval(0.1)
}
}
func captureScreenshot(_ scene: SCNScene){
DispatchQueue.main.async() {
let screenshot = self.sceneView.snapshot()
UIImageWriteToSavedPhotosAlbum(screenshot, nil, nil, nil)
}
}
}
答案 0 :(得分:4)
实施可选的ARSessionDelegate
方法:
func session(_ session: ARSession, didUpdate frame: ARFrame)
ARFrame
有一个captureImage
属性CVPixelBuffer
,您可以将其转换为UIImage
,如下所示:
import VideoToolbox
extension UIImage {
public convenience init?(pixelBuffer: CVPixelBuffer) {
var cgImage: CGImage?
VTCreateCGImageFromCVPixelBuffer(pixelBuffer, nil, &cgImage)
guard let cgImage = cgImage else { return nil }
self.init(cgImage: cgImage)
}
}