我尝试将B& W滤镜添加到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 is unaccessible.
Metal ARKit示例显示了如何将摄像机图像转换为RGB,这是我要进行过滤的地方,但是在使用SceneKit时隐藏着色器。
我已经尝试this possible answer,但速度太慢了。
那么如何克服帧丢失并将摄像机馈送可靠地转换为BW?
答案 0 :(得分:3)
以下是此问题的关键:
向代表提供新捕获的摄像机图像和随附的AR信息。
所以刚刚移动了CVPixelBufferRef
操作,来自
- (void)renderer:(id<SCNSceneRenderer>)aRenderer updateAtTime:(NSTimeInterval)time
到
- (void)session:(ARSession *)session didUpdateFrame:(ARFrame *)frame
确保设置self.sceneView.session.delegate = self
以调用此委托。