OCR(光学字符识别)的简单解析与使用(内含 Demo)
2015-12-23 17:18
393 查看
公司前些日子准备在项目中使用 光学字符识别技术,
(也就是我们经常听说的,你拿着相机,照一下,之后就能直接显示图片中的文字是什么)
之后我在 GIT 上找了一个歪果友仁的 Demo, 对他的项目进行简单地解析,以此来帮助其他小伙伴,简单的了解一下.
![](http://img.blog.csdn.net/20151223181827155?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
Demo: https://github.com/hatena-iti/tesseract-sample
注意: 下面开启唐僧模式,对 OCR 已经有一定了解或只是想使用的同学可以直接跳到代码部分..
首先来介绍一下 OCR 到底是什么.
OCR是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,
通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程.
其中 通过检测暗、亮的模式确定其形状 在我们的开发中,就涉及到图片的二值化等一系列操作,设计
OPEN_CV或 OPEN_GL等.
ps:图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果.
例如这样:
![](http://img.blog.csdn.net/20151223172944946?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
而经过二值化处理的图片,
![](http://img.blog.csdn.net/20151223173009579?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
是不是觉得很像复印的照片呢.233...
了解了图片的基本原理,接下来就到了介绍工具的部分.
我们程序中最重要的第三方库 TesseractOCR.framework
工具下载地址:
TesseractOCR.framework: https://github.com/gali8/Tesseract-OCR-iOS
它的代理方法如下
我们在使用当中需要传递给 TesseractOCR 我们需要解析的语言,我们需要解析的图片,并告诉程序,我们是否承认.
需要注意的是,TesseractOCR默认支持英文和数字,毕竟人家才26个字母外加0-9这几个数字,
如果需要识别额外的语言,则需要在 tessdata 文件下 添加对应的语言包.
磨叽了一大堆,下面开始代码部分..
首先在 StroyBoard 中 创建我们需要的图像展示区和文字展示区.
![](http://img.blog.csdn.net/20151223174617272?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
之后将其拉入 ViewController.h 中 作为属性.
之后在.m 文件中,也同样创建属性方便我们之后的使用.
同时再去声明一个属性
之后
至此前期准备工作已经结束.
接下来到程序的运行阶段.
记得
之后重头戏来了,首先我们需要对我们的图片进行简单的处理,加强黑白色的对比,以此增强我们文字的轮廓的清晰度,
文字的清晰度对文字的检测的成功率有很大的影响.
对图片进行了简单的处理之后,我们就将我们处理之后的图片传入我们的第三方库.并将识别出的文字返回,展示给我们.
代理方法可以展示我们对当前图片的解析程度达到了多少.
代理方法(可用作展示解析程度).
最后效果:
![](http://img.blog.csdn.net/20151223181441419?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
完结撒花!~
更多精彩文章,尽在我的公众号.
(也就是我们经常听说的,你拿着相机,照一下,之后就能直接显示图片中的文字是什么)
之后我在 GIT 上找了一个歪果友仁的 Demo, 对他的项目进行简单地解析,以此来帮助其他小伙伴,简单的了解一下.
Demo: https://github.com/hatena-iti/tesseract-sample
注意: 下面开启唐僧模式,对 OCR 已经有一定了解或只是想使用的同学可以直接跳到代码部分..
首先来介绍一下 OCR 到底是什么.
OCR是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,
通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程.
其中 通过检测暗、亮的模式确定其形状 在我们的开发中,就涉及到图片的二值化等一系列操作,设计
OPEN_CV或 OPEN_GL等.
ps:图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果.
例如这样:
而经过二值化处理的图片,
是不是觉得很像复印的照片呢.233...
了解了图片的基本原理,接下来就到了介绍工具的部分.
我们程序中最重要的第三方库 TesseractOCR.framework
工具下载地址:
TesseractOCR.framework: https://github.com/gali8/Tesseract-OCR-iOS
<span style="font-size:18px;">@interface Tesseract : NSObject + (NSString *)version; @property (nonatomic, strong) NSString* language; @property (nonatomic, strong) UIImage *image; @property (nonatomic, assign) CGRect rect; @property (nonatomic, readonly) short progress; // from 0 to 100 @property (nonatomic, readonly) NSString *recognizedText; @property (nonatomic, weak) id<TesseractDelegate> delegate;</span>
它的代理方法如下
<span style="font-size:18px;">- (id)initWithDataPath:(NSString *)dataPath language:(NSString *)language DEPRECATED_ATTRIBUTE; - (id)initWithLanguage:(NSString*)language; - (void)setVariableValue:(NSString *)value forKey:(NSString *)key; - (BOOL)recognize; - (void)clear DEPRECATED_ATTRIBUTE;</span>
我们在使用当中需要传递给 TesseractOCR 我们需要解析的语言,我们需要解析的图片,并告诉程序,我们是否承认.
需要注意的是,TesseractOCR默认支持英文和数字,毕竟人家才26个字母外加0-9这几个数字,
如果需要识别额外的语言,则需要在 tessdata 文件下 添加对应的语言包.
磨叽了一大堆,下面开始代码部分..
首先在 StroyBoard 中 创建我们需要的图像展示区和文字展示区.
之后将其拉入 ViewController.h 中 作为属性.
<span style="font-size:18px;">#import <UIKit/UIKit.h> #import <TesseractOCR/TesseractOCR.h> @interface ViewController : UIViewController<TesseractDelegate> @property (nonatomic, strong) IBOutlet UIImageView *imageView; @property (nonatomic, strong) IBOutlet UILabel *label; @end</span>
之后在.m 文件中,也同样创建属性方便我们之后的使用.
<span style="font-size:18px;">// kImageFileName の値を @"ocr-sample-japanese"(日本語文字サンプル)に指定した場合は、 // kLanguage の値を @"jpn" に指定します。 // kImageFileName == @"ocr-sample-english" の場合は、kLanguage = @"eng" とします。) //static NSString * const kImageFileName = @"ocr-sample-japanese"; // 日本語文字サンプル //static NSString * const kImageFileName = @"ocr-sample-english"; // 英数字サンプル static NSString * const kImageFileName = @"ocr-sample-chinese"; // 汉文サンプル //static NSString * const kLanguage = @"jpn"; <span style="white-space:pre"> </span> // 解析対象言語:日本語 //static NSString * const kLanguage = @"eng"; <span style="white-space:pre"> </span> // 解析対象言語:英語 static NSString * const kLanguage = @"chi_sim"; <span style="white-space:pre"> </span> // 解析対象言語:中文</span>
同时再去声明一个属性
<span style="font-size:18px;">@implementation ViewController { // 文字解析用に加工したイメージデータを保持するフィールド UIImage *adjustedImage_; }</span>
之后
<span style="font-size:18px;">//@synthesize是在m文件中定义setter和getter方法的实现 @synthesize imageView=imageView_; @synthesize label=label_;</span>
至此前期准备工作已经结束.
接下来到程序的运行阶段.
<span style="font-size:18px;">- (void)viewDidLoad { [super viewDidLoad]; // 文字解析対象の画像を表示する self.imageView.image = [UIImage imageNamed:kImageFileName]; // 文字解析を実行する [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; [self analyze]; }</span>
记得
<span style="font-size:18px;">- (void)dealloc { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; }</span>
之后重头戏来了,首先我们需要对我们的图片进行简单的处理,加强黑白色的对比,以此增强我们文字的轮廓的清晰度,
文字的清晰度对文字的检测的成功率有很大的影响.
对图片进行了简单的处理之后,我们就将我们处理之后的图片传入我们的第三方库.并将识别出的文字返回,展示给我们.
代理方法可以展示我们对当前图片的解析程度达到了多少.
<span style="font-size:18px;">// 文字解析を実行する - (void)analyze { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ CIImage *ciImage = [[CIImage alloc] initWithImage:self.imageView.image]; //文字を読みやすくするため、白黒にして、コントラストを強めに、また輪郭をくっきりさせるよう設定する CIFilter *ciFilter = [CIFilter filterWithName:@"CIColorMonochrome" keysAndValues:kCIInputImageKey, ciImage, @"inputColor", [CIColor colorWithRed:0.75 green:0.75 blue:0.75], @"inputIntensity", [NSNumber numberWithFloat:1.0], nil]; ciFilter = [CIFilter filterWithName:@"CIColorControls" keysAndValues:kCIInputImageKey, [ciFilter outputImage], @"inputSaturation", [NSNumber numberWithFloat:0.0], @"inputBrightness", [NSNumber numberWithFloat:-1.0], @"inputContrast", [NSNumber numberWithFloat:4.0], nil]; ciFilter = [CIFilter filterWithName:@"CIUnsharpMask" keysAndValues:kCIInputImageKey, [ciFilter outputImage], @"inputRadius", [NSNumber numberWithFloat:2.5], @"inputIntensity", [NSNumber numberWithFloat:0.5], nil]; CIContext *ciContext = [CIContext contextWithOptions:nil]; CGImageRef cgImage = [ciContext createCGImage:[ciFilter outputImage] fromRect:[[ciFilter outputImage] extent]]; // 文字解析対象の画像の色、コントラストを調整したものを変数に保存する UIImage *adjustedImage = [UIImage imageWithCGImage:cgImage]; CGImageRelease(cgImage); //---------------------------------------------------------------------------------------------- Tesseract* tesseract = [[Tesseract alloc] initWithLanguage:kLanguage]; tesseract.delegate = self; [tesseract setImage:adjustedImage]; //image to check [tesseract recognize]; NSString *recognizedText = [tesseract recognizedText]; tesseract = nil; //deallocate and free all memory dispatch_async(dispatch_get_main_queue(), ^{ // 解析結果を画面に表示する self.label.text = recognizedText; NSLog(@"\n\n%@",recognizedText); [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; }); }); } </span>
代理方法(可用作展示解析程度).
<span style="font-size:18px;">#pragma mark - TesseractDelegate methods - (BOOL)shouldCancelImageRecognitionForTesseract:(Tesseract*)tesseract { NSLog(@"progress: %d", tesseract.progress); return NO; // return YES, if you need to interrupt tesseract before it finishes }</span>
最后效果:
完结撒花!~
更多精彩文章,尽在我的公众号.
相关文章推荐
- 批处理、分时、实时、网络、分布式操作系统的区别
- android渐变动画的两种实现
- spatialhadoop2.3源码阅读(十三) RTreeGridOutputFormat & RTreeGridRecordWriter & RTree[RTree Index MapReuce]
- (原)使用opencv的warpAffine函数对图像进行旋转
- Binary Tree Paths return all root-to-leaf paths.
- lua-function
- setdiff--求两个集合的差
- JavaScript基础——html5脚本编程
- 图的广度优先遍历算法
- 零基础入门学习Python(18):对象(3)继承
- db2版本
- appdelegate 数据库
- 3D编程知识
- STM32的I0口翻转速率
- form loadRecord对radiogroup无效
- jetty的安装,优化
- 圈子科技:李帅应邀出席分享通信河南分公司开业典礼
- Java jsp MasterPages实现母版页,实现统一风格的页面布局
- ismember--检测集合中的元素
- HBase 常用Shell命令