iOS身份证号码识别

作者: peaktan | 来源:发表于2016-08-31 22:31 被阅读21643次

最近不少简友说git上下载下来的代码报各种问题,因为包含的库都比较大,所以大家在pod的时候耐心等待,另外我已经将代码适配到了iOS10。

一、前言

身份证识别,又称OCR技术。OCR技术是光学字符识别的缩写,是通过扫描等光学输入方式将各种票据、报刊、书籍、文稿及其它印刷品的文字转化为图像信息,再利用文字识别技术将图像信息转化为可以使用的计算机输入技术。

因为项目需要,所以这些天查阅了相关资料,想在网上看看有没有大神封装的现成的demo可以用。但是无果,网上关于ocr这一块的资料很少,比较靠谱的都是要收费的,而且价格也不便宜。但是在天朝,收费感觉心里不爽,所以就决定自己研究一番。

先上一个最终实现的效果(如果mac不是retain屏幕的,分辨率会有影响,需要在真机上调试)

最终实现的效果.gif

二、需要用到的技术

搜了很多资料,发现要进行身份证号码的识别,需要用到以下几种技术:

  • 图像处理技术

包括灰度化处理,二值化,腐蚀,轮廊检测等等。

  1. 灰度化处理:图片灰度化处理就是将指定图片每个像素点的RGB三个分量通过一定的算法计算出该像素点的灰度值,使图像只含亮度而不含色彩信息。
    灰度图.png
  2. 二值化:二值化处理就是将经过灰度化处理的图片转换为只包含黑色和白色两种颜色的图像,他们之间没有其他灰度的变化。在二值图中用255便是白色,0表示黑色。
    二值图.png
  3. 腐蚀:图片的腐蚀就是将得到的二值图中的黑色块进行放大。即连接图片中相邻黑色像素点的元素。通过腐蚀可以把身份证上的身份证号码连接在一起形成一个矩形区域。
    腐蚀图.png
  4. 轮廊检测:图片经过腐蚀操作后相邻点会连接在一起形成一个大的区域,这个时候通过轮廊检测就可以把每个大的区域找出来,这样就可以定位到身份证上面号码的区域。
    轮廊图.png
  • 文字识别技术

通过识别图像,将图像信息转化为可以使用的计算机输入技术。比如下面这张包含一串数字的图片,通过ocr识别技术可以将图片中包含的数字信息以字符串的方式输出。

包含数字的图片.png

三、开源框架OpenCV和TesseractOCRiOS

  • OpenCV(完成图像处理技术)

OpenCV是一个开源的跨平台计算机视觉和机器学习库,通俗点的说,就是他给计算机提供了一双眼睛,一双可以从图片中获取信息的眼镜,从而完成人脸识别、身份证识别、去红眼、追踪移动物体等等的图像相关的功能。opencv官网

  • TesseractOCRiOS(完成文字识别技术)

Tesseract是目前可用的最准确的开源OCR引擎,可以读取各种格式的图片并将他们转换成各种语言文本。而TesseractOCRiOS则是针对iOS平台封装的Tesseract引擎库。

四、实战演示

  • 创建一个iOS项目
  • 用CocoPods导入上面两个库

由于OpenCV库文件比较大,所以时间会稍微久一点,耐心等待就是。

podfile文件.png
  • 导入完成之后运行项目,会发现报如下错误
Bitode报错.png

由于导入的库不支持Bitcode机制,需要关掉,在工程->TARGETS->Build Setting-> Enable Bitcode设置为NO就ok。

关掉Bitcode.png
  • 导入TesseractOCRiOS需要的语言包

TesseractOCRiOS库中没有自带的语言包,需要我们自己手动导入,我们这里直接到tesseract-ocr网站,tessdata即是我们需要用到的语言包。下载下来的语言包有400多兆。这里我们只需要用到英语语言包,所以就只导入eng.traineddata就ok,其他的都删掉。

