swift - 检测面部向上/向下看的视觉框架
问题描述
我正在使用 Vision 框架来检测人脸方向。VNFaceObservation 具有滚动和偏航属性,但不幸的是没有俯仰。我如何计算音高值?我需要检查一个人是向上还是向下看。
另一个论坛中的某个人建议我使用眼瞳和眉毛之间的距离,但我没有得到很好的结果,尤其是当人们改变与屏幕的距离时,因为这种差异会有所不同。我试图用面部边界框高度来划分差异,但这个值也是动态的,当用户抬头时,面部周围的框会变小。
面部特征非常不同的人是另一回事。有没有人用 Vision 实现过这样的功能?谢谢您的帮助。
var origins: [CGPoint] = []
// origin based on left and right pupil
if let point = result.landmarks?.leftPupil?.normalizedPoints.first {
let origin = landmark(point: point, to: result.boundingBox)
origins.append(origin)
}
if let point = result.landmarks?.rightPupil?.normalizedPoints.first {
let origin = landmark(point: point, to: result.boundingBox)
origins.append(origin)
}
// Calculate the average y coordinate of the origins.
let avgY = origins.map { $0.y }.reduce(0.0, +) / CGFloat(origins.count)
// get eyebrow locations
var eyebrowOrigins: [CGPoint] = []
var heights: [CGPoint] = []
if let point = result.landmarks?.leftEyebrow?.normalizedPoints.first {
let origin = landmark(point: point, to: result.boundingBox)
eyebrowOrigins.append(origin)
}
if let point = result.landmarks?.rightEyebrow?.normalizedPoints.first {
let origin = landmark(point: point, to: result.boundingBox)
eyebrowOrigins.append(origin)
}
// Calculate the average y coordinate of the eye brows.
let eyebrowAvgY = eyebrowOrigins.map { $0.y }.reduce(0.0, +) / CGFloat(origins.count)
// compare pupils location to eye brows
var focusY: CGFloat = 0
let diff = avgY - eyebrowAvgY
// approximate face height inside the bounding box
let faceHeight = result.boundingBox.height
解决方案
推荐阅读
- mysql - MySQL:如何将“ALTER DATABASES”授予用户
- python - 如何将 chromedriver.exe 添加到 PATH?
- python-3.x - PyTorch 训练 LSTM - AttributeError:“NoneType”对象没有属性“config”
- php - 同时使用 Laravel 和非 laravel-PHP
- java - 如何从 gradle 获取给定 java 类的所有依赖项
- mysql - SQL 查询:有条件连接
- angular - 当组件嵌套在其他组件中时,为什么角度事件发射器不起作用?
- maven - nexus3/deploy/Software 导致连接中止:套接字写入错误
- python - 为什么使用函数 `len` 时,pandas 中的 groupby.transform() 函数要慢得多?
- python - 通过多个可能的分隔符拆分字符串