ios身份证识别opencv,不要棉花糖

By admin in 4858美高梅 on 2019年3月29日

本文是从简书复制的, markdown语法大概某个出入,
想看”正版”和越来越多内容请关切 简书:
小贤笔记

爱戴自汗,朋友圈里一篇介绍app的帖子引到简书,在简书首页又来看了该贴,想来不排除软文的或是。(简书莫怪)。

挂号简书好多天了,平昔看着创作专题不放。看到数不胜数大神的神来大手笔,本人由心地钦佩。


平时看到有新的名著更新,都是第方今间去跟进,品读。时间长流,看到的干货多了、久了。自然也有了和谐的一点思路与总计。

不少大神的心得体会,方法与技能,经验与总括,在简书平台的抒发与享受,让笔者乐此不移地欣赏上了简书。

书写是一份天赋,也是一颗心的爱惜。笔者乐在个中,爱也其真。即便,文字创新意识能力简单,但不足以阻挡作者要变为一颗大神的心。

努力学习中,文采采集中。经验不多,技巧不足以表以后各大神案板前。唯有本身的一小点,缕缕思烟想吐槽出来,以赏风月。

ios身份证识别opencv,不要棉花糖。以下,是自己要读书的方向,最后的指标是大神之家。

这些,语音之准,文字之精。不供给多富华生动的文字词汇,只要文在精准达意,字在心理神会。

其二,言之有物,物有所值。不管外人所言,物有多值。但求作者有所值,而言之。世上万物事,价值是本色。

其三,情深意志,有爱追随。文如其人,爱有多深,情会多真。唯有心明志,才能书写有爱的好玩的事。有爱才有才情,有爱才有前途。有情才有精气神,有情才能任我行。

上述所言,发之肺腑,推断于心,感之于情。望,本身打气之,成其功绩。

率先次写简书,多见谅。
正文运用opencv+TesseractOC本田UR-V来贯彻身份证识别姓名和身份证号
翻开并援引了如拾草芥稿子
opencv安装及入门
4858美高梅,OpenCV在iOS上的行使尝试
在身份证识别上,由于相机拍录的亮度及其余标题困难在于图片的阈值二值化的论断,用过一定阈值二值化、局部阈值二值化、平均阈值二值化都不可能。
在传说opencv的一种局部自适应快速二值化方法(积分法)小说中艺术化解了光照不均匀的图像中开始展览二值化。

一般情形下, 大家把 line-height 的值设置为 height 的值,
就能够完结文字垂直居中

跻身倒也没后悔。如今网络中社交泛滥,随处是眼睛,随地是耳朵,在简书上还是能够找到时辰候偷偷记日记的感觉到,分外高尚。

//扫描身份证图片,并进行预处理,定位号码区域图片并返回

- (NSArray*)opencvScanCard:(UIImage*)image {

//将UIImage转换成Mat

cv::MatresultImage;

UIImageToMat(image, resultImage);

//先用使用3x3内核来降噪

blur( resultImage, resultImage,cv::Size(3,3),cv::Point(-1,-1));

//UIImage *Image2 = MatToUIImage(resultImage);

////固定阈值二值化

//cv::threshold(resultImage, resultImage, 100, 255, CV_THRESH_BINARY);

////局部阈值二值化

//cv::adaptiveThreshold(resultImage, resultImage, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 3, 5);

////平均阈值二值化

//IplImage imgTopDown = resultImage;

//CvScalar mean ,std_dev;//平均值、标准差

//double u_threshold,d_threshold;

//cvAvgSdv(&imgTopDown,&mean,&std_dev,NULL);

//u_threshold = mean.val[0] +1.5* std_dev.val[0];//上阀值

//d_threshold = mean.val[0] -1.5* std_dev.val[0];//下阀值

//u_threshold = mean.val[0];

//d_threshold = mean.val[0];

////u_threshold = mean + 2.5 * std_dev; //错误

////d_threshold = mean - 2.5 * std_dev;

//std::cout<<"The TopThreshold of this Image in TopDown is:"<

//std::cout<<"The DownThreshold of this Image in TopDown is:"<

//cv::threshold(resultImage,resultImage,d_threshold,u_threshold,CV_THRESH_BINARY);//上下阀值

//积分阈值二值化

resultImage =AdaptiveThereshold(resultImage, resultImage);

//腐蚀,填充(腐蚀是让黑色点变大)

cv::MaterodeElement =getStructuringElement(cv::MORPH_RECT,cv::Size(22,22));

cv::erode(resultImage, resultImage, erodeElement);

//轮廊检测

std::vector> contours;//定义一个容器来存储所有检测到的轮廊

cv::findContours(resultImage, contours,CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));

//cv::drawContours(resultImage, contours, -1, cv::Scalar(255),4);

//取出身份证号码区域

std::vector rects;

cv::RectNameNumberRect =cv::Rect(0,0,0,0);

cv::RectCardNumberRect =cv::Rect(0,0,0,0);

std::vector>::const_iteratoritContours = contours.begin();

for( ; itContours != contours.end(); ++itContours) {

cv::Rectrect =cv::boundingRect(*itContours);

rects.push_back(rect);

//算法原理

if(rect.width> CardNumberRect.width&& rect.width> rect.height*6) {

CardNumberRect = rect;

}

if(rect.x>60&& rect.y<120&& rect.height*2< rect.width) {

NameNumberRect = rect;

}

}

//定位成功成功,去原图截取身份证号码区域,并转换成灰度图、进行二值化处理

