我正在尝试编写一个应用程序,允许用户跟踪日语字符,然后该应用程序将使用 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 返回“观察:[],识别的字符串:[]”,但正如您所看到的,照片应用程序似乎可以很好地识别输入!
我的理论是从 Canvas 到 cgImage 的转换之间出了问题,但如果你看第一张图片,顶部的“APPLE”是我底部绘图“APPLE”的转换图像。
我自己设法解决了这个问题 - 令人恼火的是,问题一直出在 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
可以使识别正常工作。