最近上對從圖像里識(shí)別出文字比較感興趣, 用專業(yè)點(diǎn)的語言描述就是(OCR光學(xué)字符識(shí)別窺探)非常牛X的名字, 就想弄一個(gè)小玩意來練練(識(shí)別身份證上的號(hào)碼).
網(wǎng)上搜一下這東西的難點(diǎn), 其實(shí)在于識(shí)別的準(zhǔn)確度, 如果想要很叼的準(zhǔn)確率還是給錢用別人的SDK, 這里只是練練手罷了.
OCR光學(xué)字符識(shí)別窺探簡稱:OCR, 是通過掃描等光學(xué)輸入方式將各種票據(jù)、報(bào)刊、書籍智润、文稿及其它印刷品的文字轉(zhuǎn)化為圖像信息宴树,再利用文字識(shí)別技術(shù)將圖像信息轉(zhuǎn)化為可以使用的計(jì)算機(jī)輸入技術(shù)..... 算了這個(gè)解釋可以看這里:寫的非常好: http://www.reibang.com/p/ac4c4536ca3e
我也是打算使用openVC和TesseractOCR這兩個(gè)開源框架來完成身份證識(shí)別, TesseractOCR來識(shí)別圖像的文字, openVC來對照片做處理, 今天先將TesseractOCR的簡單使用, 先用起來再說.
TesseractOCR是什么, 就是用來識(shí)別圖像里的文字的- - !.先創(chuàng)建一個(gè)xcode工程, 然后在工程里導(dǎo)入TesseractOCR(可以直接在github里下載https://github.com/tesseract-ocr/tesseract, 也可以使用pod來導(dǎo)入: pod 'TesseractOCRiOS', '~> 4.0.0')
-
這里需要注意:因?yàn)門esseractOCR這東西是用C++寫的所以,你直接運(yùn)行會(huì)報(bào)錯(cuò)
1.png
*解決:在工程->TARGETS->Build Setting-> Enable Bitcode設(shè)置為NO
另外在使用TesseractOCR的時(shí)候還要記得導(dǎo)入語言包 下載地址https://github.com/tesseract-ocr/tessdata我的demo里就只有英文的, 一定要放到文件命為tessdata的文件夾中, 拖到工程里的時(shí)候, 不要勾選Create groups, 記得拖到工程里的是藍(lán)色文件夾, 不是黃色啊!!!!
現(xiàn)在開始寫代碼了:導(dǎo)入頭文件
#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的簡單使用, 前面我們只需要通過手機(jī)的攝像頭來獲取一張image就可以了, 需要注意的是在使用手機(jī)的攝像頭的時(shí)候要在info.plist加入Privacy - Camera Usage Description來請求權(quán)限:
- 最后要注意的是: 我們通過攝像頭獲取的image要將image縮放到一定的大小限制, 如果不是可能會(huì)崩潰或者識(shí)別不出來:寫一個(gè)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;
}
這個(gè)只是簡單的TesseractOCR庫使用來識(shí)別圖像文字, 如果要識(shí)別身份證, 還要對圖像處理這里就要使用到openVC了, 之后再弄吧! 還有提高識(shí)別率的再研究吧!
最后附上demo:<https://github.com/xiaojuye/regonic>