Tesseract OCR在iOS和Swift中返回错误或无意义字符

3
我使用这个教程来让Tesseract OCR在Swift中工作:http://www.piterwilson.com/blog/2014/10/18/minimal-tesseact-ocr-setup-in-swift/ 如果我上传演示图片并调用它,它可以很好地工作。
 tesseract.image = UIImage(named: "image_sample.jpg");

但是,如果我使用我的相机代码拍摄同一图像并调用

 tesseract.image = self.image.blackAndWhite();

结果要么是乱码,如下所示:

s I 5E251 :Ec ‘-. —7.//:E*髧 a g :_{:7 IC‘ J 7 iii—1553‘ : fizzle —‘;-—:

; ~:~./: -:-‘-

‘- :~£:': _-'~‘:

: 37%; §:‘—_

: ::::E 7,;. 1f:,:~ ——,

或者返回BAD_EXC_ACCESS错误。我无法复制为什么会出现错误或乱码的原因。这是我的相机捕获代码(photo taken())和处理步骤(nextStepTapped()):

 @IBAction func photoTaken(sender: UIButton) {

    var videoConnection = stillImageOutput.connectionWithMediaType(AVMediaTypeVideo)

    if videoConnection != nil {

        // Show next step button
        self.view.bringSubviewToFront(self.nextStep)
        self.nextStep.hidden = false

        // Secure image
        stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection) {
            (imageDataSampleBuffer, error) -> Void in
                var imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer)

                self.image = UIImage(data: imageData)

                //var dataProvider = CGDataProviderCreateWithCFData(imageData)
                //var cgImageRef = CGImageCreateWithJPEGDataProvider(dataProvider, nil, true, kCGRenderingIntentDefault)
                //self.image = UIImage(CGImage: cgImageRef, scale: 1.0, orientation: UIImageOrientation.Right)

        }

        // Freeze camera preview
        captureSession.stopRunning()

    }

}

@IBAction func nextStepTapped(sender: UIButton) {

    // Save to camera roll & proceeed
    //UIImageWriteToSavedPhotosAlbum(self.image.blackAndWhite(), nil, nil, nil)
    //UIImageWriteToSavedPhotosAlbum(self.image, nil, nil, nil)

    // OCR

    var tesseract:Tesseract = Tesseract();
    tesseract.language = "eng";
    tesseract.delegate = self;
    tesseract.image = self.image.blackAndWhite();
    tesseract.recognize();

    NSLog("%@", tesseract.recognizedText);

}

如果我取消注释的行,则图像将保存到相机胶卷中,并且完全可读。不确定为什么它不起作用。如果将图像直接作为支持文件上传到Xcode,则它可以轻松读取图像上的文本,但是如果我在屏幕上拍摄完全相同的图像,则无法读取它。

1个回答

3

偶然发现了这个教程: http://www.raywenderlich.com/93276/implementing-tesseract-ocr-ios

里面提到了图像缩放。他们选择最大尺寸为640。我拍的照片大小是640x480,所以我认为我不需要对它们进行缩放,但是我发现这段代码实际上重新绘制了图像。由于某种原因,现在我的照片OCR效果相当好。我仍然需要处理小文字的图像,但对于大文字来说,它完美地工作。将我的图像通过这个缩放函数运行,一切就妥当了。

  func scaleImage(image: UIImage, maxDimension: CGFloat) -> UIImage {

   var scaledSize = CGSize(width: maxDimension, height: maxDimension)
   var scaleFactor: CGFloat

   if image.size.width > image.size.height {
      scaleFactor = image.size.height / image.size.width
      scaledSize.width = maxDimension
      scaledSize.height = scaledSize.width * scaleFactor
   } else {
      scaleFactor = image.size.width / image.size.height
      scaledSize.height = maxDimension
      scaledSize.width = scaledSize.height * scaleFactor
   }

   UIGraphicsBeginImageContext(scaledSize)
   image.drawInRect(CGRectMake(0, 0, scaledSize.width, scaledSize.height))
   let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
   UIGraphicsEndImageContext()

 return scaledImage
}

这只是一个侧记。我最近一直在测试OCR应用程序,绝大多数都存在可靠字符识别方面的问题。例如,它们会将“i”解释为“1”,或者存在可怕的间距、漂浮的随机字母、不正确的大写单词等等。到目前为止,我发现的最好的OCR应用程序是“FineScanner”,我怀疑他们正在进行后期处理以清理文本。当然,你的例子中错误数量之多是极端的。 - Lobsterman
最终发现问题出在将图像转换为Tesseract时的错误。使用上述解决方案重新绘制图像使得Tesseract能够识别文本,即使图像内容完全相同。现在获得了相当准确的结果。 - Andrew
still gibberish - Jeff Bootsholz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接