美文网首页
使用vision框架实现OCR识别功能

使用vision框架实现OCR识别功能

作者: CocoaJason | 来源:发表于2021-09-03 15:25 被阅读0次

import UIKit
import Vision
import VisionKit

class TextRecoViewController: UIViewController {
    lazy var resultLabel: UILabel = {
        var resultLabel = UILabel()
        resultLabel.frame = CGRect(x: 10, y: 500, width: 200, height: 500)
        resultLabel.text = "结果"
        resultLabel.numberOfLines = 0
        return resultLabel
    }()
    
    lazy var imageView: UIImageView = {
        var imageView = UIImageView(image: UIImage(named: "AAAAA"))
        imageView.frame = CGRect(x: 10, y: 0, width: 350, height: 500)
        imageView.isUserInteractionEnabled = true
        imageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTapGes(tap:))))
        return imageView
    }()
    
    lazy var scrollView : UIScrollView = {
        let scrollView = UIScrollView(frame: self.view.bounds)
        scrollView.contentSize = CGSize(width: view.frame.width, height: 1200)
        return scrollView
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Do any additional setup after loading the view.
        
        title = "文本识别"
        view.backgroundColor = .white
        
        view.addSubview(scrollView)
        scrollView.addSubview(imageView)
        scrollView.addSubview(resultLabel)
        
        findText()
    }
    
    @objc func handleTapGes(tap: UITapGestureRecognizer) {
        let pic = UIImagePickerController()
        pic.delegate = self
        present(pic, animated: true) {}
    }
    
    func findText() {
        DispatchQueue.global().async {
            var textLayers: [CAShapeLayer] = []
            let textDetectionRequest = VNRecognizeTextRequest { request, _ in
                guard let observations = request.results as? [VNRecognizedTextObservation] else {
                    print("Error")
                    return
                }
                
                DispatchQueue.main.async {
                    // 把识别的文字全部连成一个string
                    let maximumCandidates = 1
                    var resultingText = ""
                    for observation in observations {
                        let candidates = observation.topCandidates(maximumCandidates)
                        for candidate in candidates {
                            resultingText += candidate.string + "\n"
                            print(candidate.string)
                        }
                    }
                    self.resultLabel.text = resultingText
                    
                    textLayers = self.addShapeToText(forObservations: observations, withImageView: self.imageView)
                    
                    for layer in textLayers {
                        self.imageView.layer.addSublayer(layer)
                    }
                }
            }
            
            textDetectionRequest.recognitionLanguages = ["zh-cn"]
            textDetectionRequest.recognitionLevel = .accurate
            textDetectionRequest.revision = VNRecognizeTextRequestRevision2
            
            DispatchQueue.main.async {
                self.imageView.layer.sublayers?.forEach { layer in
                    layer.removeFromSuperlayer()
                }
                
                if let image = self.imageView.image,
                   let cgImage = image.cgImage
                {
                    let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
                    
                    guard let _ = try? handler.perform([textDetectionRequest]) else {
                        return print("Could not perform text Detection Request!")
                    }
                }
            }
            
            
        }
    }
    
    func addShapeToText(forObservations observations: [VNRecognizedTextObservation],
                        withImageView textImageView: UIImageView) -> [CAShapeLayer]
    {
        // map 筛选里面的结构
        let layers: [CAShapeLayer] = observations.map { observation in
            
            let w = observation.boundingBox.size.width * textImageView.bounds.width
            let h = observation.boundingBox.size.height * textImageView.bounds.height
            let x = observation.boundingBox.origin.x * textImageView.bounds.width
            let y = abs((observation.boundingBox.origin.y * (textImageView.bounds.height)) - textImageView.bounds.height) - h
            
            let layer = CAShapeLayer()
            layer.frame = CGRect(x: x, y: y, width: w, height: h)
            layer.borderColor = UIColor.green.cgColor
            layer.borderWidth = 2
            layer.cornerRadius = 3
            
            return layer
        }
        return layers
    }
    
    /*
     // MARK: - Navigation
     
     // In a storyboard-based application, you will often want to do a little preparation before navigation
     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
     // Get the new view controller using segue.destination.
     // Pass the selected object to the new view controller.
     }
     */
}

extension TextRecoViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
        picker.dismiss(animated: true) {}
        guard let pic = info[.originalImage] else {
            print("没图片")
            return
        }
        imageView.image = pic as? UIImage
        findText()
    }
    
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true) {}
    }
}

Screen Shot 2021-09-03 at 15.24.46.png

相关文章

网友评论

      本文标题:使用vision框架实现OCR识别功能

      本文链接:https://www.haomeiwen.com/subject/gtskwltx.html