没有渲染/虚拟内容的ARKit / SceneKit截图

时间:2018-04-24 18:54:57

标签: ios swift scenekit arkit

我有一个非常简单的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)
        }   
    }
}

1 个答案:

答案 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)
    }
}