【问题标题】:AVCapture seems to lag, Text recognition doesn't start right awayAVCapture 似乎滞后,文本识别不会立即开始
【发布时间】:2019-04-24 19:52:22
【问题描述】:

我是 Swift 新手,目前正在开发一个包含文本识别的功能。我正在使用 Firebase 的 MLKit 并拥有代码,虽然它不是很复杂(我愿意接受每一个改进我的编码的建议),但几乎已经设置好了。

总之有两件事困扰着我:

  1. 自从我添加了文本识别后,实时提要似乎滞后(大约每秒 1 帧) - 我认为这是由文本识别引起的,以防止过载?如果是这样,如何断开实时取景和处理的帧?
  2. 文本识别似乎在 10 秒后开始。有没有让它立即开始?

CameraViewController:

import UIKit
import AVKit
import Vision
import FirebaseMLVision


class CameraViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {    

    private lazy var vision = Vision.vision()
    private lazy var textRecognizer = vision.onDeviceTextRecognizer()

    override func viewDidLoad() {
        super.viewDidLoad()
        captureSession()
    }

    func captureSession () {
        let captureSession = AVCaptureSession()

        guard let captureDevice = AVCaptureDevice.default(for: .video) else { return }
        guard let input = try? AVCaptureDeviceInput(device: captureDevice) else{ return }
        captureSession.addInput(input)

        captureSession.startRunning()

        let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        view.layer.addSublayer(previewLayer)
        previewLayer.frame = view.frame

        let dataOutput = AVCaptureVideoDataOutput()
        dataOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "videoQueue"))
        captureSession.addOutput(dataOutput)
    }

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


        let metadata = VisionImageMetadata()

        let devicePosition: AVCaptureDevice.Position = .back

        let deviceOrientation = UIDevice.current.orientation

        switch deviceOrientation {
        case .portrait:
            metadata.orientation = devicePosition == .front ? .leftTop : .rightTop
        case .landscapeLeft:
            metadata.orientation = devicePosition == .front ? .bottomLeft : .topLeft
        case .portraitUpsideDown:
            metadata.orientation = devicePosition == .front ? .rightBottom : .leftBottom
        case .landscapeRight:
            metadata.orientation = devicePosition == .front ? .topRight : .bottomRight
        case .faceDown, .faceUp, .unknown:
            metadata.orientation = .leftTop
        }

        let image = VisionImage(buffer: sampleBuffer)
        image.metadata = metadata

        textRecognizer.process(image) { result, error in
            guard error == nil, let result = result else {
                return
            }

            for block in result.blocks {
                for line in block.lines {
                    for element in line.elements {
                        let elementText = element.text
                        print(element.text)
                    }
                }
            }
        }
    }

}

【问题讨论】:

    标签: ios swift avfoundation firebase-mlkit


    【解决方案1】:

    您需要更新您的 AVCaptureVideoDataOutput

    output.alwaysDiscardsLateVideoFrames = true
    

    https://github.com/googlecodelabs/mlkit-ios/blob/master/translate/TranslateDemo/CameraViewController.swift#L307

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多