Swift iOS - Vision 不会从 cgImage 返回任何观察结果

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

我正在尝试编写一个应用程序,允许用户跟踪日语字符,然后该应用程序将使用 Vision 来确定它们是否已被正确跟踪。为了测试这一点,我尝试在测试中使用英语 日语字符,但似乎都没有返回任何观察结果,因此没有可识别的字符串。

import UIKit
import Vision

func convertCanvasToImage(view: UIView) -> UIImage {
    let renderer = UIGraphicsImageRenderer(size: view.bounds.size)
    return renderer.image { ctx in
        view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
    }
}

func runVisionRecognition(canvas: Canvas) {

    NSLog("Start runVisionRecognition")
    let uiImage = convertCanvasToImage(view: canvas)
    guard let cgImage = uiImage.cgImage else { return }

    let requestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:])
    let request = VNRecognizeTextRequest(completionHandler: recognizeTextHandler)
    request.recognitionLevel = .accurate
    request.recognitionLanguages = ["en-US"]
    //request.minimumTextHeight = 0.1
    request.usesLanguageCorrection = true
    // request.maximumRecognitionCandidates = 10
    
    do {
        try requestHandler.perform([request])
    } catch {
        NSLog("Uh oh! \(error).")
    }
}

func recognizeTextHandler(request: VNRequest, error: Error?) {
    guard let observations =
            request.results as? [VNRecognizedTextObservation] else {
        NSLog("Whoops, observations like \(request.results)")
        return
    }
    let recognizedStrings = observations.compactMap { observation in
        return observation.topCandidates(1).first?.string
    }
    
    NSLog("Observation: \(observations)")
    NSLog("Recognised Strings: \(recognizedStrings)")
}

我的角色来自画布,然后我将其转换为图像以输入 Vision(请参阅顶部功能)。

以下是我在画布上手写的一些示例。 NSLog 返回“观察:[],识别的字符串:[]”,但正如您所看到的,照片应用程序似乎可以很好地识别输入!

View of my app, with the letters drawn onto a Canvas

Screenshot from the Photos app, showing the letters being read clearly (both English and Japanese)

我的理论是从 Canvas 到 cgImage 的转换之间出了问题,但如果你看第一张图片,顶部的“APPLE”是我底部绘图“APPLE”的转换图像。

ios swift xcode vision
1个回答
0
投票

我自己设法解决了这个问题 - 令人恼火的是,问题一直出在 CanvasWrapper 上。

struct CanvasWrapper: UIViewRepresentable {
    @Binding var canvas: Canvas
    
    func makeUIView(context: Context) -> UIView {
        return canvas
    }
    
    func updateUIView(_ uiView: UIView, context: Context) {
        uiView.backgroundColor = .white
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    class Coordinator: NSObject {
        var parent: CanvasWrapper

        init(_ parent: CanvasWrapper) {
            self.parent = parent
        }
    }
}

uiView.backgroundColor
设置为
.clear
- 我相信这会在将其转换为图像时出现问题!将其设置为
.white
可以使识别正常工作。

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