欢迎使用 沃霍尔 —— 一个用Swift编写的库,简化了iOS上的面部检测和在面部上方绘制的流程。
沃霍尔作为Apple Vision框架的封装器,可以检测相机或图像中的面部特征,并提供这些元素在您自己的坐标中的位置,因此您可以轻松在上面绘制。别再处理复杂的Vision或AVFoundation框架,只需处理Warhol Face View Model类,它封装了特征坐标。
功能
- 从相机中检测面部
- 从UIImageView中检测面部
- 将面部特征转换为客户端坐标。
- 在面部上方绘制。
要求
- iOS 11.0+
- Xcode 11.0+
安装
CocoaPods
您可以使用CocoaPods通过将其添加到Podfile中来安装Warhol
platform :ios, '11.0'
use_frameworks!
pod 'Warhol'
要获得完整的益处,在任何使用Warhol的地方导入它
import Warhol
Carthage
Carthage 是一个去中心化的依赖管理器,它会构建你的依赖项并为你提供二进制框架。要将 Alamofire 集成到使用 Carthage 的你的 Xcode 项目中,请在你的 Cartfile
中指定它。
github "toupper/Warhol" ~> 0.2.0
Swift 包管理器
Swift 包管理器 Swift Package Manager 是一个自动化 Swift 代码分发的工具,它集成到 swift
编译器中。它目前处于早期开发阶段,但 Alamofire 支持在支持的平台上使用它。
设置好你的 Swift 包后,将 Warhol 添加为依赖项就像将其添加到你的 Package.swift
中的 dependencies
值一样简单。
dependencies: [
.package(url: "https://github.com/toupper/Warhol.git", .upToNextMajor(from: "0.2.0"))
]
手动方式
你还可以手动将 Warhol 集成到你的项目中。
嵌入框架
-
打开终端,使用
cd
进入项目顶级目录,如果你的项目没有初始化为 git 仓库,请运行以下命令$ git init
-
通过运行以下命令将 Warhol 添加为 git 子模块
$ git submodule add https://github.com/toupper/Warhol.git
-
打开新的
Warhol
文件夹,并将Warhol.xcodeproj
拖到应用程序 Xcode 项目的 Project Navigator 中。 -
这就是全部内容了!
使用示例
从相机绘图
将Warhol导入到你要使用的文件中。创建一个CameraFaceDetectionViewController
实例,并将将要绘图的视图分配给前者的cameraFrontView
属性。然后你可以显示视图控制器
import Warhol
let cameraViewController = CameraFaceDetectionViewController()
let faceView = FaceView()
faceView.backgroundColor = .clear
cameraViewController.cameraFrontView = faceView
present(cameraViewController, animated: true, completion: nil)
为了绘图,我们需要创建一个符合Warhol协议FaceView的UIView子类。我们可以在它们的func draw(_ rect: CGRect)
函数中绘制。每当Warhol检测到人脸变化时,它都会在视图中调用setNeedsDisplay()
,以触发绘图过程
import Warhol
final class FaceView: UIView, CameraFrontView {
var viewModel: FaceViewModel?
override func draw(_ rect: CGRect) {
guard let context = UIGraphicsGetCurrentContext(),
let viewModel = viewModel else {
return
}
context.saveGState()
defer {
context.restoreGState()
}
context.addRect(viewModel.boundingBox)
...
从相机,在人脸特征上添加图片
如果你想在每个脸部特征的上方添加图片,你需要创建一个FaceLayout
对象,为你要绘制的每种脸部地标定义一个ImageLayout
对象。你可以为每个特征设置所需的偏移量和大小比例。一旦创建好,你应该将它传递给CameraFaceDetectionViewController
的faceLayout
属性。请注意,这样做将覆盖cameraFrontView
属性
let cameraViewController = CameraFaceDetectionViewController()
let leftEye = ImageLayout(image: UIImage(named: "leftEye")!, sizeRatio: SizeRatio(width: 1, height: 4))
let rightEye = ImageLayout(image: UIImage(named: "rightEye")!, sizeRatio: SizeRatio(width: 1, height: 4))
let nose = ImageLayout(image: UIImage(named: "nose")!)
let faceLayout = FaceLayout(landmarkLayouts: [.leftEye: leftEye,
.rightEye: rightEye,
.nose: nose])
cameraViewController.faceLayout = faceLayout
present(cameraViewController, animated: true, completion: nil)
除此之外,你可以实现CameraFaceDetectionDelegate
协议来反应人脸检测的任何变化。这在你不希望在图片上绘制,而只是获取人脸特征(地标)坐标的情况下很有用。这些坐标封装在给定的参数FaceViewModel
中。
从图像
为了检测图像中的脸部特征并在其上绘制,应向SDK传递描绘人脸的UIImageView以及一个闭包,在该闭包中您可以在图像上绘制
import Warhol
imageView.image = UIImage(named: "Face")
Warhol.drawLandmarks(from: imageView,
draw: { (viewModel, context) in
// draw with CGContext
},
error: {_ in })
如果您想修改传递的图像而不是生成新的UIImageView实例,请使用drawLandmarksInNewImage
imageView.image = UIImage(named: "Face")
Warhol.drawLandmarksInNewImage(from: imageView,
draw: { (viewModel, context) in
self.draw(viewModel: viewModel, in: context)
},
completion: { newImage in
self.newImageView.image = newImage
},
error: {_ in })
贡献
我们非常欢迎你对Warhol的贡献,请查看LICENSE
文件以获取更多信息。
版权信息
由César Vargas Casaseca创建和维护,热爱倾注。您可以通过Medium @toupper跟踪我的项目更新、发布和更多故事。
授权许可
Warhol遵循MIT许可证发布。详细信息请参阅