沃霍尔 0.2.0

沃霍尔 0.2.0

Cesar Vargas Casaseca 维护。



沃霍尔 0.2.0

  • César Vargas Casaseca

Warhol

Swift Package Manager Carthage CocoaPods PRs Welcome Medium: @toupper

欢迎使用 沃霍尔 —— 一个用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)

    ...

从相机,在人脸特征上添加图片

FaceLayouts

如果你想在每个脸部特征的上方添加图片,你需要创建一个FaceLayout对象,为你要绘制的每种脸部地标定义一个ImageLayout对象。你可以为每个特征设置所需的偏移量和大小比例。一旦创建好,你应该将它传递给CameraFaceDetectionViewControllerfaceLayout属性。请注意,这样做将覆盖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许可证发布。详细信息请参阅LICENSE文件