首页 > 解决方案 > 从图像中检测文本并获取关键字的矩形

问题描述

我正在尝试获取在UIImageusing中找到的所有文本VisionKit并获取图像中关键字(如果存在)的位置。到目前为止,我有这个:

    var detectedText = ""
    var textRecognitionRequest = VNRecognizeTextRequest(completionHandler: nil)
    let textRecognitionWorkQueue = DispatchQueue(label: "TextRecognitionQueue", qos: .userInitiated, attributes: [], autoreleaseFrequency: .workItem)

    private func recognizeTextInImage(_ image: UIImage?) {
        guard let cgImage = image?.cgImage else { return }

        textRecognitionWorkQueue.async {
            let requestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:])
            do {
                try requestHandler.perform([self.textRecognitionRequest])
            } catch {
                // You should handle errors appropriately in your app.
                print(error)
            }
        }
    } 

并在viewDidLoad

    override func viewDidLoad() {
        super.viewDidLoad()
        let imgData = object.scannedImage ?? Data()
        recognizeTextInImage(UIImage(data: imgData, scale: 1.0))

        textRecognitionRequest.recognitionLevel = .accurate
        textRecognitionRequest.usesLanguageCorrection = true
        textRecognitionRequest.recognitionLanguages = ["en-US"]
        textRecognitionRequest.customWords = ["KEYWORD"]
        textRecognitionRequest = VNRecognizeTextRequest { (request, error) in
            guard let observations = request.results as? [VNRecognizedTextObservation] else { return }
            for observation in observations {
                guard let topCandidate = observation.topCandidates(1).first else { return }

                self.detectedText += topCandidate.string
                self.detectedText += " "

                if topCandidate.string == "KEYWORD" {
                    let boundingBox = observation.boundingBox
                    guard let imageData = object.scannedImage else { return }
                    let imgSize = UIImage(data: imageData)!.size
                    let rect = CGRect(x: boundingBox.minX * imgSize.width,
                                                   y: boundingBox.minY * imgSize.height,
                                                   width: boundingBox.width * imgSize.width,
                                                   height: boundingBox.height * imgSize.height)
                    print(rect)
                }
            }
        }
    }

但是检测boundingBox确实减慢了在图像中查找所有文本的过程,并且它变得非常不准确,并且永远不会调用矩形的打印。

有没有更好的方法来做到这一点?

标签: iosswiftuiimageapple-vision

解决方案


推荐阅读