DepthCamera 1.3.0

DepthCamera 1.3.0

Bradley French 维护。



  • Evilsmaher

DepthCamera

DepthCamera

添加到您的项目 在您的 Podfile 中添加 pod 'DepthCamera'

然后,您需要在特定文件中调用,将 import DepthCamera 添加到该文件中。

DepthCamera 详细信息

用法:以 2D 或 3D 格式录制视频或图像。方法:使用 AVCaptureDataOutputSynchronizerDelegate 读取数据缓冲区。如果使用 3D 环境,则从深度数据中应用过滤器。这是模拟的 3D 效果。如果录制视频,它将以异步方式将图像添加到视频中。为此,以未知速率添加图像。要进一步说明这一点,请参考下面的 视频创建细节。如果是图像,则简单地记录图像。从那里,可以以 2D (AVPlayer) 格式或 3D (ARKit) 格式获取和表示图像或视频。有关如何使用这些内容的详细信息,请参考下面的 视频播放。有关如何录制视频的详细信息,请参考 视频录制。假设:用户拥有一部能够使用这些资源的手机。

当前问题

ChromaKey 中使用的绿色颜色有点不合适。目前,几乎阻止了任何级别的绿色。最终目标是阻止一个非常特定的绿色。

视频创建详情

"RealTimeDepthViewController"内部的 MTKViewDelegate 调用了向 VideoCreator 添加图片的异步调用,以创建视频。尽管委托应该以特定FPS记录,但内部代码导致了"何时可行"的记录。这导致了未知的时间每帧。因为这个原因,我必须为每帧设置一个显示时间。但这些帧可以在未知的时间范围内。在我的测试中,我看到了0.04和0.08帧时间之间,这相当于14 - 25fps。虽然并不完美,但看起来相当不错。然而,音频以正常速率录制,听起来就像是以正常速率录制的。

为了创建立体视频,我们需要一种方法来区分视频。因此,在视频创建过程中,对于每张图片,我们取深度图并将所有太远的像素转换为绿色。现在我们有一个有绿色背景的视频。从这里,我们可以过滤掉绿色像素。当前的过滤并不完美,因为它几乎过滤掉了所有的绿色,但我正在努力改进。使用ChromaKey过滤后,我们现在就得到了原始视频。

视频录制

拍摄图片

let controller = RealtimeDepthMaskViewController.createRealTimeDepthCameraVC(imageOrVideoCaptureMode: .photo, completionHandler: { (image, _) in
                    //Do something with image
                }, backgroundImages: nil)
self.present(controller, animated: true, completion: nil)

拍摄视频

let controller = RealtimeDepthMaskViewController.createRealTimeDepthCameraVC(imageOrVideoCaptureMode: .video, completionHandler: { (_, url) in
                    //Do something with url
                }, backgroundImages: nil)
self.present(controller, animated: true, completion: nil)

创建RealTimeDepthViewController并展示它就那么简单。您只需声明它是.video还是.photo。然后,确保使用完成处理器在操作完成后访问URLUIImage

视频播放

注意:当我说2D和3D时,我是在谈论查看器的类型。2D = AVPlayer3D = SCNNode / ARKit。我假设视频是3D视频。如果拍摄的视频不是3D的,则它是一个普通视频,并且不需要进行任何过滤处理。

2D视频

由于视频背景为绿色,我们需要移除它。为此,我们可以简单地应用一个过滤器!这个过滤器已经准备好了,我计划创建一个创建组合的方法,但尚未完成。从那里,我们可以将AVVideoComposition应用到AVPlayerItem上,我们就有了一个正常视频!

//You need to create an AVVideoComposition that removes the green pixels using a ChromaKey
let composition = AVMutableVideoComposition(asset: asset) { (request) in
    let source = request.sourceImage.clampedToExtent()
    let filteredImage = RealtimeDepthMaskViewController.filteredImage(ciimage: source)!.clamped(to: source.extent)
    request.finish(with: filteredImage, context: nil)
}

let url = URL(string: "Wherever you store the video")
let asset = AVURLAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
playerItem.videoComposition = composition

2D图像

只要获取你存储位置的图像。它应该是一个黑色背景,因为AVPlayer不能看到透明通道,尽管特定像素的透明通道为0.0。因此,是黑色背景。

3D视频

下面的代码一目了然。拥有一个内容场景。RealtimeDepthMaskViewController.get3DChromaKey是类型为SCNMaterial的。从这里,我们可以将视频内容的场景应用到新的材料上。然后你有你的SCNNode,将材料应用到节点上,并在节点上应用ChromaKey

let scene = SKScene(size: videoNode.size)
//Add videoNode to scene
scene.addChild(videoNode)

let chromaKeyMaterial = RealtimeDepthMaskViewController.get3DChromaKey()
chromaKeyMaterial.diffuse.contents = scene
node.geometry!.materials = [chromaKeyMaterial]

3D图像

只需获取你存储的图像。由于在ARKitSCNNode可以查看透明通道,因此这是一个清晰的背景。这没问题是因为图像可以包含透明通道,而视频不能。