金属相机
动机
金属相机是一个开源项目,旨在在Mac和iOS上执行GPU加速的图像和视频处理。
有很多使用GPU的方式,包括CIFilter,但它们并不可开放或难以扩展功能并贡献。
此仓库的主要目标是提供一个接口和测试性能,以便在iOS环境中对图像处理和机器学习有想法时更容易开发和应用于实际服务。
目前,我正在开发提供以下功能:
- 相机输入/输出处理
- 将图像帧保存到视频中
- 基本的图像处理和过滤器
- 下载和处理CoreML模型
- 可视化CoreML模型的结果
- 算法基准。
仍然有很多错误和很多事情要实现,但我想因为我想与许多人一起在iOS中开发相机和视觉功能,所以我创建了一个仓库。
请随意使用,当您有想法时,提出一些问题或PR。
谢谢。
示例
要运行示例项目,请克隆仓库,然后首先从示例目录运行pod install
相机
import MetalCamera
@IBOutlet weak var preview: MetalVideoView!
var camera: MetalCamera!
override func viewDidLoad() {
super.viewDidLoad()
guard let camera = try? MetalCamera(useMic: useMic) else { return }
camera-->preview
self.camera = camera
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
camera?.startCapture()
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
camera?.stopCapture()
}
从网页URL下载并加载CoreML
import MetalCamera
let url = URL(string: "https://ml-assets.apple.com/coreml/models/Image/ImageSegmentation/DeepLabV3/DeepLabV3Int8LUT.mlmodel")!
do {
coreMLLoader = try CoreMLLoader(url: url, isForcedDownload: true)
coreMLLoader?.load({ (progress) in
debugPrint("Model downloading.... \(progress)")
}, { (loadedModel, error) in
if let loadedModel = loadedModel {
debugPrint(loadedModel)
} else if let error = error {
debugPrint(error)
}
})
} catch {
debugPrint(error)
}
分割测试(使用DeepLabV3Int8LUT模型,iPhone XS,平均63毫秒)
func loadCoreML() {
do {
let modelURL = URL(string: "https://ml-assets.apple.com/coreml/models/Image/ImageSegmentation/DeepLabV3/DeepLabV3Int8LUT.mlmodel")!
let loader = try CoreMLLoader(url: modelURL)
loader.load { [weak self](model, error) in
if let model = model {
self?.setupModelHandler(model)
} else if let error = error {
debugPrint(error)
}
}
} catch {
debugPrint(error)
}
}
func setupModelHandler(_ model: MLModel) {
do {
let modelHandler = try CoreMLClassifierHandler(model)
camera.removeTarget(preview)
camera-->modelHandler-->preview
} catch{
debugPrint(error)
}
}
合成图像或视频和旋转
let rotation90 = RotationOperation(.degree90_flip)
let imageCompositor = ImageCompositor(baseTextureKey: camera.textureKey)
guard let testImage = UIImage(named: "sampleImage") else {
fatalError("Check image resource")
}
let gray = Gray()
let compositeFrame = CGRect(x: 50, y: 100, width: 250, height: 250)
imageCompositor.addCompositeImage(testImage)
imageCompositor.sourceFrame = compositeFrame
videoCompositor = ImageCompositor(baseTextureKey: camera.textureKey)
videoCompositor.sourceFrame = CGRect(x: 320, y: 100, width: 450, height: 250)
camera-->rotation90-->gray-->imageCompositor-->videoCompositor-->preview
滤镜
- 查找滤镜
录制视频和音频
do {
if FileManager.default.fileExists(atPath: recordingURL.path) {
try FileManager.default.removeItem(at: recordingURL)
}
recorder = try MetalVideoWriter(url: recordingURL, videoSize: CGSize(width: 720, height: 1280), recordAudio: useMic)
if let recorder = recorder {
preview-->recorder
if useMic {
camera==>recorder
}
recorder.startRecording()
}
} catch {
debugPrint(error)
}
需求
- Swift 5
- Xcode 11.5 或更高版本(在Mac上使用)
- iOS: 13.0 或更高版本
安装
MetalCamera 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
pod 'MetalCamera'
参考
在创建此存储库时,我参考了以下存储库很多。首先,感谢那些提前工作和开放许多部分的人,如果有任何问题,请告知。
作者
jsharp83, [email protected]
许可证
MetalCamera 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。