使用Vision 框架的 VNRecognizeTextRequest 进行 iOS 原生OCR

Vision框架是苹果提供的计算机视觉工具,用于图像和视频处理,支持任务如文本识别、目标检测、人脸识别等。

VNRecognizeTextRequest是其文字识别功能的核心方法,可从图片或视频中提取文本,支持多语言和高精度模式。

示例用法:扫描到的文本并直接显示在页面上

```

import UIKit

import Vision

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    // 用于显示识别到的文本

    private let resultTextView: UITextView = {

        let textView = UITextView()

        textView.isEditable = false

        textView.font = UIFont.systemFont(ofSize: 16)

        textView.textColor = .black

        textView.backgroundColor = UIColor(white: 0.95, alpha: 1)

        textView.translatesAutoresizingMaskIntoConstraints = false

        return textView

    }()

    override func viewDidLoad() {

        super.viewDidLoad()

        view.backgroundColor = .white

        // 添加按钮选择图片

        let selectImageButton = UIButton(type: .system)

        selectImageButton.setTitle("选择图片", for: .normal)

        selectImageButton.addTarget(self, action: #selector(selectImageTapped), for: .touchUpInside)

        selectImageButton.frame = CGRect(x: 0, y: 0, width: 200, height: 50)

        selectImageButton.center = CGPoint(x: view.center.x, y: 100)

        view.addSubview(selectImageButton)

        // 添加结果文本框

        view.addSubview(resultTextView)

        NSLayoutConstraint.activate([

            resultTextView.topAnchor.constraint(equalTo: selectImageButton.bottomAnchor, constant: 20),

            resultTextView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),

            resultTextView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20),

            resultTextView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -20)

        ])

    }

    @objc func selectImageTapped() {

        let picker = UIImagePickerController()

        picker.delegate = self

        picker.sourceType = .photoLibrary

        present(picker, animated: true)

    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

        picker.dismiss(animated: true)

        // 获取选择的图像

        guard let image = info[.originalImage] as? UIImage else { return }

        // 进行文本识别

        recognizeText(from: image)

    }

    func recognizeText(from image: UIImage) {

        guard let cgImage = image.cgImage else { return }

        // 创建文本识别请求

        let request = VNRecognizeTextRequest { (request, error) in

            if let error = error {

                print("文本识别出错: \(error)")

                return

            }

            self.handleDetectionResults(request.results)

        }

        // 配置请求

        request.recognitionLevel = .accurate

        request.recognitionLanguages = ["en-US", "zh-Hans"] // 支持中文和英文

        request.usesLanguageCorrection = false

        // 创建请求处理器

        let requestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:])

        DispatchQueue.global(qos: .userInitiated).async {

            do {

                try requestHandler.perform([request])

            } catch {

                print("图像请求处理失败: \(error)")

            }

        }

    }

    func handleDetectionResults(_ results: [Any]?) {

        guard let results = results as? [VNRecognizedTextObservation] else { return }

        // 将所有识别的文本拼接

        var detectedText = ""

        for observation in results {

            if let topCandidate = observation.topCandidates(1).first {

                detectedText += topCandidate.string + "\n"

            }

        }

        // 在主线程更新UI

        DispatchQueue.main.async {

            self.resultTextView.text = detectedText.isEmpty ? "未检测到文本" : detectedText

        }

    }

}

}```

代码解析

UITextView:

用于展示识别到的所有文本。

自动换行和滚动,适合展示较长的文本内容。

VNRecognizeTextRequest:

Vision 的文本识别请求,用于提取图像中的文本内容。

支持多语言:

配置 recognitionLanguages 为 ["en-US", "zh-Hans"] 支持中文和英文混合文本识别。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容