美文网首页
图片文字识别---初级入门篇

图片文字识别---初级入门篇

作者: 捷风 | 来源:发表于2018-03-14 11:22 被阅读175次

    导语

    受到搜狗输入法中文字扫描功能的启发,小编自不量力的进行了一番尝试,虽然达到了一些初步的
    效果,但是优化提升的空间依然很大,所以小编在这里记录一下前的工作与大家分享,也希望能获
    得大家更好的建议,对该功能进行完善。
    

    工作准备

    1、创建项目
    2、打开终端cd进入文件根目录
    3、执行pod init
    4、进入Podfile文件写上pod 'TesseractOCRiOS'
    5、终端在该项目根目录下执行pod install
    6、打开 xcworkspace文件 真机运行后报错

    (ld: -weak_library and -bitcode_bundle (Xcode setting ENABLE_BITCODE=YES)
    cannotbe used together)
    
    解决报错问题.png
    7、在项目中创建文件夹(注意文件夹颜色) tessdata文件夹.png

    8、下载汉化包和英化包,如上图文件夹中所示

    编写代码

    1、引入头文件
    #import <TesseractOCR/TesseractOCR.h>
    2、创建属性
    @property (nonatomic, strong) NSOperationQueue *operationQueue;
    /**菊花*/
    @property (weak, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator;
    /**识别后文字显示*/
    @property (weak, nonatomic) IBOutlet UITextView *contens;
    /**进度条*/
    @property (weak, nonatomic) IBOutlet UILabel *progressLabel;
    3、viewDidLoad中实现
    self.operationQueue = [[NSOperationQueue alloc] init];
    4、定义核心识别方法-(void)recognizeImage:(UIImage *)image;
    
    
    -(void)recognizeImageWithTesseract:(UIImage *)image{
     self.contens.text=@"";
     self.progressLabel.text=@"";
    [self.activityIndicator startAnimating];
        
     //初始化G8Tesseract类,为文字识别做准备
    G8RecognitionOperation *operation = [[G8RecognitionOperation alloc] initWithLa
    nguage:@"eng+chi_sim"];
    operation.tesseract.engineMode = G8OCREngineModeTesseractOnly;
    operation.tesseract.pageSegmentationMode = G8PageSegmentationModeAutoOnly;
    //    operation.tesseract.maximumRecognitionTime = 3.0;//最大识别时间
        operation.delegate = self;
        operation.tesseract.image = [image g8_blackAndWhite];
        operation.tesseract.image = image;
        operation.recognitionCompleteBlock = ^(G8Tesseract *tesseract) {
            NSString *recognizedText = tesseract.recognizedText;
            NSLog(@"%@", recognizedText);
            [self.activityIndicator stopAnimating];
    self.contens.text=[NSString stringWithFormat:@"识别结果:\n%@",recognizedText];
            dispatch_async(dispatch_get_main_queue(), ^{
                self.progressLabel.text=[NSString stringWithFormat:@"进度:100%%"];
            });
    
        };
        [self.operationQueue addOperation:operation];
    }
    
    
    5、实现代理---G8TesseractDelegate
    - (void)progressImageRecognitionForTesseract:(G8Tesseract *)tesseract {
    dispatch_async(dispatch_get_main_queue(), ^{
       self.progressLabel.text=[NSString stringWithFormat:@"进度:%lu%%",
    tesseract.progress];
        });
        NSLog(@"progress: %lu", (unsigned long)tesseract.progress);
    }
    - (BOOL)shouldCancelImageRecognitionForTesseract:(G8Tesseract *)tesseract {
        return NO;
    }
    
    6、调用识别方法传入一个需要被识别的图片(从Xcode本地获取、调用相机、调用本地相册)
    

    个人心得

    一、iOS终端识别功能优缺点:

    优点:不需要联网;
    缺点:1、 识别速度有待提高、2识别文字如果间隔太小会产生乱码;

    二、其他实现方式:

    通过测试发现搜狗输入法是通过前端传入识别图片,后端进行识别处理,这种方案优点是识别速度相对快些、缺点是必须得连接网络(这种方案腾讯和百度都有相关的SDK,但是都是盈利性质的,所以如果公司该功能使用情况比较频繁的话,还是建议自己造一个是最优的选择😆)

    拓展

    由于小编对Python有点皮毛的了解,所以也研究了一下Python图文识别,代码相对比较简单,以下附上最终代码,前期准备工作就不深入说明了,如果有不清楚的欢迎私信!
    from PIL import Image
    import pytesseract
    import datetime
    #打印当前时间
    time_stamp =datetime.datetime.now()
    print(time_stamp.strftime('%Y.%m.%d-%H:%M:%S'))
    
    # text = pytesseract.image_to_string(Image.open('image_one.png'),
    lang='eng+chi_sim')
    text = pytesseract.image_to_string(Image.open('Wechat_Image.jpeg'),
    lang='eng+chi_sim')
    #打印识别后文字
    print(text)
    #打印当前时间
    time_stamp_two =datetime.datetime.now()
    print(time_stamp_two.strftime('%Y.%m.%d-%H:%M:%S'))
    

    总结

    目前实现的效果,与自己的最终目标还相距甚远,如果有这方面经验的大神看到了这篇文章,希望能指点一二,小编不胜感激!🙏🙏🙏

    相关文章

      网友评论

          本文标题:图片文字识别---初级入门篇

          本文链接:https://www.haomeiwen.com/subject/xjnxqftx.html