最近上对从图像里识别出文字比较感兴趣, 用专业点的语言描述就是(OCR光学字符识别窥探)非常牛X的名字, 就想弄一个小玩意来练练(识别身份证上的号码).
网上搜一下这东西的难点, 其实在于识别的准确度, 如果想要很叼的准确率还是给钱用别人的SDK, 这里只是练练手罢了.
OCR光学字符识别窥探简称:OCR, 是通过扫描等光学输入方式将各种票据、报刊、书籍、文稿及其它印刷品的文字转化为图像信息,再利用文字识别技术将图像信息转化为可以使用的计算机输入技术..... 算了这个解释可以看这里:写的非常好: http://www.jianshu.com/p/ac4c4536ca3e
我也是打算使用openVC和TesseractOCR这两个开源框架来完成身份证识别, TesseractOCR来识别图像的文字, openVC来对照片做处理, 今天先将TesseractOCR的简单使用, 先用起来再说.
TesseractOCR是什么, 就是用来识别图像里的文字的- - !.先创建一个xcode工程, 然后在工程里导入TesseractOCR(可以直接在github里下载https://github.com/tesseract-ocr/tesseract, 也可以使用pod来导入: pod 'TesseractOCRiOS', '~> 4.0.0')
-
这里需要注意:因为TesseractOCR这东西是用C++写的所以,你直接运行会报错
1.png
*解决:在工程->TARGETS->Build Setting-> Enable Bitcode设置为NO
-
另外在使用TesseractOCR的时候还要记得导入语言包 下载地址https://github.com/tesseract-ocr/tessdata我的demo里就只有英文的, 一定要放到文件命为tessdata的文件夹中, 拖到工程里的时候, 不要勾选Create groups, 记得拖到工程里的是蓝色文件夹, 不是黄色啊!!!!
现在开始写代码了:导入头文件
#import <TesseractOCR/TesseractOCR.h>
用到了核心类:G8Tesseract 核心代码:
- (void)tesseractRecogniceWithImage:(UIImage *)image compleate:(void(^) (NSString *text))compleate {
G8Tesseract *tesseract = [[G8Tesseract alloc]initWithLanguage:@"eng"];
//模式
tesseract.engineMode = G8OCREngineModeTesseractOnly;
tesseract.maximumRecognitionTime = 10;
tesseract.pageSegmentationMode = G8PageSegmentationModeAuto;
tesseract.image = [image g8_blackAndWhite];
[tesseract recognize];
compleate(tesseract.recognizedText);
}
上面的是TesseractOCR的简单使用, 前面我们只需要通过手机的摄像头来获取一张image就可以了, 需要注意的是在使用手机的摄像头的时候要在info.plist加入Privacy - Camera Usage Description来请求权限:
屏幕快照 2017-03-18 上午11.20.57.png
- 最后要注意的是: 我们通过摄像头获取的image要将image缩放到一定的大小限制, 如果不是可能会崩溃或者识别不出来:写一个image的分来来缩放就好了
- (UIImage *)scaleImageWithImage:(UIImage *)image dimension:(CGFloat)dimension{
CGSize size = CGSizeMake(dimension, dimension);
CGFloat scaleFaclor;
if (image.size.width > image.size.height) {
scaleFaclor = image.size.height / image.size.width;
size.width = dimension;
size.height = scaleFaclor * size.width;
}else{
scaleFaclor = image.size.width / image.size.height;
size.height = dimension;
size.width = scaleFaclor * size.height;
}
UIGraphicsBeginImageContext(size);
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resultImage;
}
这个只是简单的TesseractOCR库使用来识别图像文字, 如果要识别身份证, 还要对图像处理这里就要使用到openVC了, 之后再弄吧! 还有提高识别率的再研究吧!
最后附上demo:<https://github.com/xiaojuye/regonic>
网友评论
还有一个要付费的:http://www.code4app.com/thread-11746-1-1.html