欢迎使用 Wink!— 这是一个使用 Swift 编写的轻量级响应式库,旨在简化在 iOS 上进行面部表情检测的过程。它使用 iPhone 的原深感摄像头检测默认的用户面部表情集,并通过 Combine 实时通知您。
由于 Wink 是在两个文件中实现的,您可以简单地将源代码文件夹拖放到您的 Xcode 项目中。但是,如果您想使用依赖管理工具,我建议您使用 SPM。
Swift 包管理器 是一种用于自动化 Swift 代码分发的工具,并已集成到 swift
编译器中。它尚处于早期开发阶段,但 Wink 确实支持在 iOS 上使用它。
一旦您设置好 Swift 包,将 Wink 添加为依赖项就像将其添加到 Package.swift
的 dependencies
值一样简单。
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
添加到 FacialExpressionDetectorViewController
的 analyzers
属性中来添加它。您需要三个值来初始化它。首先,需要一个新的 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 以了解详情。