2017-08-28 69 views
1

我尝试向ARSCNView的相机图像添加B & W滤镜,然后在其上渲染彩色AR对象。在SceneKit下可靠地访问和修改捕获的相机帧

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.

金属ARKit例子显示了如何将相机图像转换为RGB,这是在那里我会做过滤的地方,但该着色器在使用SceneKit时隐藏。我试过this possible answer但它太慢了。

那么,我该如何克服画面未命中,并将摄像机输入可靠地转换为BW?

+0

只是一个想法,我没有测试自己:你可以使用[shaderModifier](https://developer.apple.com/documentation/scenekit/scnshadable#1654834)将背景图像转换为黑白色,方法是添加一个片段着色器? – orangenkopf

+0

如果CVPixelBuffer方法无法修复,@orangenkopf绝对是一种方法。你将shaderModifier附加到什么? – diviaki

+0

根据['ARSCNView'](https://developer.apple.com/documentation/arkit/arscnview)文档框架被设置为场景['background'](https://developer.apple.com/ documentation/scenekit/scnscene/1523665-background)这是一个可以附加着色器修饰符的材质属性。根据评论[这里](https://stackoverflow.com/questions/45321275/how-to-place-3d-model-using-arkit-ios-11-with-some-custom-background-view-withou/ 45324663#45324663)虽然 – orangenkopf

回答

1

下面是这个问题的关键:

session:didUpdateFrame:

提供了一个新拍摄的摄像机图像和相应的AR信息的委托。

所以刚搬到CVPixelBufferRef操作,从

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

图像过滤代码,以

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

确信设置self.sceneView.session.delegate = self有这个代表呼吁。