Скриншот ARKit / SceneKit без визуализированного / виртуального контента - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть довольно простое демонстрационное приложение 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 голосов
/ 25 апреля 2018

Реализация необязательного 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)
    }
}
...