Vision 和 CoreML – CGImagePropertyOrientation 需要错误的类型

Posted

技术标签:

【中文标题】Vision 和 CoreML – CGImagePropertyOrientation 需要错误的类型【英文标题】:Vision and CoreML – CGImagePropertyOrientation expects wrong type 【发布时间】:2020-09-04 03:43:24 【问题描述】:

目前我正在使用 ARKit/CoreML/Vision 来识别图像/对象。

为此,我查看了 Apple 的示例项目 Recognizing and Labeling Arbitrary Objects

我已将 ViewController.Swift 脚本中的以下几行复制到我的项目中:

private func classifyCurrentImage() 
    // Most computer vision tasks are not rotation agnostic so it is important 
    // to pass in the orientation of the image with respect to device.
    let orientation = CGImagePropertyOrientation(UIDevice.current.orientation)

这里是 CGImagePropertyOrientation 类型的常量。

当我尝试将设备方向线作为参数传递时,它会出错。由于 CGImagePropertyOrientation 需要一个 UInt32 类型的值而不是 UIDeviceOrientation

编译器错误输出:

// Cannot convert value of type 'UIDeviceOrientation' to expected argument type 'UInt32'

我认为错误出在此处UIDevice.current.orientation

【问题讨论】:

【参考方案1】:

@ibnetariq 的第一个回复解决了这段代码 sn -p 中的问题。但我找到了另一个解决方案。示例项目包含 CGImagePropertyOrientation 的扩展,它解决了我的问题。

代码片段Utitlity.swift

import UIKit
import ImageIO

extension CGImagePropertyOrientation 
    /**
     Converts a `UIImageOrientation` to a corresponding
     `CGImagePropertyOrientation`. The cases for each
     orientation are represented by different raw values.

     - Tag: ConvertOrientation
     */
    init(_ orientation: UIImageOrientation) 
        switch orientation 
        case .up: self = .up
        case .upMirrored: self = .upMirrored
        case .down: self = .down
        case .downMirrored: self = .downMirrored
        case .left: self = .left
        case .leftMirrored: self = .leftMirrored
        case .right: self = .right
        case .rightMirrored: self = .rightMirrored
        
    

【讨论】:

【参考方案2】:

您对 UInt32 的看法是正确的,因为 UIDeviceOrientation 是一个 Int 类型的枚举。我认为将设备方向的原始值转换/转换为 UInt32 可以解决您的问题。

试试下面的代码

CGImagePropertyOrientation(rawValue: UInt32(UIDevice.current.orientation.rawValue))

【讨论】:

感谢您的回复。我已经尝试过了,它解决了这个代码 sn-p 的问题。这会导致以下 VNImageRequestHandler(未包含在代码 sn-p 中)出现必须解包方向值的问题。但是,我看到在Apple给出的示例中,他们为CGImagePropertyOrientation编写了一个扩展,它解决了我的问题。我在一个额外的答案中写了这个解决方案:-)

以上是关于Vision 和 CoreML – CGImagePropertyOrientation 需要错误的类型的主要内容,如果未能解决你的问题,请参考以下文章

在 macOS 中使用 Vision 和 CoreML 对图像进行分类

Swift 中 Vision/CoreML 对象识别器的精度

是否可以使用 Vision coreML 执行批量预测

Swift中Vision / CoreML对象识别器的精度

CoreML试水--图片识别

CoreML Vision 人脸检测的输入图像尺寸要求是啥