首页 > 解决方案 > 检测面部向上/向下看的视觉框架

问题描述

我正在使用 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

标签: swiftimage-processingface-detectionvisionapple-vision

解决方案


推荐阅读