在SceneKit下可靠地访问和修改捕获的相机帧

时间:2017-08-28 13:02:57

标签: objective-c scenekit arkit cvpixelbuffer arscnview

我尝试将B& W滤镜添加到ARSCNView的相机图像中,然后在其上渲染彩色AR对象。

enter image description here

我差点把以下代码添加到- (void)renderer:(id<SCNSceneRenderer>)aRenderer updateAtTime:(NSTimeInterval)time

的开头
CVPixelBufferRef bg=self.sceneView.session.currentFrame.capturedImage;

if(bg){
    char* k1 = CVPixelBufferGetBaseAddressOfPlane(bg, 1);
    if(k1){
        size_t x1 = CVPixelBufferGetWidthOfPlane(bg, 1);
        size_t y1 = CVPixelBufferGetHeightOfPlane(bg, 1);
        memset(k1, 128, x1*y1*2);
    }
}

这在移动设备上运行得非常快,但事情就是这样:有时会显示彩色框架。 我已经检查过并且我的过滤代码已经执行但我认为已经太晚了,SceneKit的管道已经处理了相机输入。

之前调用代码会有所帮助,但updateAtTime是最早可以逐帧添加自定义代码的点。

获取有关帧捕获的通知可能有所帮助,但看起来像整个AVCapturesession is unaccessible.

Metal ARKit示例显示了如何将摄像机图像转换为RGB,这是我要进行过滤的地方,但是在使用SceneKit时隐藏着色器。

我已经尝试this possible answer,但速度太慢了。

那么如何克服帧丢失并将摄像机馈送可靠地转换为BW?

1 个答案:

答案 0 :(得分:3)

以下是此问题的关键:

  

session:didUpdateFrame:

     

向代表提供新捕获的摄像机图像和随附的AR信息。

所以刚刚移动了CVPixelBufferRef操作,来自

的图像过滤代码
- (void)renderer:(id<SCNSceneRenderer>)aRenderer updateAtTime:(NSTimeInterval)time

- (void)session:(ARSession *)session didUpdateFrame:(ARFrame *)frame

确保设置self.sceneView.session.delegate = self以调用此委托。