Я новичок в Swift и в настоящее время работаю над функцией, которая включает в себя распознавание текста. Я использую MLKit от Firebase и у меня есть код, хотя он не очень сложный (я открыт для каждого предложения по улучшению моего кодирования), в значительной степени настроен.
В любом случае меня беспокоит две вещи:
- Поскольку я добавил распознавание текста, кажется, что прямая трансляция задерживается (примерно 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)
}
}
}
}
}
}