字符识别_手写识别字符 - CSDN
  • 字符识别处理流程

    2018-08-13 14:12:53
  • 本文简单介绍图片字符识别的原理,主要识别图片中的数字,其他字符识别原理类似。大家应该知道,对于人类来说,可以很容易理解一张图片所表达的信息,这是人类视觉系统数万年演变进化的结果。但对于计算机这个诞生...

    本文简单介绍图片字符识别的原理,主要识别图片中的数字,其他字符识别原理类似。

    大家应该知道,对于人类来说,可以很容易理解一张图片所表达的信息,这是人类视觉系统数万年演变进化的结果。但对于计算机这个诞生进化不到百年的 “新星”,要让它理解一张图像上的信息是一个复杂的过程。计算机理解图像是一个数字计算比较的过程。

    如图,我们一目了然的识别的图像中的数字,如何让计算机识别下图中的数字呢?

     

    环境:VS2015+openCV3.4.0

    要识别图像字符,首先需要模版库。对于识别简单字符,可自己训练,也可网上下载数据集。笔者这里就直接用提前做好的(用photoshop制作,字体和字大小尽量和待识别字符相近,不然影响识别率),为便于识别,模版名就以数字命名。

     

    1. 图片预处理。首先读取待识别图像,灰度化、二值化。

    Mat srcImg = imread("H:\\test.jpg",CV_LOAD_IMAGE_GRAYSCALE);//打开图片

    灰度后图像:

     

    threshold(srcImg, srcImg, threshVal, 255, CV_THRESH_BINARY);//二值化

    我们知道图像本身就以数字进行存储的,二值化后图像就只有两个值0和255.

    例数字0:

                    

    注意二值化的阈值根据图像实际情况进行调整。

    二值化图像后:

     

    2. 图像分割。我们需要将图像中的字符分割开。整个过程分两部,左右分割和上下分割。基本思想是,从图像的左上角第一列开始,从左往右逐列扫描扫描,当遇到像素值为0时,记录该列号sCol,继续扫描再遇到整列像素值为255时,记录列号eCol,sCol与eCol之间即为字符所在区间。复制二值图该区域,这样完成了左右分割;

     

    将左右分割后,在此基础上再对图像进行上下分割,同理,从图像左上角第一行,向下逐行扫描,当遇到像素值为255时,记录该列号sRow,继续扫描再遇到整列像素值为0时,记录列号eRow,sRow与eRow之间即为字符所在区间。复制该区域,这样完成了上下左右分割。

     

     

    3. 识别。把切割后的数字图片大小调整到和模板一样的大小(一般以模版中最大尺寸),然后让需要匹配的图和别和10个模板相减(让两个图片对应坐标像素点值相减),将所有差的绝对值求和 。

    最后与哪个模板匹配时绝对值和最小,则就可以得到图像与该模版最匹配,进而识别该字符。

    4. 结果。

     

    展开全文
  • 这篇博文来谈谈车牌的字符识别。 目前,车牌字符识别算法主要是基于模板匹配、特征匹配或神经网络的方法。 在本文中我们主要来说说基于神经网络的字符识别方法,采用的是OpenCV中的CvANN_MLP。关于神经网络的具体...

    这篇博文来谈谈车牌的字符识别。

    目前,车牌字符识别算法主要是基于模板匹配、特征匹配或神经网络的方法。

    在本文中我们主要来说说基于神经网络的字符识别方法,采用的是OpenCV中的CvANN_MLP。关于神经网络的具体细节,可以参考我以前的博文:

    BP神经网络解析及Matlab实现

    更加细节的东西可以查看如下参考文献:

    Neural Networks【OpenCV Documentation】

    BackPropWikipedia【Wikipedia】


    现在我们确定了字符识别的总体框架,那么先来说说字符的特征提取问题。这里我们主要考虑的是:

    垂直方向、水平方向的数据统计特征提取法:

    这种特征提取法就是自左向右对图像进行逐列的扫描,统计每列黑色像素的个数,然后,自上往下逐行扫描,统计每行的黑色像素的个数,将统计结果作为字符的特征向量,如果字符的宽度为w,高度为h,则特征向量维数是w+h。


    同时,为了能够提取更多的特征用于识别,还将输入字符每个点的值引入特征向量。

    Code:

    Mat OCR::features(Mat in, int sizeData){
        // 直方图特征,
        Mat vhist=ProjectedHistogram(in,VERTICAL);
        Mat hhist=ProjectedHistogram(in,HORIZONTAL);
        
        // 将输入字符resize为15*15大小
        Mat lowData;
        resize(in, lowData, Size(sizeData, sizeData) );
            
        // 特征向量维数
        int numCols=vhist.cols+hhist.cols+lowData.cols*lowData.cols;
        
        Mat out=Mat::zeros(1,numCols,CV_32F);
        
        int j=0;
        for(int i=0; i<vhist.cols; i++)
        {
            out.at<float>(j)=vhist.at<float>(i);
            j++;
        }
        for(int i=0; i<hhist.cols; i++)
        {
            out.at<float>(j)=hhist.at<float>(i);
            j++;
        }
        for(int x=0; x<lowData.cols; x++)
        {
            for(int y=0; y<lowData.rows; y++){
                out.at<float>(j)=(float)lowData.at<unsigned char>(x,y);
                j++;
            }
        }
        if(DEBUG)
            cout << out << "\n===========================================\n";
        return out;
    }
    Mat OCR::ProjectedHistogram(Mat img, int t)
    {
        int sz=(t)?img.rows:img.cols;
        Mat mhist=Mat::zeros(1,sz,CV_32F);
    
        for(int j=0; j<sz; j++){
            Mat data=(t)?img.row(j):img.col(j);
            mhist.at<float>(j)=countNonZero(data);
        }
    
        //Normalize histogram
        double min, max;
        minMaxLoc(mhist, &min, &max);
        
        if(max>0)
            mhist.convertTo(mhist,-1 , 1.0f/max, 0);
    
        return mhist;
    }

    不过,在上面的特征提取之前,我们其实还需要做几步预处理:

    首先,就是字符分割。在字符分割里面,我们首先将输入车牌二值化,然后利用findContours寻找出每个字符的轮廓,再利用boundingRect定位出每个轮廓的矩形区域,然后割取出每个字符的区域。

    Code:

    vector<CharSegment> OCR::segment(Plate plate){
        
    	Mat input=plate.plateImg;
        vector<CharSegment> output;
    
        Mat img_threshold;
        threshold(input, img_threshold, 60, 255, CV_THRESH_BINARY_INV);
        
    	if(DEBUG)
            imshow("Threshold plate", img_threshold);
        
    	Mat img_contours;
        img_threshold.copyTo(img_contours);
    
        // 在车牌区域中寻找可能字符的的轮廓
        vector< vector< Point> > contours;
        findContours(img_contours,
                contours, 
                CV_RETR_EXTERNAL, 
                CV_CHAIN_APPROX_NONE); 
        
        
        cv::Mat result;
        img_threshold.copyTo(result);
        cvtColor(result, result, CV_GRAY2RGB);
        cv::drawContours(result,contours,
                -1, 
                cv::Scalar(255,0,0), 
                1); 
    
        vector<vector<Point> >::iterator itc= contours.begin();
           
        while (itc!=contours.end()) {
            
            Rect mr= boundingRect(Mat(*itc));
            rectangle(result, mr, Scalar(0,255,0));
    
            Mat auxRoi(img_threshold, mr);
            if(verifySizes(auxRoi)){
                auxRoi=preprocessChar(auxRoi);
                output.push_back(CharSegment(auxRoi, mr));
                rectangle(result, mr, Scalar(0,125,255));
            }
            ++itc;
        }
        if(DEBUG)
            cout << "Num chars: " << output.size() << "\n";
    
        if(DEBUG)
            imshow("SEgmented Chars", result);
    
        return output;
    }

    效果:



    然后,就是对字符进行预处理(统一大小)。

    Code:

    // 这个函数主要是对输入图片归一化到统一的大小20×20
    Mat OCR::preprocessChar(Mat in){
        int h=in.rows;
        int w=in.cols;
    
        Mat transformMat=Mat::eye(2,3,CV_32F);
        int m=max(w,h);
        transformMat.at<float>(0,2)=m/2 - w/2;
        transformMat.at<float>(1,2)=m/2 - h/2;
    
        Mat warpImage(m,m, in.type());
        warpAffine(in, warpImage, transformMat, warpImage.size(), INTER_LINEAR, BORDER_CONSTANT, Scalar(0) );
    
        Mat out;
        resize(warpImage, out, Size(charSize, charSize) ); 
    
        return out;
    }

    现在我们来介绍一下OpenCV中的神经网络方法。在OpenCV的documentation中有如下叙述:

    the whole trained network works as follows:

    1. Take the feature vector as input. The vector size is equal to the size of the input layer.
    2. Pass values as input to the first hidden layer.
    3. Compute outputs of the hidden layer using the weights and the activation functions.
    4. Pass outputs further downstream until you compute the output layer.
    So, to compute the network, you need to know all the weights w^{n+1)}_{i,j} . The weights are computed by the training algorithm. The algorithm takes a training set, multiple input vectors with the corresponding output vectors, and iteratively adjusts the weights to enable the network to give the desired response to the provided input vectors.


    void OCR::train(Mat TrainData, Mat classes, int nlayers){
        Mat layers(1,3,CV_32SC1);
        layers.at<int>(0)= TrainData.cols;
        layers.at<int>(1)= nlayers;
        layers.at<int>(2)= numCharacters;
        ann.create(layers, CvANN_MLP::SIGMOID_SYM, 1, 1);
    
        //Prepare trainClases
        //Create a mat with n trained data by m classes
        Mat trainClasses;
        trainClasses.create( TrainData.rows, numCharacters, CV_32FC1 );
        for( int i = 0; i <  trainClasses.rows; i++ )
        {
            for( int k = 0; k < trainClasses.cols; k++ )
            {
                //If class of data i is same than a k class
                if( k == classes.at<int>(i) )
                    trainClasses.at<float>(i,k) = 1;
                else
                    trainClasses.at<float>(i,k) = 0;
            }
        }
        Mat weights( 1, TrainData.rows, CV_32FC1, Scalar::all(1) );
        
        //Learn classifier
        ann.train( TrainData, trainClasses, weights );
        trained=true;
    }
    
    int OCR::classify(Mat f){
        int result=-1;
        Mat output(1, numCharacters, CV_32FC1);
    
        ann.predict(f, output);
        Point maxLoc;
        double maxVal;
        minMaxLoc(output, 0, &maxVal, 0, &maxLoc);
        //We need know where in output is the max val, the x (cols) is the class.
    
        return maxLoc.x;
    }

    本文地址:http://blog.csdn.net/linj_m/article/details/23736381

    更多图像处理、机器视觉资源请关注 博客: LinJM-机器视觉 微博:林建民-机器视觉


    展开全文
  • openCV字符识别样本

    2020-07-30 23:32:00
    0~9,A~Z 34类字符模版 每类50个,一共是1700个图片,比网上大多数的样本都要多
  • 最近入坑研究OCR,看了比较多关于OCR的资料,对OCR的前世今生也有了一个比较清晰的了解。所以想写一篇关于OCR技术的综述,对OCR相关的...OCR英文全称是Optical Character Recognition,中文叫做光学字符识别。它...

    转自:https://www.cnblogs.com/skyfsm/p/7923015.html

    最近入坑研究OCR,看了比较多关于OCR的资料,对OCR的前世今生也有了一个比较清晰的了解。所以想写一篇关于OCR技术的综述,对OCR相关的知识点都好好总结一遍,以加深个人理解。

    什么是OCR?

    OCR英文全称是Optical Character Recognition,中文叫做光学字符识别。它是利用光学技术和计算机技术把印在或写在纸上的文字读取出来,并转换成一种计算机能够接受、人又可以理解的格式。文字识别是计算机视觉研究领域的分支之一,而且这个课题已经是比较成熟了,并且在商业中已经有很多落地项目了。比如汉王OCR,百度OCR,阿里OCR等等,很多企业都有能力都是拿OCR技术开始挣钱了。其实我们自己也能感受到,OCR技术确实也在改变着我们的生活:比如一个手机APP就能帮忙扫描名片、身份证,并识别出里面的信息;汽车进入停车场、收费站都不需要人工登记了,都是用车牌识别技术;我们看书时看到不懂的题,拿个手机一扫,APP就能在网上帮你找到这题的答案。太多太多的应用了,OCR的应用在当今时代确实是百花齐放啊。

    OCR的分类

    如果要给OCR进行分类,我觉得可以分为两类:手写体识别和印刷体识别。这两个可以认为是OCR领域两个大主题了,当然印刷体识别较手写体识别要简单得多,我们也能从直观上理解,印刷体大多都是规则的字体,因为这些字体都是计算机自己生成再通过打印技术印刷到纸上。在印刷体的识别上有其独特的干扰:在印刷过程中字体很可能变得断裂或者墨水粘连,使得OCR识别异常困难。当然这些都可以通过一些图像处理的技术帮他尽可能的还原,进而提高识别率。总的来说,单纯的印刷体识别在业界已经能做到很不错了,但说100%识别是肯定不可能的,但是说识别得不错那是没毛病。

    印刷体已经识别得不错了,那么手写体呢?手写体识别一直是OCR界一直想攻克的难关,但是时至今天,感觉这个难关还没攻破,还有很多学者和公司在研究。为什么手写体识别这么难识别?因为人类手写的字往往带有个人特色,每个人写字的风格基本不一样,虽然人类可以读懂你写的文字,但是机器缺很难。那为什么机器能读懂印刷体?因为印刷体是机器造出来的啊,那机器当然能读懂自己造的字体啦哈哈~其实上面也提到了,印刷体一般都比较规则,字体都基本就那几十种,机器学习这几十种字体并不是一件难事,但是手写体,每个人都有一种字体的话,那机器该学习多少字体啊?这就是难度所在。

    如果按识别的内容来分类,也就是按照识别的语言的分类的话,那么要识别的内容将是人类的所有语言(汉语、英语、德语、法语等)。如果仅按照我们国人的需求,那识别的内容就包括:汉字、英文字母、阿拉伯数字、常用标点符号。根据要识别的内容不同,识别的难度也各不相同。简单而言,识别数字是最简单了,毕竟要识别的字符只有0~9,而英文字母识别要识别的字符有26个(如果算上大小写的话那就52个),而中文识别,要识别的字符高达数千个(二级汉字一共6763个)!因为汉字的字形各不相同,结构非常复杂(比如带偏旁的汉字)如果要将这些字符都比较准确地识别出来,是一件相当具有挑战性的事情。但是,并不是所有应用都需要识别如此庞大的汉字集,比如车牌识别,我们的识别目标仅仅是数十个中国各省和直辖市的简称,难度就大大减少了。当然,在一些文档自动识别的应用是需要识别整个汉字集的,所以要保证识别的整体的识别还是很困难的。

    OCR流程

    现在就来整理一下常见的OCR流程,为了方便描述,那就举文档中的字符识别为例子来展开说明吧。

    假如输入系统的图像是一页文本,那么识别时的第一件事情是判断页面上的文本朝向,因为我们得到的这页文档往往都不是很完美的,很可能带有倾斜或者污渍,那么我们要做的第一件事就是进行图像预处理,做角度矫正和去噪。然后我们要对文档版面进行分析,进每一行进行行分割,把每一行的文字切割下来,最后再对每一行文本进行列分割,切割出每个字符,将该字符送入训练好的OCR识别模型进行字符识别,得到结果。但是模型识别结果往往是不太准确的,我们需要对其进行识别结果的矫正和优化,比如我们可以设计一个语法检测器,去检测字符的组合逻辑是否合理。比如,考虑单词Because,我们设计的识别模型把它识别为8ecause,那么我们就可以用语法检测器去纠正这种拼写错误,并用B代替8并完成识别矫正。这样子,整个OCR流程就走完了。从大的模块总结而言,一套OCR流程可以分为:

        版面分析 -> 预处理-> 行列切割 -> 字符识别 -> 后处理识别矫正 

    从上面的流程图可以看出,要做字符识别并不是单纯一个OCR模块就能实现的(如果单纯的OCR模块,识别率相当低),都要各个模块的组合来保证较高的识别率。上面的流程分的比较粗,每个模块下还是有很多更细节的操作,每个操作都关系着最终识别结果的准确性。做过OCR的童鞋都知道,送入OCR模块的图像越清晰(即预处理做的越好),识别效果往往就越好。那现在对这流程中最为重要的字符识别技术做一个总结。

    识别方法

    现在我们只想单纯地想对字符进行识别,那方法会有哪些呢?我列了一下可以采取的策略:

    • 使用谷歌开源OCR引擎Tesseract
    • 使用大公司的OCR开放平台(比如百度),使用他们的字符识别API
    • 传统方法做字符的特征提取,输入分类器,得出OCR模型
    • 暴力的字符模板匹配法
    • 大杀器:基于深度学习下的CNN字符识别

    上面提到的OCR方法都有其有点和缺点,也正如此,他们也有各自特别适合的应用场景。

    首先说开源OCR引擎Tesseract。搞字符识别的童鞋应该都听说过Tesseract这个东西,这是谷歌维护的一个OCR引擎,它已经有一段相当悠久的历史了。Tesseract现在的版本已经支持识别很多种语言了,当然也包括汉字的识别。毕竟Tesseract是外国人搞得一个东西,所以在汉字识别的精度上还是不能摆上台面,不过还是自己去改善。但是Tesseract在阿拉伯数字和英文字母上的识别还是可以的,如果你要做的应用是要识别英文或者数字,不妨考虑一下使用Tesseract,毕竟拿来就能得到不错的结果。当然啦,要做到你想要的识别率,后期微调或者优化肯定要多下功夫的。

    接下来说一下借用OCR开放平台做文字识别。现在很多大公司都开放了OCR的API供开发者调用,当然啦,小量调用是不收费的,但是大量调用就要收费了。最近我也在百度开放平台上调用OCR的API做一些识别的工作,说实话,在汉字的识别上,我们中国公司的技术还是顶尖的,在汉字识别的准确率上已经让人很满意了。比如我要识别一些文本,自己写个python脚本,调用开放平台的服务,返回的就是识别结果了。这种模式有啥不好的地方吗?首先是需要钱(当然每天小批量识别一下是不用钱的),第二是自己的控制程度不足,我们想要提升识别精度,我们不可以从OCR识别上做改进(毕竟别人的东西,我们改不了),能做只是预处理和后期矫正,能做的还是比较有限的。但是,如果自己不想花大量时间做OCR模型并且手上有钱的话,这种识别方法还是OK的。

    上面提到的都是用的是别人的东西,那我们想从头自己做,咋办?

    那就自己做吧!先谈一谈字符模板那匹配法。暴力的字符模板匹配法看起来很蠢,但是在一些应用上可能却很凑效。比如在对电表数字进行识别时,考虑到电表上的字体较少(可能就只有阿拉伯数字),而且字体很统一,清晰度也很高,所以识别难度不高。针对这种简单的识别场景,我们首先考虑的识别策略当然是最为简单和暴力的模板匹配法。我们首先定义出数字模板(0~9),然后用该模板滑动匹配电表上的字符,这种策略虽然简单但是相当有效。我们不需要左思右想去建模,训练模型,只需要识别前做好模板库就可以了。

    模板匹配法只限于一些很简单的场景,但对于稍微复杂的场景,那就不太实用了。那此时我们可以采取OCR的一般方法,即特征设计、特征提取、分类得出结果的计算机视觉通用的技巧。在深度学习大放异彩之前,OCR的方法基本都是这种方法,其效果嘛,并不算特别好。在这里简单说一下这里常见的方法。第一步是特征设计和提取,特征设计是一件很烦人的事情,做过模式识别相关项目的童鞋也深有体会,我们现在识别的目标是字符,所以我们要为字符设计它独有的的特征,来为后面的特征分类做好准备。字符有啥特征呢?有结构特征,即字符的端点、交叉点、圈的个数、横线竖线条数等等,都是可以利用的字符特征。比如“品”字,它的特征就是它有3个圈,6条横线,6条竖线。除了结构特征,还有大量人工专门设计的字符特征,据说都能得到不错的效果。最后再将这些特征送入分类器(SVM)做分类,得出识别结果。这种方式最大的缺点就是,人们需要花费大量时间做特征的设计,这是一件相当费工夫的事情。通过人工设计的特征(例如HOG)来训练字符识别模型,此类单一的特征在字体变化,模糊或背景干扰时泛化能力迅速下降。而且过度依赖字符切分的结果,在字符扭曲、粘连、噪声干扰的情况下,切分的错误传播尤其突出。针对传统OCR解决方案的不足,学界业界纷纷拥抱基于深度学习的OCR。

    这些年深度学习的出现,让OCR技术焕发第二春。现在OCR基本都用卷积神经网络来做了,而且识别率也是惊人的好,人们也不再需要花大量时间去设计字符特征了。在OCR系统中,人工神经网络主要充当特征提取器和分类器的功能,输入是字符图像,输出是识别结果,一气呵成。这里就不再展开说明卷积神经网络了,想要知道的细节的可以看我以前写过的一篇博客《卷积神经网络CNN总结》。当然用深度学习做OCR并不是在每个方面都很优秀,因为神经网络的训练需要大量的训练数据,那么如果我们没有办法得到大量训练数据时,这种方法很可能就不奏效了。其次,神经网络的训练需要花费大量的时间,并且需要用到的硬件资源一般都比较多,这几个都是需要考虑的问题。

    在接下来的博客中,我将在工程上一一实现以上说到的几种OCR的识别方法~~

    OCR的发展

    在一些简单环境下OCR的准确度已经比较高了(比如电子文档),但是在一些复杂环境下的字符识别,在当今还没有人敢说自己能做的很好。现在大家都很少会把目光还放在如何对电子文档的文字识别该怎么进一步提高准确率了,因为他们把目光放在更有挑战性的领域。OCR传统方法在应对复杂图文场景的文字识别显得力不从心,越来越多人把精力都放在研究如何把文字在复杂场景读出来,并且读得准确作为研究课题,用学界术语来说,就是场景文本识别(文字检测+文字识别)。

    从上图可以看出,自然场景下的文字识别比简单场景的文字识别实在困难太多了,现在虽然出了很多成果,但是离理想结果还是差很远。

    当然啦,除上面的场景文字识别外,历史悠久的手写体的识别到现在还是一件具有挑战的课题,在深度学习的浪潮下,手写体的识别已经前进了一大步,但是尚且没达到印刷体识别那种可以商用的地步,所以啊,OCR的研究还得不断地进行下去。

    展开全文
  • 从事OCR识别工作已经一个月了。从最初的懵懂,到如今略微有些见解,很感谢这一个月来自己的努力。现在总结一下,希望能够帮助到大家。  公司针对的OCR识别背景是文本文字,虽然背景相对自然环境简单,但用户提供的...

              从事OCR识别工作已经一个月了。从最初的懵懂,到如今略微有些见解,很感谢这一个月来自己的努力。现在总结一下,希望能够帮助到大家。

          公司针对的OCR识别背景是文本文字,虽然背景相对自然环境简单,但用户提供的图片数据纷繁多样。无论是模糊度还是噪声,直线与分数线的的提取,倾斜校正,字符的粘连拆分,相邻bounding的合并等技术难题,都需要一点点克服。公司要求有很大的准确率,但是图像处理受光照,相机,拍照水平等因素影响,一套算法很难适应所有图片。并且汉字识别相比英文字符识别难度更大,文本中的公式提取又是一个很大的技术难题等等。实习一个月来最大的感受是学校实验室与公司间的不同。在实验室,老师要求比较松,好多时间都被视频浪费掉了。实习一个月,感觉学的内容大于研究生一年级全年,差别明显。所以建议现在仍在读书的同学们,如果有机会,找个大公司去实习吧。

          好了,言归正传,说点正事。

          首先开发环境是:vs2013 与opencv 

         我们先贴出具体流程图:

                                                      

          主要从以下几个方面讲讲:

    OCR预处理
    1 模糊度判断
    2 二值化
    3 连通域提取
    4 bounding框
    5 判断是否为合格二值化

    1 模糊度判断

       通常来讲,图像的边缘梯度越大,也就是背景与前景的对比度越大,我们看起来就越清晰,图像处理就越方便。但是实际数据中我们看到的图片真是令人发指。有时候想想就这拍照水平还把图传上来,也是醉了。 但是没办法,用户是上帝嘛,为了解决问题,我们必须硬着头皮做呀! 对于模糊的图片,根据其特点, 我们首先利用sobel滤波器提取其边缘,再利用OTSU 大律法选择阈值进行二值化,最后根据二值化中有效信息的数量占总像素的之比来判断模糊度。 具体算法过几天我会贴出来。

    2 图像二值化

          提到二值化,好多人不屑的漏出了一幅嫌弃的表情:“切,不就是两个值嘛,用得着还写个博客,装啥子呢!”。嘿嘿,请原谅俺的无聊。但是当你仔细研究OCR后,二值化的结果对最后的识别结果起着很关键的作用。不要小看哦!

          通常有全局二值化与局部二值化两种方式,由于图像受光照、阴影等因素影响,全局二值化就受到了很大的限制,我们放弃。 局部二值化根据像素点周围像素间的关系进行二值化,在opencv中用自适应二值化函数 adaptivethreshold ,具体实现原理我会单独发一篇博客写。 说句实话,我的第一周就用adaptivethershold试了很多参数,看了很多图片,最后确定了一个合理的阈值。(鉴于公司内代码,不在这里公布了) 当然一个阈值是搞不定了,我写了个函数主要是通过不同的阈值,在众多二值图中选择一个合适的。   其实一个思想就是 根据不同的模糊度来使用不同的阈值。

    3 连通域提取

       这部分我们简单的讲 opencv里面函数是findContours,另外我们可以根据连通域的面积剔除小面积的连通域。具体实现细节过几天我会贴出

    4 bounding框   

    这里用到了opencv的boundingRect  得到了基于连通域的rect  数组


    5 判断是否为合格的二值化图

     对于清晰的图像,通常以上那种方法可以解决问题。但对于噪声比较多的图片,我们得到的bounding框有很多都是没有用的,首先我们可以根据bounding框的规则来判断一个二值图是否为合适的二值图。当二值图不符合要求时,我们在对原图进行一次降采样,这样就将噪声去除了很多。然后在进行一次上次运算,这样算出来基本能够得到我们想要的结果。


    6 接下来我们还要解决 字符粘连与分裂的情况以及直线提取、公式提取、根号提取、箭头提取等。具体解决方案我会慢慢讲解。

    7 程序与图片我会慢慢贴出来,请大家慢慢等。  一起学习哈。




           


    展开全文
  • Abstract 2 一 引言:... 3 二 字符图像获取:...... 三 字符预处理......3.2 字符区域…………………………………………………………...四 模板字符识别... 5 4.2 字符模板归一化... 5 五BP神经网络字符识别... 5 5.
  • OCR字符识别

    2012-08-07 20:56:08
    OCR字符识别  2012-07-23 16:36:34| 分类: 图像处理与计算机 | 标签:ocr  |字号大中小 订阅 简单、直观的实现优于复杂、难懂的实现,最近开发扑克识别过程的总结 ...最近开发了款通用的扑克识别...
  • 人工智能之字符识别

    2019-01-15 17:51:32
    上篇文章讲解了PCA主成分分析,这篇文章使用该训练模型实现验证码识别,同时作者也会提供全部源代码。希望能够帮助到大家。 2 图像原理 在计算机图形学里,位图就是一个像素的矩阵,矩阵中的每一个点都是各种颜色的...
  • 1 字符识别简介 字符识别是车牌识别中很重要的一部分,在模式识别中也扮演的很重要的角色。当然,我们可以用很多方法拉进行字符识别,比如:基于向量机(SVM),神经网络,小波等方法。当然基于模板匹配也是一种方法...
  • 车牌识别 字符识别

    2013-06-27 09:02:54
    摘要:提出了一种完全基于结构知识的字符识别方法。该方法以字符的结构特点和笔画类型、数据及位置作为识别特片生成判定时,再利用判定树对汽车牌照中的字母和数字进行分类识别。  关键词:车牌号码 字符结构 ...
  • 首先车牌字符识别算法原理是怎样的,车牌识别技术要求能够将运动中的汽车牌照从复杂背景中提取并识别出来,通过车牌提取、图像预处理、特征提取、车牌字符识别等技术,识别车辆牌号、颜色等信息,目前最新的技术水平...
  • OCR字符识别检测

    2018-06-12 16:22:32
    一、字符识别系统描述 本系统用于电子秤出厂前校验过程中显示重量数字的读取及发送功能,系统采用进口工业相机,可以快速获取产品图像,通过图像识别、分析和计算,给出电子秤显示的重量数值,也可根据误差范围进行...
  • 第18章 光学字符识别_OCR OCR(Optical Character Recongnition)即我们通常意义上讲的光学字符识别。在HALCON中,OCR常被用来分割区域及读取识别图像中的字符含义。 HALCON中提供了一组预先训练好的字体(在安装...
  • 字符识别经验总结: 一、 视频帧中字符的识别(video ocr): 难点1:视频流中,出现字符后,立即开始采集含有字符的视频帧; 难点2:对视频帧中字符区域的定位; 难点3:快速有效的识别出字符;   ...
  • 字符识别方法目前主要有基于模板匹配算法和基于人工神经网络算法。 基于模板匹配算法:首先将分割后的字符二值化,并将其尺寸大小缩放为字符数据库中模板的大小,然后与所有的模板进行匹配,最后选最佳匹配作为结果。...
  • 由于字符识别相对于前面的车牌定位而言,显得较为简单。不像在一个复杂和低分辨场景下进行车牌定位,在字符分割和识别的部分时,所需要处理的场景已经较为固定了,因此其处理技术也较为单一。 一、字符分割 英文...
  • 字符识别经验总结: 一、 视频帧中字符的识别(video ocr): 难点1:视频流中,出现字符后,立即开始采集含有字符的视频帧; 难点2:对视频帧中字符区域的定位; 难点3:快速有效的识别出字符;   其中视频帧中...
  • 牛奶盒喷码字符识别(基于opencv)————(三)字符的识别效果方法1.制作模板2.读入模板,3.读入分割出来的图片4.逐一匹配不足 效果 先看效果吧 效果极佳, 方法 1.制作模板 将分割出来的数字,效果很...
1 2 3 4 5 ... 20
收藏数 458,693
精华内容 183,477
热门标签
关键字:

字符识别