0

我正在使用 Firebase ML Kit 进行人脸检测,在文档中它说:

如有必要,旋转图像,使其 imageOrientation 属性为 .up。使用正确旋转的 UIImage 创建一个 VisionImage 对象。不要指定任何旋转元数据 - 必须使用默认值 .topLeft。

我遇到了一个问题,我从互联网上传的照片往往可以正常工作,但是当我从相机拍照时似乎出现了问题。我有一种感觉,这是由于图像的定向方式造成的,我不知道应该如何检查图像以确保满足上面列出的这两个要求。我尝试打印出 images.imageOrientation 但它对我没有多大帮助,并且由于某种原因我无法使用UIImageOrientationUp我在不同的stackoverflow答案中看到的那个。

这是我尝试打印图像方向时打印的内容:

int:0x2809f9a40 'UISV-alignment' UIImageView:0x13de4d4b0.bottom == UILabel:0x13dec1630'orient's Profile'.bottom   (active)>",
    "<NSLayoutConstraint:0x2809f9a90 'UISV-alignment' UIImageView:0x13de4d4b0.top == UILabel:0x13dec1630'orient's Profile'.top   (active)>",

无论如何,如果有人可以帮助我编写一个函数,我可以使用它来确保我将要传递给 ML Kit 的图像的方向是正确的,我将非常感激。谢谢!我是 iOS 新手,这是我的第一个“真实”应用程序,所以如果有更好或更简单的方法来实现我的目标,我很抱歉。

*** 所以我发现当我用相机拍照时,它的方向是 .right,但在实际的 imageView 上看起来很好。我尝试将方向更改为 .up 但现在图像实际上向右旋转并且检测仍然失败......我想我需要将方向更改为 .Up 如果可能的话,无需实际旋转图像。因为当我尝试设置值时,它说它是一个只能获取的属性

4

1 回答 1

2

感谢您与我们联系,我是 MLKit 团队的 Julie,很抱歉迟到了这个帖子。

是的,当从相机拍摄照片时,默认方向并不总是.up,例如,如果以纵向模式拍摄,则 image.orientation 的方向是.right

人脸检测器在处理方向不是.up的图像时实际上非常灵活,关键步骤是正确设置方向:

这是使用我们的快速入门应用程序中的相机拍摄的照片来检测人脸的示例,请查看它是否可以解决您的问题。

基本上你只需要像这样imageMetadata.orientation正确设置值:

    // Define the metadata for the image.
    let imageMetadata = VisionImageMetadata()
    imageMetadata.orientation = UIUtilities.visionImageOrientation(from: image.imageOrientation)

    // Initialize a VisionImage object with the given UIImage.
    let visionImage = VisionImage(image: image)
    visionImage.metadata = imageMetadata

并且可以在此处找到方向之间的映射:

public static func visionImageOrientation(
    from imageOrientation: UIImage.Orientation
  ) -> VisionDetectorImageOrientation {
    switch imageOrientation {
    case .up:
      return .topLeft
    case .down:
      return .bottomRight
    case .left:
      return .leftBottom
    case .right:
      return .rightTop
    case .upMirrored:
      return .topRight
    case .downMirrored:
      return .bottomLeft
    case .leftMirrored:
      return .leftTop
    case .rightMirrored:
      return .rightBottom
    }
  }

UIImage 的此语句用于所有 ML Kit 检测器的更通用目的:


Create a VisionImage object using the correctly-rotated UIImage. Do not specify any rotation metadata—the default value, .topLeft, must be used.

但是对于人脸,只需正确设置方向即可以轻量级的方式进行处理。对于给您带来的困惑,我们深表歉意,我们将在下一个版本中更新此声明。

感谢您报告问题,并希望快速入门应用程序对您的开发有所帮助。

干杯,

朱丽叶

于 2020-05-07T17:58:13.653 回答