VNDetectBarcodesRequest 在 iOS16 上不起作用

问题描述 投票:0回答:3

我在 iOS 16 上遇到了

VNDetectBarcodesRequest
的问题。我的代码在 iOS 15 上按预期工作,但在 iOS 16 上它在图像中找不到任何条形码。

我已将代码分离到游乐场,并且在这里遇到了同样的问题。在 Xcode 13.4.1 的 Playground 上运行下面的代码,我得到结果:

“Google 链接:可选(“https://www.google.com”)”

在 Xcode 14 上运行相同的代码,我得到了

nil
结果。在带有 Xcode 14 的 iOS15 模拟器中运行此命令会给出积极的结果,仅在 iOS16 和 Playground 上它不会读取二维码。

补充一下,也不会抛出任何异常。

有人经历过同样的事情并设法解决这个问题吗?

这是我的游乐场代码:

import UIKit
import Vision

extension UIImage {
    func qrCodeLink(completion: @escaping (String?) -> Void) {
        guard let ciImage = CIImage(image: self) else {
            completion(nil)
            return
        }
        let imageRequestHandler = VNImageRequestHandler(ciImage: ciImage,
                                                        orientation: .up,
                                                        options: [:])       
        let request = VNDetectBarcodesRequest { (request,error) in
            guard error == nil else {
                completion(nil)
                return
            }
            
            guard let observations = request.results as? [VNDetectedObjectObservation] else {
                completion(nil)
                return
            }
            
            let result = (observations.first as? VNBarcodeObservation)?.payloadStringValue
            completion(result)
        }
        try? imageRequestHandler.perform([request])
    }
}

if let google = UIImage(named: "google") {
    google.qrCodeLink { link in
        debugPrint("Google link: \(link)")
    }
} else {
    debugPrint("No google image")
}

通过上面的代码,我使用了这张图片,它只是

https://www.google.com
的链接: Google

swift vision ios16 xcode14
3个回答
7
投票

详细阐述@Paul Peelen的解决方案,为了确保仅在需要的地方使用解决方法(Xcode 14 + iOS 16 + Simulator),我们使用:

#if targetEnvironment(simulator) && compiler(>=5.7)
if #available(iOS 16, *) {
    request.revision = VNDetectBarcodesRequestRevision1
}
#endif

7
投票

我想我已经找到问题了。 在 Xcode 14 和 iOS 16 上运行请求时,请求修订版在

VNDetectBarcodesRequestRevision3
上运行(VNDetectBarcodesRequest 页面上尚未记录)。但是,使用
VNDetectBarcodesRequestRevision1
VNDetectBarcodesRequestRevision2
有效。

在执行任务之前添加以下内容对我有用:

request.revision = VNDetectBarcodesRequestRevision1

0
投票

针对 iOS 15 或 16 进行编译时,我发现扫描带边框的条形码或不带边框的条形码时 VNDetectedBarcodesRequest 行为存在差异。那个边框好像触发了扫码什么时候开始。

带边框:它可以正确扫描黑色背景图像和白色背景图像。

无边框:可以正确扫描显示器上黑色背景的条码图像,但将该图像打印在白纸上并扫描时失败。 无边框 = 无条形码。

新问题:当扫描该单边框条形码时,它返回了由 17 个相同条形码观察结果组成的数组。

© www.soinside.com 2019 - 2024. All rights reserved.