如何在 Swift 中使用 UITextField 从图像中提取特定文本?
Posted
技术标签:
【中文标题】如何在 Swift 中使用 UITextField 从图像中提取特定文本?【英文标题】:How do I extract specific text from an image using a UITextField in Swift? 【发布时间】:2020-06-08 13:43:12 【问题描述】:我正在使用 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
【问题讨论】:
查看this thread,有几个答案可能对您有所帮助。 【参考方案1】:您应该观看 latest WWDC on 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
【讨论】:
您好,感谢您的帮助,但是当我在 UITextField 中搜索单词时,如何在单词上显示边界框?我知道这个词被检测到了,因为我使用了If statement
并使用print(word)
进行了检查。我只是希望能够突出显示搜索的单词。谢谢!
我发布的代码也有代表文本位置的CGRect
(rect
变量)。但是CGRect
的坐标已标准化为处理后图像的尺寸,原点位于左下角。为了将它从图像空间转换到您的UIImageView
坐标空间,您应该查看VNImageRectForNormalizedRect
和ImageCoordinateSpace。转换 CGRect
后,使用该框架创建一个视图,为其指定边框宽度和颜色,并将其作为子视图添加到您的 UIImageView
。以上是关于如何在 Swift 中使用 UITextField 从图像中提取特定文本?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中创建 UITextField 对象数组?
如何在 Swift 中自动移动到下一个 UITextField
如何在 swift 中部分屏蔽 UITextField 文本?
Swift:如何使用 UISwitch 控制 UITextField 通过委托启用或禁用