Я пытаюсь распознать конкретный текст из любой формы документа. Есть ли какая-либо базовая линия, чтобы я мог определить 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
}
}
}