Как извлечь определенный текст из изображения с помощью UITextField в Swift?

Я использую фреймворк Vision и хочу иметь возможность использовать UITextField для поиска определенного слова на картинке. Например, скажем, я набираю слово «черный» в текстовом поле и хочу, чтобы оно обнаружило это на изображении, которое у меня есть. Как бы я это сделал? Я использую фреймворк Vision, и я понял, как обнаруживать тексты, но застрял в той части, где я могу обнаружить введенное пользователем слово в текстовом поле.

        func startTextDetection() {

       let textRequest = VNDetectTextRectanglesRequest(completionHandler: self.detectTextHandler)
       let request = VNRecognizeTextRequest(completionHandler: self.detectTextHandler)

        request.recognitionLevel = .fast
        textRequest.reportCharacterBoxes = true
        self.requests = [textRequest]

    }

    func detectTextHandler(request: VNRequest, error: Error?) {
        guard let observations = request.results else {
            print("no result")
            return
        }

        let result = observations.map({$0 as? VNTextObservation})

        DispatchQueue.main.async() {
            self.previewView.layer.sublayers?.removeSubrange(1...)
            for region in result {
                guard let rg = region else {
                    continue
                }

                self.highlightWord(box: rg)
                if let boxes = region?.characterBoxes {
                    for characterBox in boxes {
                        self.highlightLetters(box: characterBox)
                }
            }
        }
    }
}

     //when user presses search will search for text in pic. 
func textFieldShouldReturn(_ searchTextField: UITextField) -> Bool {
    searchTextField.resignFirstResponder()
    startTextDetection()

    return true
}

person xcode22    schedule 24.02.2020    source источник
comment
Проверьте эту тему, есть пара ответов, которые могут помочь ты.   -  person Ivan Nesterenko    schedule 25.02.2020


Ответы (1)


Вам следует посмотреть последнюю конференцию WWDC по платформе Vision. По сути, из iOS 13 VNRecognizeTextRequest возвращает текст, а также ограничивающую рамку текста на изображении. Код может быть примерно таким:

func startTextDetection() {
    let request = VNRecognizeTextRequest(completionHandler: self.detectTextHandler)
    request.recognitionLevel = .fast
    self.requests = [request]
}

private func detectTextHandler(request: VNRequest, error: Error?) {
    guard let observations = request.results as? [VNRecognizedTextObservation] else {
        fatalError("Received invalid observations")
    }
    for lineObservation in observations {
        guard let textLine = lineObservation.topCandidates(1).first else {
            continue
        }

        let words = textLine.string.split{ $0.isWhitespace }.map{ String($0)}
        for word in words {
            if let wordRange = textLine.string.range(of: word) {
                if let rect = try? textLine.boundingBox(for: wordRange)?.boundingBox {
                     // here you can check if word == textField.text
                     // rect is in image coordinate space, normalized with origin in the bottom left corner
                }
            }
        }
   }
}


person Costea Bogdan    schedule 25.02.2020
comment
Эй, спасибо за помощь, но как мне показать ограничивающую рамку над словом, когда я ищу его в UITextField? Я знаю, что слово обнаруживается, потому что я использовал If statement и проверил его с помощью print(word). Я просто хочу иметь возможность выделить слово, которое искали. Спасибо! - person xcode22; 26.02.2020
comment
Код, который я разместил, также имеет CGRect (переменная rect), представляющую местоположение текста. Но это CGRect имеет координаты, нормализованные к размерам обработанного изображения, с началом в нижнем левом углу. Чтобы преобразовать его из пространства изображения в ваше координатное пространство UIImageView, вы должны проверить VNImageRectForNormalizedRect и ImageCoordinateSpace. После того, как вы преобразовали CGRect, создайте представление с этим фреймом, задайте ему ширину и цвет границы и добавьте его в качестве подпредставления к вашему UIImageView. - person Costea Bogdan; 27.02.2020