导入语言包种需要注意几点:

  1. 语言包需要放在tessdata目录下。TesseractOCRiOS中查找语言包是在tessdata目录下进行查找的,所以我们不能单独把eng.traineddata导入项目中,而需要放在tessdata目录下导入项目中。
  2. 将tessdata导入xcode项目,需要勾选Create folder refrences。上面已经提到了语言包需要放在tessdata目录下,所以导入文件到xcode的时候需要创建文件夹的形式,而不是创建组的形式。如下图:
导入tessdata文件夹的方式.png
  • 创建一个RecogizeCardManager用来管理身份证识别相关的代码。

由于OpenCV和TesseractOCRiOS库都是基于c++编写的,所以需要把RecogizeCardManager.m后缀的.m改成.mm

RecogizeCardManager.png
  • RecogizeCardManager中的代码
.h文件
#import <Foundation/Foundation.h>
@class UIImage;

typedef void (^CompleateBlock)(NSString *text);

@interface RecogizeCardManager : NSObject
  
/**
*  初始化一个单例
*
*  @return 返回一个RecogizeCardManager的实例对象
*/
+ (instancetype)recognizeCardManager;

/**
*  根据身份证照片得到身份证号码
*
*  @param cardImage 传入的身份证照片
*  @param compleate 识别完成后的回调
*/
- (void)recognizeCardWithImage:(UIImage *)cardImage compleate:(CompleateBlock)compleate;

@end 
.m文件
#import "RecogizeCardManager.h"
#import <opencv2/opencv.hpp>
#import <opencv2/imgproc/types_c.h>
#import <opencv2/imgcodecs/ios.h>
#import <TesseractOCR/TesseractOCR.h>

@implementation RecogizeCardManager

+ (instancetype)recognizeCardManager {
    static RecogizeCardManager *recognizeCardManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        recognizeCardManager = [[RecogizeCardManager alloc] init];
    });
    return recognizeCardManager;
}

- (void)recognizeCardWithImage:(UIImage *)cardImage compleate:(CompleateBlock)compleate {
    //扫描身份证图片,并进行预处理,定位号码区域图片并返回
    UIImage *numberImage = [self opencvScanCard:cardImage];
    if (numberImage == nil) {
        compleate(nil);
    }
    //利用TesseractOCR识别文字
    [self tesseractRecognizeImage:numberImage compleate:^(NSString *numbaerText) {
        compleate(numbaerText);
    }];
}

//扫描身份证图片,并进行预处理,定位号码区域图片并返回
- (UIImage *)opencvScanCard:(UIImage *)image {
    
    //将UIImage转换成Mat
    cv::Mat resultImage;
    UIImageToMat(image, resultImage);
    //转为灰度图
    cvtColor(resultImage, resultImage, cv::COLOR_BGR2GRAY);
    //利用阈值二值化 
    cv::threshold(resultImage, resultImage, 100, 255, CV_THRESH_BINARY);
    //腐蚀,填充(腐蚀是让黑色点变大)
    cv::Mat erodeElement = getStructuringElement(cv::MORPH_RECT, cv::Size(26,26));
    cv::erode(resultImage, resultImage, erodeElement);
    //轮廊检测 
    std::vector<std::vector<cv::Point>> contours;//定义一个容器来存储所有检测到的轮廊
    cv::findContours(resultImage, contours, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));
    //取出身份证号码区域
    std::vector<cv::Rect> rects;
    cv::Rect numberRect = cv::Rect(0,0,0,0);
    std::vector<std::vector<cv::Point>>::const_iterator itContours = contours.begin();
    for ( ; itContours != contours.end(); ++itContours) {
        cv::Rect rect = cv::boundingRect(*itContours);
        rects.push_back(rect);
        //算法原理
        if (rect.width > numberRect.width && rect.width > rect.height * 5) {
            numberRect = rect;
        }
    }    
    //身份证号码定位失败
    if (numberRect.width == 0 || numberRect.height == 0) {
        return nil;
    }
    //定位成功成功,去原图截取身份证号码区域,并转换成灰度图、进行二值化处理
    cv::Mat matImage;
    UIImageToMat(image, matImage);
    resultImage = matImage(numberRect);
    cvtColor(resultImage, resultImage, cv::COLOR_BGR2GRAY);
    cv::threshold(resultImage, resultImage, 80, 255, CV_THRESH_BINARY);
    //将Mat转换成UIImage
    UIImage *numberImage = MatToUIImage(resultImage);
    return numberImage;
}

