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