Tesseract OCR w/ iOS & Swift returns 错误或乱码
Tesseract OCR w/ iOS & Swift returns error or gibberish
我使用本教程让 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*髧
g :_{:7 IC‘
J 7 iii—1553‘
: 失败——‘;-——:
; ~:~./: -:-‘-
‘-:~£:':_-'~‘:
:37%; §:‘—_
: ::::E 7,;.
1f:,:~ ——,
或者 returns 一个 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,读取图片上的文字没有问题,但如果我在屏幕上拍摄完全相同的图片,则无法读取。
偶然发现本教程: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
}
我使用本教程让 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*髧 g :_{:7 IC‘ J 7 iii—1553‘ : 失败——‘;-——:
; ~:~./: -:-‘-
‘-:~£:':_-'~‘:
:37%; §:‘—_
: ::::E 7,;. 1f:,:~ ——,
或者 returns 一个 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,读取图片上的文字没有问题,但如果我在屏幕上拍摄完全相同的图片,则无法读取。
偶然发现本教程: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
}