【发布时间】:2019-04-24 19:52:22
【问题描述】:
我是 Swift 新手,目前正在开发一个包含文本识别的功能。我正在使用 Firebase 的 MLKit 并拥有代码,虽然它不是很复杂(我愿意接受每一个改进我的编码的建议),但几乎已经设置好了。
总之有两件事困扰着我:
- 自从我添加了文本识别后,实时提要似乎滞后(大约每秒 1 帧) - 我认为这是由文本识别引起的,以防止过载?如果是这样,如何断开实时取景和处理的帧?
- 文本识别似乎在 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