【问题标题】:AVCaptureVideoPreviewLayer add overlays and capture photo in iOSAVCaptureVideoPreviewLayer 在 iOS 中添加叠加层和捕捉照片
【发布时间】:2019-08-29 15:31:25
【问题描述】:

最初的想法是通过AVCaptureSession 启动摄像头流,在原始CMSampleBuffer 中找到人脸,然后在AVCaptureVideoPreviewLayer 上添加一些图像作为图层,然后截屏。

完成之后,后来发现UIGraphicsGetImageFromCurrentImageContext不能和AVCaptureVideoPreviewLayer一起使用,所以截图不能解决我这里的目的。

所以我使用MetalMTKView 来执行一些实时渲染,并且结合CoreImage 滤镜和Metal 效果很好。我已经知道如何检测面部并使用内置的 CoreImage 过滤器改变面部的那部分,但我找不到合适的方法来将图像添加到另一个图像上。

如何在背景图像中的定位方面混合两个图像?我有 CIImage 可以使用。

【问题讨论】:

    标签: ios swift avfoundation metal core-image


    【解决方案1】:

    您可以将叠加层加载到CIImage,然后使用transformed(by matrix: CGAffineTransform) 将其移动到面部位置,最后使用composited(over dest: CIImage) 将其与视频缓冲区中的CIImage 混合。 您可能需要做一些工作才能在不同的坐标空间之间进行转换。

    还有很多更复杂的合成过滤器可用。查看CICategoryCompositeOperation 类别中的filters

    【讨论】:

    • 会试试这个。我仍然不确定我是否使用了“实时写入视频”的最佳方法。据我所知,Metal 取代了 OpenGL。在我的示例中,我将苹果的示例代码 (developer.apple.com/documentation/avfoundation/…) 用于金属,然后将 CIDetector 添加到其中以进行特定于面部的编辑。我看过 Apple 的 SquareCam 示例 (developer.apple.com/library/archive/samplecode/SquareCam/…),我们点击照片但不是实时编辑
    • 添加到我上面的评论中,squarecam 示例将图像作为图层添加到 AVCaptureVideoPreviewLayer 中,当您拍照时,它会再次在该照片中找到人脸,然后在其上绘制。所以检测是两次感觉不正确
    • 在将 UIImage 转换为 CIImage 时,方向丢失。似乎宽度转换为高度。我想我需要在制作 CIImage CIImage.init(image: options:) 时从 UIIMage 添加元数据,使用developer.apple.com/documentation/coreimage/ciimageoption/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 2012-05-13
    • 1970-01-01
    相关资源
    最近更新 更多