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

标签 ios swift scenekit arkit

我有一个非常简单的 ARKit 演示应用程序,我在其中放置了一些带标签的对象。我目前正在 ARSCNView 上使用 snapshot() 函数来获取视频输入的屏幕截图,其中包含我所有渲染的对象。

但是,我想获得一个只有原始相机输入的 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)
        }   
    }
}

最佳答案

实现可选的 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)
    }
}

关于ios - 没有渲染/虚拟内容的 ARKit/SceneKit 截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50008969/

相关文章:

ios - 提交基于 swift 的 cocoapod 时,检查设备是否为模拟器时出现此错误 : code after 'return' will never be executed

iOS/Xcode : How to simulate network connection between two iOS simulators

ios - 如何在另一个 Sidemenu 项中显示 Tabbar?

ios - 将 ARSCNView 场景背景内容设置为 iPhone X 相机

iphone - 需要了解以下代码在内存泄漏方面的行为差异

ios - 当我在 iOS 应用程序中看到很长的 View 并包含大量图像时,我该怎么办

swift - UICollectionViewcell 一遍又一遍地调用函数

ios - Swift 中的自定义 map

sprite-kit - 如何在 iOS 11 中将 SKVideoNode 添加到 ARKit-SceneKit?

swift - 未调用方法renderer(_:didAdd节点:,用于 anchor :)