最初的想法是通过AVCaptureSession
启动相机流,在原始CMSampleBuffer
中找到面孔,然后在AVCaptureVideoPreviewLayer
上添加一些图像作为图层,然后截取屏幕截图。
完成后,后来发现UIGraphicsGetImageFromCurrentImageContext
不能与AVCaptureVideoPreviewLayer
一起使用,所以截屏不会解决我的目的。
因此我使用Metal
和MTKView
来执行一些实时渲染,并且结果很好,CoreImage Filters和Metal的组合。我已经知道如何使用内置的CoreImage滤镜检测面部并改变面部的那部分,但我找不到合适的方法将图像添加到另一个图像上。
如何在背景图像中混合两个图像?我有CIImage可以使用。
您可以将叠加层加载到CIImage
中,然后使用transformed(by matrix: CGAffineTransform)
将其移动到面部位置,最后使用composited(over dest: CIImage)
将其混合到视频缓冲区中的CIImage
上。您可能需要在不同的坐标空间之间进行一些工作。
还有许多更复杂的合成过滤器可用。查看filters类别中的CICategoryCompositeOperation
。