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

标签 objective-c scenekit arkit cvpixelbuffer arscnview

我尝试向 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?

最佳答案

这里是这个问题的关键:

session:didUpdateFrame:

Provides a newly captured camera image and accompanying AR information to the delegate.

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

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

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

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

关于objective-c - 在 SceneKit 下可靠地访问和修改捕获的相机帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45919745/

相关文章:

iphone - Cocos2D 默认的调度间隔是多少?

swift - 使用 Metal 和 SceneKit 的 Vuforia

swift - 添加 14 个具有强引用的 ARAnchor 子类对象时 ARSCNView 卡住

ios - 当 UITextField 在 UITableViewCell 中时,我如何编辑它?

iphone - Xcode 4 ARC 重新检查错误 - "changes retain/release properties of pointer"

iOS - 创建自定义过渡动画

ios - SCNNode 释放具有更改的变换和枢轴属性的子节点

ios - ARKit 如何根据地平线而不是相机方向定位节点?

ios - ARKit - 如何让物体跟随用户

ios - Scenekit:为什么不应该对 SCNNode 进行子类化?