Как обнаружить определенный текст с помощью камеры с помощью Google OCR Api в Swift? - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь распознать конкретный текст из любой формы документа. Есть ли какая-либо базовая линия, чтобы я мог определить ROI формы и распознать конкретный текст, доступный с помощью Google OCR Api?

Например, я хочу определить адрес только из формы. Я закончил с отображением окна на экране и добавлением текста в пределах границ окна. Но я хочу распознать конкретный текст без добавления рамки на экране.

захват изображения

func setupAVCapture(){
        session.sessionPreset = AVCaptureSession.Preset.vga640x480
        guard let device = AVCaptureDevice
            .default(AVCaptureDevice.DeviceType.builtInWideAngleCamera,
                     for: .video,
                     position: AVCaptureDevice.Position.back) else {
                        return
        }

        captureDevice = device
        self.beginSession()

    }

Начало сеанса

func beginSession(){
        var deviceInput: AVCaptureDeviceInput!

        do {
            deviceInput = try AVCaptureDeviceInput(device: captureDevice)
            guard deviceInput != nil else {
                print("error: cant get deviceInput")
                return
            }

            if self.session.canAddInput(deviceInput){
                self.session.addInput(deviceInput)
            }

            videoDataOutput = AVCaptureVideoDataOutput()
            videoDataOutput.alwaysDiscardsLateVideoFrames = true
            videoDataOutputQueue = DispatchQueue(label: "VideoDataOutputQueue")
            videoDataOutput.setSampleBufferDelegate(self, queue:self.videoDataOutputQueue)
            if session.canAddOutput(self.videoDataOutput){
                session.addOutput(self.videoDataOutput)
            }

            videoDataOutput.connection(with: .video)?.isEnabled = true

            previewLayer = AVCaptureVideoPreviewLayer(session: self.session)
            previewLayer.videoGravity = AVLayerVideoGravity.resize
            let rootLayer :CALayer = self.previewView.layer
            rootLayer.masksToBounds=true
            previewLayer.frame = rootLayer.bounds
            rootLayer.addSublayer(self.previewLayer)
            session.startRunning()

        } catch let error as NSError {
            deviceInput = nil
            print("error: \(error.localizedDescription)")
        }
    }

 func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    count = count + 1

    print(self.count, "count")
    self.output(imageOutput: output)
    if count % 10 == 0 {
    let imageBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
    self.ciimage = CIImage(cvPixelBuffer: imageBuffer)
    // do stuff here

        self.image = self.convert(cmage: self.ciimage!)
        let corpImage = cropToPreviewLayer(originalImage: self.image!)
        self.runTextRecognition(with: corpImage)
    }
}

конвертировать ciimage в uiimage

func convert(cmage:CIImage) -> UIImage
{
    let context:CIContext = CIContext.init(options: nil)
    let cgImage:CGImage = context.createCGImage(cmage, from: cmage.extent)!
    let image:UIImage = UIImage.init(cgImage: cgImage)
    return image
}

изображение кадрирования

private func cropToPreviewLayer(originalImage: UIImage) -> UIImage {
    let outputRect = previewLayer.metadataOutputRectConverted(fromLayerRect: previewLayer.bounds)
    var cgImage = originalImage.cgImage!
    let width = CGFloat(cgImage.width)
    let height = CGFloat(cgImage.height)

    previewBoxView = UIView(frame: CGRect(x:outputRect.origin.x * width + 30, y:outputRect.origin.y * height + 100, width:outputRect.size.width * width - (UIScreen.main.bounds.size.width - 60), height: outputRect.size.height * height - 600))
    previewBoxView.layer.borderWidth = 5
    previewBoxView.layer.borderColor = UIColor.white.cgColor
    previewBoxView.clipsToBounds = true
    previewBoxView.layer.cornerRadius = 5

    view.addSubview(previewBoxView)

    let cropRect = CGRect(x: outputRect.origin.x * width + 30 , y: outputRect.origin.y * height + 100, width: outputRect.size.width * width - (UIScreen.main.bounds.size.width - 60), height: outputRect.size.height * height - 400)

    cgImage = cgImage.cropping(to: cropRect)!
    let croppedUIImage = UIImage(cgImage: cgImage, scale: 1.0, orientation: originalImage.imageOrientation)

    return croppedUIImage
}

Для распознавания текста

func runTextRecognition(with image: UIImage) {
        let visionImage = VisionImage(image: image)
        textRecognizer?.process(visionImage){ result, error in

            guard error == nil, let result = result else {

                return
            }
            self.resultICR = result.text
            print(result.text, result.blocks,"===================")
            if self.resultICR != ""{
                self.textViewRecognizor.text = self.resultICR
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...