确保图像数据在 Swift 中的 iOS 应用程序上正确定向 5

Ensuring Image Data is correctly oriented on iOS App in Swift 5

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

If necessary, rotate the image so that its imageOrientation property is .up. Create a VisionImage object using the correctly-rotated UIImage. Do not specify any rotation metadata—the default value, .topLeft, must be used.

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

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

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 新手,这是我的第一个 "Real" 应用程序,所以如果有更好或更简单的方法来实现我的目标,我很抱歉。

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

感谢您联系我们,我是 MLKit 团队的 Julie,很抱歉来晚了。

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

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

下面是一个使用我们 quickstart app 中的相机拍摄的照片检测人脸的示例,看看它是否能解决您的问题。

基本上你只需要像this一样正确设置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

并且可以找到方向之间的映射here:

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.

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

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

干杯,

朱莉