Wink

PRs Welcome Medium: @toupper

欢迎使用 Wink!— 这是一个使用 Swift 编写的轻量级响应式库,旨在简化在 iOS 上进行面部表情检测的过程。它使用 iPhone 的原深感摄像头检测默认的用户面部表情集,并通过 Combine 实时通知您。

特性

要求

安装

手动安装

由于 Wink 是在两个文件中实现的,您可以简单地将源代码文件夹拖放到您的 Xcode 项目中。但是,如果您想使用依赖管理工具,我建议您使用 SPM。

Swift 包管理器

Swift 包管理器 是一种用于自动化 Swift 代码分发的工具,并已集成到 swift 编译器中。它尚处于早期开发阶段,但 Wink 确实支持在 iOS 上使用它。

一旦您设置好 Swift 包,将 Wink 添加为依赖项就像将其添加到 Package.swiftdependencies 值一样简单。

dependencies: [
    .package(url: "https://github.com/toupper/Wink.git", .upToNextMajor(from: "0.1.0"))
]

使用示例

检测面部表情

Wink 在 FacialExpressionDetectorViewController 类中执行用户面部表情检测。此视图控制器将包含摄像头视图,用于分析用户面部以搜索表情。因此,如果您想开始检测表情,则必须将此视图控制器添加到您的视图层级结构中,例如通过视图控制器容器,即将其添加为子控制器。

import Wink

let facialExpressionDetectorViewController = FacialExpressionDetectorViewController()
addChild(facialExpressionDetectorViewController)

view.addSubview(facialExpressionDetectorViewController.view)
facialExpressionDetectorViewController.didMove(toParent: self)

如果您不希望摄像头视图出现在您的视图中,您可以轻松隐藏该视图

import Wink

facialExpressionDetectorViewController.view.isHidden = true

或更改其位置

import Wink

private func adjustFacialExpressionView() {
  facialExpressionDetectorViewController.view.translatesAutoresizingMaskIntoConstraints = false
  facialExpressionDetectorViewController.view.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true
  facialExpressionDetectorViewController.view.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
  facialExpressionDetectorViewController.view.widthAnchor.constraint(equalTo: self.view.widthAnchor, multiplier: 0.5).isActive = true
  facialExpressionDetectorViewController.view.heightAnchor.constraint(equalTo: self.view.heightAnchor, multiplier: 0.5).isActive = true
}

为了接收用户面部表情变化的通知,您应该订阅 facialExpression 发布器。

import Wink

private func adjustFacialExpressionView() {
  facialExpressionDetectorViewController.facialExpressionPublisher.sink(receiveValue: { expressions in
    DispatchQueue.main.async {
      // react to new face expressions
    }
  }).store(in: &cancellables)
}

该可观察对象返回一个 FacialExpression 对象数组。您可以通过检查其与静态声明值的相等性来检测特定面部表情是否存在。

import Wink

private func adjustFacialExpressionView() {
  facialExpressionDetectorViewController.facialExpressionPublisher.sink(receiveValue: { expressions in
    DispatchQueue.main.async {
      if expression.first == FaceExpression.mouthSmileLeft {
        /// do something
      }
    }
  }).store(in: &cancellables)
}

高级

检测更多表情

目前 Wink 默认检测以下面部表情

public static let mouthSmileLeft = FacialExpression(rawValue: "mouthSmileLeft")
public static let mouthSmileRight = FacialExpression(rawValue: "mouthSmileRight")
public static let browInnerUp =  FacialExpression(rawValue: "browInnerUp")
public static let tongueOut =  FacialExpression(rawValue: "tongueOut")
public static let cheekPuff =  FacialExpression(rawValue: "cheekPuff")
public static let eyeBlinkLeft =  FacialExpression(rawValue: "eyeBlinkLeft")
public static let eyeBlinkRight =  FacialExpression(rawValue: "eyeBlinkRight")
public static let jawOpen =  FacialExpression(rawValue: "jawOpen")

如果您想检测其他面部表情,可以通过将新的 FacialExpressionAnalyzer 添加到 FacialExpressionDetectorViewControlleranalyzers 属性中来添加它。您需要三个值来初始化它。首先,需要一个新的 Wink FaceExpression 对象,并为其 rawValue 属性赋值以进行相等性检查。

extension FacialExpression {
  static let eyeWideLeft = FacialExpression(rawValue: "eyeWideLeft")
}

其次,是要检测的面部表情本身。由于 Wink 使用 ARKit 来检测表情,因此您应该传递一个 ARFaceAnchor.BlendShapeLocation 来声明要检测的表情。请点击此处查看完整的可能性列表。

第三,也是可选的,我们需要一个从 0 到 1 的系数,用于定义面部表情准确度的可接受程度。例如,对于张开的嘴,0 表示完全闭合,1 表示完全张开。

facialExpressionDetectorViewController.analyzers.append(FacialExpressionAnalyzer(facialExpression: FacialExpression.eyeWideLeft, blendShapeLocation: .eyeWideLeft, minimumValidCoefficient: 0.6))

修改默认表情

如果您不希望收到所有默认面部表情变化的通知,或者您想更改其准确度系数,则可以将 analyzers 属性设置为您期望的值。

// Notifies only when the left eye is blinked, with a minor acceptance coefficient
facialExpressionDetectorViewController.analyzers = [FacialExpressionAnalyzer(facialExpression: FacialExpression.eyeBlinkLeft, blendShapeLocation: .eyeBlinkLeft, minimumValidCoefficient: 0.3)]

贡献

我非常感谢您为 Wink 做出的贡献,请查看 LICENSE 文件以获取更多信息。

鸣谢

César Vargas Casaseca 用心创建和维护。您可以在 Medium 上关注我 @toupper,以获取项目更新、版本发布和更多故事。

许可证

Wink 在 MIT 许可证下发布。查看 LICENSE 以了解详情。