//利用TesseractOCR识别文字
- (void)tesseractRecognizeImage:(UIImage *)image compleate:(CompleateBlock)compleate {
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        G8Tesseract *tesseract = [[G8Tesseract alloc] initWithLanguage:@"eng"];
        tesseract.image = [image g8_blackAndWhite];
        tesseract.image = image;
        // Start the recognition
        [tesseract recognize];
        //执行回调
        compleate(tesseract.recognizedText);
    });
}
  • RecognizeCardViewController代码
故事版布局界面
故事版布局界面.png
.m文件
#import "RecognizeCardViewController.h"
#import "RecogizeCardManager.h"

@interface RecognizeCardViewController ()<UINavigationControllerDelegate, UIImagePickerControllerDelegate>{
    UIImagePickerController *imgagePickController;
}

@property (weak, nonatomic) IBOutlet UIImageView *imgView;
@property (weak, nonatomic) IBOutlet UILabel *textLabel;
- (IBAction)cameraAction:(id)sender;
- (IBAction)photoAction:(id)sender;

@end

@implementation RecognizeCardViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.imgView.contentMode = UIViewContentModeScaleAspectFit;
    
    imgagePickController = [[UIImagePickerController alloc] init];
    imgagePickController.delegate = self;
    imgagePickController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    imgagePickController.allowsEditing = YES;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

//拍照
- (IBAction)cameraAction:(id)sender {
    
    //判断是否可以打开照相机
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        imgagePickController.sourceType = UIImagePickerControllerSourceTypeCamera;
        //设置摄像头模式(拍照,录制视频)为拍照
        imgagePickController.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
        [self presentViewController:imgagePickController animated:YES completion:nil];
    } else {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"设备不能打开相机" delegate:self cancelButtonTitle:@"知道了" otherButtonTitles: nil];
        [alert show];
    }
}

//相册
- (IBAction)photoAction:(id)sender {
    imgagePickController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    [self presentViewController:imgagePickController animated:YES completion:nil];
}

#pragma mark - UIImagePickerControllerDelegate
//适用获取所有媒体资源,只需判断资源类型
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
    NSString *mediaType=[info objectForKey:UIImagePickerControllerMediaType];
    UIImage *srcImage = nil;
    //判断资源类型
    if ([mediaType isEqualToString:@"public.image"]){
        srcImage = info[UIImagePickerControllerEditedImage];
        self.imgView.image = srcImage;
        //识别身份证
        self.textLabel.text = @"图片插入成功,正在识别中...";
        [[RecogizeCardManager recognizeCardManager] recognizeCardWithImage:srcImage compleate:^(NSString *text) {
            if (text != nil) {
                self.textLabel.text = [NSString stringWithFormat:@"识别结果:%@",text];
            }else {
                self.textLabel.text = @"请选择照片";
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"照片识别失败,请选择清晰、没有复杂背景的身份证照片重试!" delegate:self cancelButtonTitle:@"知道了" otherButtonTitles: nil];
                [alert show];
            }
        }];
    }
    [self dismissViewControllerAnimated:YES completion:nil];
}

//进入拍摄页面点击取消按钮
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [self dismissViewControllerAnimated:YES completion:nil];
}

@end

总结

通过上面的实验,该程序对身份证识别的正确率几乎可以达到90%,剩下的10%主要取决于图像的预处理,预处理程序是整个识别系统的关键所在。该系统的原理同样也适用于获取身份证上其他的信息,也可以应用于银行卡、车牌号等的识别。最后针对实现的效果进行一步总结。

  • 识别的正确率

