3

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

在此处输入图像描述

我几乎在那里,在开头添加了以下代码- (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 都无法访问。

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

我已经尝试过这个可能的答案,但它太慢了。

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

4

1 回答 1

3

这是这个问题的关键:

会话:didUpdateFrame:

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

所以只是移动CVPixelBufferRef操作,图像过滤代码来自

- (void)renderer:(id<SCNSceneRenderer>)aRenderer updateAtTime:(NSTimeInterval)time

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

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

于 2017-08-30T12:13:58.807 回答