//去原图截取身份证姓名区域,并转换成灰度图、进行二值化处理

cv::MatmatImage;

UIImageToMat(image, matImage);

cv::MatNameImageMat;

NameImageMat = matImage(NameNumberRect);

IplImagegrey = NameImageMat;

unsignedchar* dataImage = (unsignedchar*)grey.imageData;

intthreshold =Otsu(dataImage, grey.width, grey.height);

printf("阈值:%d\n",threshold);

NameImageMat =AdaptiveThereshold(NameImageMat, NameImageMat);

UIImage*NameImage =MatToUIImage(NameImageMat);

cv::MatCardImageMat;

CardImageMat = matImage(CardNumberRect);

CardImageMat =AdaptiveThereshold(CardImageMat, CardImageMat);

UIImage*CardImage =MatToUIImage(CardImageMat);

//身份证号码定位失败

if([publicClassobjectIsEmpty:CardImage]||[publicClassobjectIsEmpty:NameImage]) {

returnnil;

}

NSArray* arr =@[NameImage,CardImage];

returnarr;

}

但貌似移动端不太协调, 文字总是有些偏上一丢丢, 那看起来就很不舒适了,
很影响用户体验

近来写多了形而上学的文字,想给已经满满的脑子找个开口。翻看了首页读者众的几篇小说,恕笔者直言,多数太长,一篇小说中想发挥的太多,文字又太冗长。读着就像是嘴里嚼了个文字版棉花糖,微甜,软软,虚胖,有的还不夹心。

局部自适应高速积分二值化方法

设想过加上 padding: xxrem 0, 但结果要么不太满足…

又就像非要把一百元一张大票破成十张十块,甚至一百陈威块,好像厚了、多了就值越来越多钱一样。环球按字数付钱的激励机制,真是害文不浅,害人更深。

cv::Mat AdaptiveThereshold(cv::Mat src,cv::Mat dst)
{
    cvtColor(src,dst,CV_BGR2GRAY);
    int x1, y1, x2, y2;
    int count=0;
    long long sum=0;
    int S=src.rows>>3;  //划分区域的大小S*S
    int T=15;         /*百分比,用来最后与阈值的比较。原文:If the value of the current pixel is t percent less than this average
                       then it is set to black, otherwise it is set to white.*/
    int W=dst.cols;
    int H=dst.rows;
    long long **Argv;
    Argv=new long long*[dst.rows];
    for(int ii=0;ii<dst.rows;ii++)
    {
        Argv[ii]=new long long[dst.cols];
    }

    for(int i=0;i<W;i++)
    {
        sum=0;
        for(int j=0;j<H;j++)
        {
            sum+=dst.at<uchar>(j,i);
            if(i==0)
                Argv[j][i]=sum;
            else
                Argv[j][i]=Argv[j][i-1]+sum;
        }
    }

    for(int i=0;i<W;i++)
    {
        for(int j=0;j<H;j++)
        {
            x1=i-S/2;
            x2=i+S/2;
            y1=j-S/2;
            y2=j+S/2;
            if(x1<0)
                x1=0;
            if(x2>=W)
                x2=W-1;
            if(y1<0)
                y1=0;
            if(y2>=H)
                y2=H-1;
            count=(x2-x1)*(y2-y1);
            sum=Argv[y2][x2]-Argv[y1][x2]-Argv[y2][x1]+Argv[y1][x1];


            if((long long)(dst.at<uchar>(j,i)*count)<(long long)sum*(100-T)/100)
                dst.at<uchar>(j,i)=0;
            else
                dst.at<uchar>(j,i)=255;
        }
    }
    for (int i = 0 ; i < dst.rows; ++i)
    {
        delete [] Argv[i];
    }
    delete [] Argv;
    return dst;
}

最后找到两种化解办法, 代码如下

就算自己偶然也想吃棉花糖,但互连网时期的好文字,应该更多的是跳跳糖,固然只有细微一粒,但听君一席话胜读十年书,满口生津。

TesseractOC宝马X3识别文字

  • 方法一

故此,亲爱的简书,第三影像不差,深切接触有望,日后可以还是不可以少上些棉花糖,多几粒跳跳糖?只怕,设多个跳跳糖盒,怎么着?

//利用TesseractOCR识别文字
- (void)tesseractRecognizeImageArr:(NSArray *)arr compleate:(CompleateBlock)compleate {

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        NSMutableArray* marr = [NSMutableArray array];
        for (int i = 0; i<arr.count; i++) {
            G8Tesseract *tesseract;
            if(i==0){
                tesseract = [[G8Tesseract alloc] initWithLanguage:@"chi_sim"];
            }else{
                tesseract = [[G8Tesseract alloc] initWithLanguage:@"eng"];
            }
            tesseract.image = [arr[i] g8_blackAndWhite];
            tesseract.image = arr[i];
            // Start the recognition
            [tesseract recognize];
            //执行回调
            [marr addObject:tesseract.recognizedText];
        }
        compleate(marr[0],marr[1]);

    });
}

4858美高梅 1

参照小说:
iOS身份证号码识别
demo下载:
由于包括字体库,demo比较大,还有下载完后请自行pod install。
idCardOpencv

span {
    width: 1rem;
    height: 1rem;
    font-size: 0.12rem;
    color: green;
    background: lightblue;

    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: column;
}
  • 情势二 (仅限于字数固定状态)

span {
    font-size: 0.12rem;
    color: green;
    background: lightblue;
    padding: 0.03rem 0.15rem;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有