主要取决于腐蚀、取出身份证号码区域(轮廊提取)的算法这几个关键点。

  1. 腐蚀: 腐蚀的参数很重要,关于腐蚀的一些介绍,可以参考这篇文章 腐蚀与膨胀(Eroding and Dilating)
  2. 取出身份证号码区域的算法(轮廊提取): 所有的处理都是为了在图片中定位到身份证号码的区域,轮廊提取就是这样一个操作。筛选轮廊图的算法很重要但是也是个难点。我从这篇博客iOS身份证号码识别中找到了思路。要提取身份证号码区域的轮廊,算法的原理就是该轮廊的宽度是所有中最宽的,且宽度的长度必须大于高度的5倍。
    不过这个算法还是存在不少问题。有的时候可能图片背景比较复杂会影响到轮廊的检测,基于这个问题:
  • 一方面可以通过对图片的预处理来进行优化,减少对检测身份证号码区域的干扰
  • 第二个方面就是优化算法。
  • 识别速度

使用TesseractOCRiOS对比较清晰的文字进行识别速度是比较快的,我试过用一张未经处理的写着数字的图片来处理,识别速度小于5s。但经过二值图处理之后识别的速度就降低了,我认为可以对二值化处理后的图片进一步处理,比如对二值图进行细化描出骨架,然后在对骨架做均匀的膨胀处理,这样得到的身份证号码可能会清晰很多。

这里贴上几个关于OpenCV的学习网站
OpenCV官方学习文档
OpenCV入门指南
OPEN CV for iOS

该项目已经开源在github RecognizeCard 上了,如果喜欢可以点个赞。有什么问题可以留言,我也是第一次接触,一起进步,大家加油。

相关文章

网友评论

  • f32091ba3cb1:根本识别不了啊
  • f32091ba3cb1:就我识别不了么》》?????
  • a26a820711da:G8Tesseract *tesseract = [[G8Tesseract alloc] initWithLanguage:@"eng"];这行代码崩溃
  • pinglife:车牌号识别的怎么做啊?
  • i路人甲:哥们是楚雄的
  • Janine_:学习学习:+1:
  • 来自南方的熊:楼主,你是云南的?
    来自南方的熊:@wythetan 我以为是老乡呢
    peaktan:不是,这是百度上找的图片:smile:
  • Superyang超:收下了,写得不错,相信以后肯定会有用!
  • 840645c448c0:楼主,如果是黑色底,白色字,这种情况,怎么调这个灰度图呀,研究了好久,还是搞不出来
  • DestinyFighter_:那些 pod install 不了的, Podfile 改成这样就行了:

    platform :ios, “8.0”

    target ‘RecognizeCard’ do

    pod 'OpenCV', '~> 3.0.0'
    pod 'TesseractOCRiOS', '~> 4.0.0'

    end
    乾坤醉心尘:没来看评论,找了好久。
  • WLZero:大神牛批,服气!
  • 一条鱼的星辰大海:大神 能给我发一份么 我pod不了 https://opencv.org官网也打不来 跪求
    一条鱼的星辰大海:237564873@qq.com 忘了附上邮箱 😁
  • 冰三尺:请问下楼主, 有TesseractOCRiOS学习的文档吗?
  • c778e3e33d2f:大神,opencv 一直pod不上,能否发一份给我参考吗?谢谢! 921737545@qq.com
  • CYG斗战佛:大神你知道怎么找到那个中文姓名的那个轮廓的思路和算法吗?跪求
  • smile刺客:楼主 问一下 我导入到自己的框架中有文件路径的赋值, const char *thePath = [[[NSBundle mainBundle] resourcePath] UTF8String]; int ret = EXCARDS_Init(thePath); 有这句话就会崩溃掉 。崩溃在G8Tesseract.mm类中 returnCode = _tesseract->Recognize(_monitor);(Thread 21: EXC_BAD_ACCESS (code=1, address=0xfffec786)方法中 打印出来的错误是这个does not have sandbox access for frZQaeyWLUvLjeuEK43hmg and IS NOT appropriately entitled
    2017-10-23 10:55:34.465259+0800 Ykly[620:110352] libMobileGestalt MobileGestalt.c:550: no access to InverseDeviceID (see <rdar://problem/11744455>)。我看了czqonly的回答 依然没有解决掉问题。
  • CYG斗战佛:大神我想问下,关于那个身份证号码区域的计算,如何在计算对应的姓名区域呢
  • TheGiant:为什么我识别出来的身份证号码是乱码呀?
    TheGiant: @wythetan 没事了,解决了。3q
    peaktan:@TheGiant 乱码?是什么样的
  • CYG斗战佛:楼主 pod install 一直下不来 可以给个可以跑的demo嘛?
    peaktan:@haha你好 项目依赖库比较大,所以install比较久
  • jeasonDong:导入这个#import <opencv2/opencv.hpp>会报错 Expected identifier这个是什么原因
  • 那是一阵清风_徐来:识别灵敏度 太低了 基本识别不了
    peaktan:@生活本该如此 这只是一个方向,要做到识别很精确,那就得去优化了,影响识别的因素有很多
  • Leo_L:大神,Git 下载下来 出错 pod 也出错 最近 要做 文档识别 想参考一下您的demo 麻烦您发我一份 1306512129@qq.com 谢谢!
  • 追赶阳光:试了好几次才可以识别,但是识别出来的信息乱的:sweat:
  • f58b49c78bfa:楼主能发一份完整的demo吗?pod一直失败,邮箱762610109@qq.com,感谢!
  • 失忆的程序员:楼主,吊起opencv,对摄像头远近调整,应该怎么实现?
  • George不资深:楼主,我bitcode 已经设置成no了,但是编译还是有linker command failed with exit code 1 的错误,请问是什么原因呢?
    布衣吖:迟了一年多的回复,哈哈。cocoapods导入之后是不是忘记要用workspace打开了?:blush:
  • 388e6fc164de:楼主,爱你么么哒:grin:
  • JamesDev:recognize的时候崩溃了,EXC_BAD_ACCESS,楼主知道为什么吗?你的工程我用着没事,但是添加到自己的工程里面,就会有问题。
  • 静心_安神:楼主,我拖入了中文语言包, 然后识别身份证地址的时候总是报错。
    int returnCode = _tesseract->Init(self.absoluteDataPath.UTF8String, self.language.UTF8String,
    (tesseract::OcrEngineMode)self.engineMode,
    (char **)configs, count,
    &tessKeys, &tessValues,
    false);
    然后下面打印错误如下:
    actual_tessdata_num_entries_ <= TESSDATA_NUM_ENTRIES:Error:Assert failed:in file tessdatamanager.cpp, line 53
    de2ba46f5267:我用英文包也有这个问题,还有需求需要识别中文,不用中文包的话怎么识别中文呢?
    peaktan:@静心_安神 不要用中文包
    静心_安神:我地址的轮廓取得没有问题, 如果我换成eng的语言包,虽然识别结果不正确但不会crash!就是用其他导入的语言包报如上问题
  • 汤玉阳Scofield:请教楼主,为什么会崩溃在轮廊检测cv::findContours(resultImage, contours, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));这一步,,报错信息是的Unsupported format or combination of formats ([Start]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only) in cvStartFindContours,找了好久没有找到解决办法
  • 0ccf110587df:我在关闭bitcode的情况下,在模拟器中运行是没问题的 但是在真机中就是错误了,错误内容和不关闭bitcode错误一致,不知道怎么回事,博主可否给解答一下?谢谢 我在http://stackoverflow.com/search?q=-weak_library+and+-bitcode_bundle+%28Xcode+setting+ENABLE_BITCODE%3DYES%29+cannot+be+used+together 看到了这个问题 无人解答呢
  • 大菠萝98123:enum { NO, GAIN, GAIN_BLOCKS };
    这里报Expected identifier是什么情况呢
  • 亭台雨榭111:Creating an image format with an unknown type is an error
    actual_tessdata_num_entries_ <= TESSDATA_NUM_ENTRIES:Error:Assert failed:in file tessdatamanager.cpp, line 53 出现这个问题在怎么解决的?谢谢
    de2ba46f5267:我也遇到这样的问题,请问怎么解决的
    亭台雨榭111:@wythetan 非常感谢您的分享,问题解决了,语言路径不对
    peaktan:@亭台雨榭111 你好,我明天看看代码是不是有这个问题。再给你答复
  • 5f213eaf7185:你好,我下载了你的Demo,真机运行,提示#import <opencv2/opencv.hpp>找不到文件,是缺少了什么还是我需要引入什么类?
    peaktan:重新pod 试试
  • 微笑不是你:楼主。demo还要重新pod install ,为什么我一直装不下
  • 菜鸟晋升路:TesseractOCR这个包太大 你能直接发给我吗或者直接发我一个完成的demo 953202144@qq.com 谢谢
  • 叫我小哥哥:楼主 能不给我一个完整的demo发我邮箱 我在git下载后不能用啊 打开后不能用啊 运行不起来 915960720@qq.com 谢谢
  • 4d0283d383bb:你好,楼主,能给我发一个demo吗?,谢谢你 1079381208@qq.com这是我的邮箱
  • f389126a1b08:你好 我pod 也一直pod失败
    curl 56 SSLRead() return error -36 一直这个错误
    9c9768252444:我也遇到一样的问题了 不知道怎么解决
    brownfeng:一样...
  • cd2f866c691d:我在关闭bitcode的情况下,在模拟器中运行是没问题的 但是在真机中就是错误了,错误内容和不关闭bitcode错误一致,不知道怎么回事,博主可否给解答一下?谢谢
    青椒辣不辣:@易上云 podfile中是不是有 use_frameworks 把它去掉 重新pod
    0ccf110587df:同样的问题 求解决 谢谢
  • 884b9e293eb3:楼主你好,你分享的东西很好,我在git上下载完代码之后,打开相册崩溃,因为缺少两个key,之后添加了,在选择照片完成后,会出现[Generic] Creating an image format with an unknown type is an error的报错,不知道哪里出了问题,我系统版本是10.2,Xcode是8.2.1,身份证识别失败,望帮我解决一下,这边项目急用,谢谢
    sakisama:您好,我也遇到这个问题了,后来是怎么解决的呢?
    884b9e293eb3:@wythetan 好的,谢谢大神:pray:我QQ751362521,加我一下
    peaktan: @__大黄蜂__ 白天在忙别的,晚上回去我看看。
  • VincentWangVv:大神,opencv 一直pod不上,能否发一份给我参考吗?谢谢! 389563627@qq.com
    peaktan: @VincentWangVv 已经发给你了
    VincentWangVv:@wythetan THX
    peaktan: @VincentWangVv 晚上回去发给你
  • 千虑必有一得:1、RecognizeCard-master/Pods/Manifest.lock: No such file or directory
    2、The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
    下载之后,直接pod install,再运行有这个问题,没太懂
    peaktan: @大都市里小刁民 pod出问题了,重新pod试试
  • My少了不少:大神,Please call SetImage before attempting recognition.Please call SetImage before attempting recognition.2017-01-23 11:50:57.572 MYSHAOOPENCV[2950:1130738] No recognized text. Check that -[Tesseract setImage:] is passed an image bigger than 0x0. 这个是什么状况?
    peaktan: @My少了不少 可以,这样识别更准确
    My少了不少:@wythetan 上次弄好了,感觉这个需要再加一个模块,自定义摄像机,然后身份证放在那个区域中识别
    peaktan: @My少了不少 你改了代码吗
  • 080d6e6a433c:- (void)tesseractRecognizeImage:(UIImage *)image compleate:(CompleateBlock)compleate 这个方法里的G8Tesseract是什么?为什么一直报错啊
    5f3040a1cc26:请问楼主,这个G8Tesseract是TesseractOCR.framework的类吗?还是你自己封装的啊?我的是Tesseract。
    peaktan: @080d6e6a433c 这个是识别文字的实体类,报什么错,你重新pod一下试试
  • 080d6e6a433c:是不是太大了啊,我pod一直installing好久好久了
    peaktan: @080d6e6a433c 是挺大的,耐心等待
  • 玉松:楼主您好!很高开心也很激动看到你的分享!并在git上给了一个star :smile: ,请问扫描识别字符串 能用这个框架吗?您还有别的什么建议吗。非常谢谢!期待你的回复
    peaktan:@玉松 识别字符串需要修改一下,直接对文字进行识别就行了
  • 断剑:楼主你好,我更新了pod,但是运行的时候一直出问题,模拟器和真机一点相册就崩溃,请问一下是怎么回事啊
    peaktan:崩溃报的是什么错
  • 7b82f3bc1610:楼主,能不能加个Q ,公司最近要做,小白
  • 745df58d042c:您好,我的闪退在 : std::vector<std::vector<cv::Point>> contours;//定义一个容器来存储所有检测到的轮廊
    cv::findContours(resultImage, contours, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));
    //取出身份证号码区域
  • 请叫我林木木:今天我尝试自己写了下,发现白天识别还可以,晚上在灯光下完全识别不出来,这种情况下图片该怎样处理呢?楼主最近有研究吗?
    请叫我林木木:@wythetan 嗯,可能就是阴影影响的,我先研究着看看opencv里面有没有过滤阴影,或者调整曝光这一类的方法
    peaktan:@ChenLinlin 最近没有研究,都在忙别的:scream:
    peaktan:@ChenLinlin 灯光下会有阴影,所以会影响识别
  • 跃文:怎么一运行就崩溃在TesseractOCRiOS框架里啊
    peaktan:@跃文 你重新pod一下试试
  • 文心楠_YouHou:能获取姓名什么的信息吗?
    文心楠_YouHou:怎么做,还是通过长度?
    peaktan:@文心楠_2016 可以
  • brave723:opencv 一直pod不上啊!
    peaktan:@真实透明识别速度和这个应该没关系吧
    brave723:@wythetan 我从官网下载了openVC,已经跑通了!换了一种方式,现在识别也很快了!
    peaktan:@真实透明 网络问题,回头我把代码放到百度网盘。
  • CrazySteven:6的不要不要的,感谢分享。。。
  • 你飞跃俊杰:求一个完整的项目 :sob:
  • Terrnce:楼主,你好,我直接调用这个方法opencvScanCard,为什么显示出来的身份证号码图片是xxx年xxx月xxx日?
    Terrnce:@陈伟鑫 不好意思:fearful:看错了。
  • fengchuanxiang:识别效率很慢啊,得半天,有最近改进的吗?
  • 50de51f0e674:github的damo下下来后发现是不能打开
  • WhatHurtsMore:楼主 这样的方式我pod不上opencv啊
  • 2346cca47e9a:大神 pod一直install不了 0curl: (56) SSLRead() return error -9806 报这个错误 不知道什么原因也许是网络原因 能不能发一个你完整的demo看看 谢谢谢谢谢谢谢谢你 1246664010@qq.com
  • cbf2d993da7a:收到,谢谢大神!
    peaktan:@_奋斗ing_ 不客气
  • cbf2d993da7a:缺少libPods-RecognizeCard.a文件
  • cbf2d993da7a:大神,我pod最新的,下载完程序报错,Code Sign error: No matching provisioning profiles found: No provisioning profiles with a valid signing identity (i.e. certificate and private key pair) matching the bundle identifier “gaofeng.RecognizeCard” were found.
    peaktan:@_奋斗ing_ 你把bundle id改成com开头的再试试
    peaktan:@_奋斗ing_ iOS10中真机调试又加入了限制,必须要有证书才能运行
    peaktan:@_奋斗ing_ 你是真机调试是吗
  • 不知是为谁_CZQ:楼主 问下导入tesseract库后 识别的时候在 returnCode = _tesseract->Recognize(_monitor);
    这一行显示EXC_BAD_ACCESS 有遇到过么
    不知是为谁_CZQ:@JamesDev 你尝试下用file->Add Files to "XXX"试试 虽然不知道为什么 但是这个帮我解决了这个问题
    JamesDev:楼上的同仁,问题解决了吗?我现在也遇到这样的问题了?
    csp:想问一下你解决了吗?楼主的工程我用着没事,但是导入到自己的工程里,这一句就会崩掉。
  • 阿龍飛:楼主能来个git链接吗?
    peaktan:@阿龍飛 文章最后已经给出了
  • NateLam:好帖, 不过感觉最好把身份证图片一些关键信息打个码 :sweat_smile:
    NateLam:@wythetan 哦哦 :grin:
    peaktan:@NateLam 这是百度上搜的图片,没事:smile:
  • 枫叶砂:更新pod老是出错,怎么办?
    2346cca47e9a:@枫叶砂 我在pod该项目 也出现了更新不了的错误 能不能把你更新好的 发我一份呀 1246664010@qq.com
    枫叶砂:的确是网络问题,在遇到“ Curl POST to HTTPS url gives SSLRead() error:curl: (56) SSLRead() return error -9806 ”的问题时,终端输入“git config --global core.compression -1”会解决这个问题。
    peaktan:@枫叶砂 网络问题,建议在网络比较好的情况下多试几次,我也遇到过这个情况
  • 放心APP:搞得有点复杂。直接把图片发百度云OCR,然后匹配出的结果里面找 18个连续数字 就好叻
    NateLam:@梁鲲 是吗!那我得看看,多谢了:smile:
    梁鲲: @NateLam ai.baidu.com 里面有ocr免费使用,准确率还高
    NateLam:@放心APP 百度云下架这个东西了吧, 反正我是找不到啊
  • 奕十八:为什么识别出来结果不是很准确,还出现问号什么的乱码,忘解答
    peaktan:@奕十八 这只是个粗略版,主要阐述一下原理,要想做到识别率很准确,那还得在图片预处理上花功夫。我也在研究这一块
    奕十八:@wythetan 没有啊,我每次识别都会出现乱码是什么情况,而且我的背景也不复杂
    peaktan:@奕十八 背景不要太复杂,身份证要拍照清晰,识别的正确率可以有90%。
  • 5dd8986e5974:#include <list>
    为什么我把opencv2这个Frame添加到自己的多工程出现 <list> 这个文件找不到呢
    960d2a7a31bd:@伐辰 是不是没有把.m改成.mm
    5dd8986e5974:@wythetan 没有啊
    peaktan:@伐辰 你手动倒进去要添加依赖库的,你看看是不是少了什么依赖库
  • 5dd8986e5974:可有银行卡识别的demo 楼主
    少年_如他:@wythetan 你好,请问有银行卡识别的demo吗?
    peaktan:@伐辰 银行卡的没有,不过原理是一样的。
  • 审判spp:楼主有TesseractOCR的中文包吗,找了好几个都不管用
    peaktan:没有呢,最近都在忙别的了,之后试了再和你分享
    JopiNFlyyy:@wythetan 楼主,有再试过中文识别吗,用chi_sim.traineddata替换eng.traineddata后,报read_params_file: parameter not found: allow_blob_division,有什么好方法吗?
    peaktan:@审判申攀 中文识别要对语言包做一步处理,你可以不用处理,直接把eng.traineddata替换为chi_sim.traineddata,并且把chi_sim.traineddata重命名为eng.traineddata就ok
  • 审判spp:楼主,我前一段搞过车牌识别,我发现图片的腐蚀化很难处理好,在室外拍照各种影响太大,然后摘取车牌轮廓是就不容易找到
    pinglife:你车牌号识别是自己写的吗?还是用别的第三方?请教
    peaktan:@审判申攀 腐蚀确实是比较难处理的,关键在于确定内核的大小。我这些也在看opencv的官网手册,希望能尽快解决这个问题。车牌号我觉得受到的影响太多了,一起加油。
  • 初灬终:抱大腿了。楼主能来个git链接吗?感谢!
    初灬终: @wythetan 谢谢你
    peaktan:@猿JLS 文章最后给出了git链接
  • 爱因乐:楼主不好意思,我来看贴学习的,不小心按到举报
    JeffreyTaiT:哪里有举报功能,我也要
    爱因乐:@wythetan 真不是故意的
    peaktan:@爱因乐 你是:monkey_face:请来的吗:fearful:
  • 9435e52a4db1:楼主,给个完整的demo,谢谢!
    peaktan:@砍柴的程序员 文章最后有git链接,下载更新pod就行

本文标题:iOS身份证号码识别

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