精华内容
下载资源
问答
  • opencv学习——OCR字符识别特征提取

    千次阅读 2019-01-06 18:08:41
    方法:可选用水平累积直方图、垂直累积直方图特征以及低分辨图像...这样,通过features函数可提取出每一个训练样本的特征F_NUM,作为ANN的输入层 Mat layerSizes = (Mat_(1, 3) , Hidden_NUM, classSum);  

    方法:可选用水平累积直方图、垂直累积直方图特征以及低分辨图像作为特征,用于训练的输入层

    图中低分辨率图像的像素为5*5

    1、水平和垂直累积直方图

    a、使用countNonZero函数计算每一行或每一列的非0像素数,存放在矩阵mhist中

    b、使用minMaxLoc函数求出mhist中的最大值

    c、使用convertTo函数将mhist中所有的元素都除以这个最大值

    Mat 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;
    }

    2、特征提取

    mhist的所有元素+vhist的所有元素+低分辨率图像的所有像素

    低分辨率图像可以是5*5,10*10,15*15,20*20,需要训练和测试来确定哪个最适合

    Mat features(Mat in, int sizeData){
        //Histogram features
        Mat vhist=ProjectedHistogram(in,VERTICAL);
        Mat hhist=ProjectedHistogram(in,HORIZONTAL);
        
        //Low data feature
        Mat lowData;
        resize(in, lowData, Size(sizeData, sizeData) );
    
        if(DEBUG)
            drawVisualFeatures(in, hhist, vhist, lowData);
        
       
        //Last 10 is the number of moments components
        int numCols=vhist.cols+hhist.cols+lowData.cols*lowData.cols;
        
        Mat out=Mat::zeros(1,numCols,CV_32F);
        //Asign values to feature
        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;
    }

    这样,通过features函数可提取出每一个训练样本的特征F_NUM,作为ANN的输入层

    Mat layerSizes = (Mat_<int>(1, 3) << F_NUM, Hidden_NUM, classSum);

     

    展开全文
  • OCR字符识别

    2020-08-03 19:05:29
    OCR(Optical Character Recognition),全称光学字符识别技术,在HALCON中,OCR常被用来分割区域及读取识别图像中的字符含义。

    OCR(Optical Character Recognition),全称光学字符识别技术,在HALCON中,OCR常被用来分割区域及读取识别图像中的字符含义。

    字符识别OCR原理及应用实现
    OCR指电子设备(扫描仪、数码相机等)检测在纸上打印的字符,通过检测暗亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程。

    工业场景的图像文字识别更加复杂,出现在很多不同的场合。例如医药品包装上的文字、各种钢制部件上的文字、容器表面的喷涂文字、商店标志上的个性文字等。在这样的图像中,字符部分可能出现在弯曲阵列、曲面异形、斜率分布、皱纹变形、不完整等各种形式中,并且与标准字符的特征大不相同,因此难以检测和识别图像字符。

    对于文字识别,实际中一般首先需要通过文字检测定位文字在图像中的区域,然后提取区域的序列特征,在此基础上进行专门的字符识别。但是随着CV发展,也出现很多端到端的End2End OCR。

    展开全文
  • Halcon OCR字符识别

    万次阅读 多人点赞 2019-06-10 16:39:27
    halcon里面的分类器(把要识别的目标的...1)生成一个.trf训练文件,将图像上的需要识别的字符区域与真正的字符输入进去 注意:图像上每个字体都要形成一个连通域 2)创建一个训练器,对特征,比如颜色、纹理等特...

            OCR(Optical Character Recognition),光学字符识别,是指使用扫描仪或数码相机等电子设备检查纸上的字符,通过检测暗、亮的方法确定字符的形状,并使用字符识别方法把字符转化为计算机数据的过程;即对文本资料进行扫描,然后对图像文件进行图像处理和分析,最终获取文字的过程。

    一、OCR主要步骤:

            获取图像、选取感兴趣区域(ROI,Region ofInterest)、图像校正、图像预处理(滤波)、提取分割参数、分割图像等步骤主要运用图像处理技术。训练OCR、读取特征、显示结果、摧毁分类器等步骤主要运用人工神经网络技术。

    在这里插入图片描述
    图像预处理

    • 倾斜校正
      模板匹配
    • 降噪
      滤波、光照处理
    • 增强(可选)
      灰度拉伸
    • 二值化
      由灰度图像变成二值图像

    图像分割

    • 行分割
      身份证图像字符信息分布规则,每行有一定间隙;采用水平投影法进行图像分割
      在这里插入图片描述
    • 字符分割
      垂直投影
      在这里插入图片描述

    字符识别,即模式识别技术

    • 训练OCR(或读取Halcon中自带的训练分类器)
    • 读取特征

    识别结果处理

    • 例程验证

           可能有些人在图像处理技术里面会有做着做着就不知道下一步该干什么了的问题,其实,我们要知道我们前面应用图像处理技术这一步的目的是什么,无非就是把需要识别的字符分割出来。那么大方向有了,细节其实就没有那么死板了,是很灵活的,只要记住字体有倾斜要校正,后面一系列处理都是为分割服务的,无非就是用二值化、形态学、特征提取、然后分割(点状字体要intersection求一下交集,将点连接起来形成一个连通域)这些套路,至于其中一些具体细节、方法需要大家实战积累,最后交给后面的识别就妥了。

    二、模式识别技术

    1、训练OCR分为离线处理在线识别

    • 离线处理:包括训练字体,将区域代表的字母或数字提取出来并以相应的字符名储存在训练文件中,用来训练字体的训练文件中的内容可以有选择的进行再次修改。
      离线处理过程:
      1)生成训练文件.trf:每一个字符的大量训练样本存在训练文件.trf 中
      注意:图像上每个字体都要形成一个连通域
      2)创建训练器:对如颜色、纹理等特征进行分类。Halcon中的分类器主要有多层神经网络(MLP)、支持向量机(SVM) 、K-最邻近 (K-NN)、高斯混合类型(GMM)
      3)训练分类器:训练文件.trf+新ocr分类器
      4)保存分类器
      5)识别字符:do_ocr_multi_class_mlp(一起识别)或 do_ocr_single_class_mlp(逐个识别)
    • 在线识别部分:读取已经训练好的字体文件(.ocm)或Halcon自带的训练文件(.ocm),通过图像预处理将图像中的字符区域提取并分割来,再使用分类器对提取出来的区域进行识别。
      在这里插入图片描述

    三、实战 1:以食品包装袋生产日期为例

    dev_close_window ()
    dev_open_window (0, 0, 680, 300, 'black', WindowHandle)
    *定位
    read_image (Image2, 'C:/Users/Administrator/Desktop/2.bmp')
    disp_message (WindowHandle, '请绘制ROI区域,我的宝贝', 'window', 12, 12, 'blue', 'true')
    draw_rectangle2 (WindowHandle, Row, Column, Phi, Length1, Length2)
    gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
    *校正
    area_center (Rectangle, Area, Row1, Column1)
    text_line_orientation (Rectangle, Image2, 75, -Phi, Phi, OrientationAngle)
    vector_angle_to_rigid (Row1, Column1, OrientationAngle, Row1, Column1, 0, HomMat2D)
    affine_trans_image (Image2, ImageAffinTrans, HomMat2D, 'constant', 'false')
    affine_trans_region (Rectangle, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
    *字符分割
    reduce_domain (ImageAffinTrans, RegionAffineTrans, ImageReduced)
    dots_image (ImageReduced, DotImage, 15, 'dark', 0)
    binary_threshold (DotImage, Region, 'max_separability', 'light', UsedThreshold)
    dilation_rectangle1 (Region, RegionClosing, 10, 10)
    connection (RegionClosing, ConnectedRegions)
    shape_trans (ConnectedRegions, RegionTrans, 'rectangle1')
    select_shape (RegionTrans, SelectedRegions, ['height','width'], 'and', [69.184,27.55], [200,200])
    partition_rectangle (SelectedRegions, Partitioned, 45, 85)
    intersection (Partitioned, Region, RegionIntersection)
    *字符识别
    sort_region (RegionIntersection, SortedRegions, 'character', 'true', 'row')
    read_ocr_class_mlp ('C://Users//Administrator//Desktop//halcon程序//包装袋生产日期识别//DotPrint_0-9A-Z.omc', OCRHandle)
    do_ocr_multi_class_mlp (SortedRegions, ImageReduced, OCRHandle, Class, Confidence)
    *字符显示
    dev_display (ImageAffinTrans)
    count_obj (SortedRegions, Number)
    smallest_rectangle1 (SortedRegions, Row11, Column1, Row2, Column21)
    for i := 1 to  Number by 1
        disp_message (WindowHandle, Class[i - 1], 'image', Row2[i - 1]+120, Column1[i - 1], 'blue', 'false')
    endfor
    

    在这里插入图片描述

    实战 2:表盘数字

    dev_close_window ()
    dev_open_window (0, 0, 680, 320, 'black', WindowHandle)
    set_display_font (WindowHandle, 40, 'mono', 'true', 'false')
    read_image (Image2, 'C:/Users/Administrator/Desktop/halcon程序/温度计表盘识别/字符.bmp')
    mirror_image (Image2, ImageMirror, 'row')
    mirror_image (ImageMirror, ImageMirror1, 'column')
    *1、预处理
    scale_image (ImageMirror1, ImageScaled, 4.39655, -853)
    *2、Blob分析定位
    threshold (ImageScaled, Regions, 0, 42)
    connection (Regions, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, ['area','width','height'], 'and', [0,621.9,408.06], [459711,2000,542.36])
    reduce_domain (ImageMirror1, SelectedRegions, ImageReduced)
    *3、字符分割
    threshold (ImageReduced, Regions1, 67, 129)
    connection (Regions1, ConnectedRegions1)
    select_shape (ConnectedRegions1, SelectedRegions1, ['roundness','height','ra','rb'], 'and', [-0.8673,17.86,34.18,0.663], [0.6755,125,435.2,34.541])
    union1 (SelectedRegions1, RegionUnion)
    *法一:
    *gen_rectangle2 (Rectangle, 16, 16, rad(145), 7, 7)
    *closing (RegionUnion, Rectangle, RegionClosing)
    *connection (RegionClosing, ConnectedRegions2)
    *intersection ( ConnectedRegions2, Regions1, RegionIntersection)
    *法二
    dilation_rectangle1 (RegionUnion, RegionDilation, 10, 10)
    connection (RegionDilation, ConnectedRegions2)
    intersection ( ConnectedRegions2, Regions1, RegionIntersection)
    *4、字符识别
    sort_region (RegionIntersection, SortedRegions, 'character', 'true', 'row')
    
    read_ocr_class_mlp ('Industrial_0-9A-Z_NoRej.omc', OCRHandle)
    do_ocr_multi_class_mlp (SortedRegions, ImageMirror1, OCRHandle, Class, Confidence)
    *5、显示
    dev_display (ImageMirror1)
    count_obj (SortedRegions, Number)
    smallest_rectangle1 (SortedRegions, Row11, Column1, Row2, Column21)
    for i := 1 to  Number by 1
        disp_message (WindowHandle, Class[i - 1], 'image', Row2[i - 1], Column1[i - 1], 'blue', 'false')
    endfor
    

    在这里插入图片描述

    实战 3:环形字符

    
    *1、读取图像
    read_image (Image11, 'C:/Users/Administrator/Desktop/halcon程序/环形字符识别/1.1.bmp')
    dev_close_window ()
    dev_open_window (0, 0, 480, 480, 'black', WindowHandle)
    dev_display (Image11)
    get_image_size (Image11, Width, Height)
    *2、环形字符校正
    rgb1_to_gray (Image11, GrayImage)
    scale_image (GrayImage, ImageScaled, 1, 0)
    *求环形外圆区域
    threshold (ImageScaled, Regions, 0, 106)
    shape_trans (Regions, RegionTrans, 'outer_circle')
    *求环形内圆区域
    complement (Regions, RegionComplement)
    opening_circle (RegionComplement, RegionOpening, 8)
    connection (RegionOpening, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1.37755e+006, 2.29592e+006)
    *求内外圆尺寸(圆心坐标和半径)
    *smallest_circle——一个区域周围的最小外接圆
    *内圆
    smallest_circle (SelectedRegions, Row, Column, Radius)
    *外圆
    smallest_circle (RegionTrans, Row1, Column1, Radius1)
    *极坐标转换
    polar_trans_image_ext (GrayImage, PolarTransImage, Row, Column, rad(360), 0, Radius1-100,  Radius+40,1440,100, 'nearest_neighbor')
    *3、预处理+字符分割
    invert_image (PolarTransImage, ImageInvert)
    scale_image (ImageInvert, ImageScaled1, 5.54348, -1147)
    binary_threshold (ImageScaled1, Region, 'max_separability', 'light', UsedThreshold)
    connection (Region, ConnectedRegions1)
    
    select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 67.15, 5000)
    union1 (SelectedRegions1, RegionUnion)
    dilation_rectangle1 (RegionUnion, RegionDilation, 5, 5)
    
    connection (RegionDilation, ConnectedRegions2)
    intersection (ConnectedRegions2, Region, RegionIntersection)
    sort_region (RegionIntersection, SortedRegions, 'character', 'true', 'column')
    *4、字符识别
    read_ocr_class_mlp ('Industrial_0-9A-Z_NoRej.omc', OCRHandle)
    do_ocr_multi_class_mlp (SortedRegions, PolarTransImage, OCRHandle, Class, Confidence)
    *5、显示
    dev_display (PolarTransImage)
    set_display_font (WindowHandle, 40, 'mono', 'true', 'false')
    count_obj (SortedRegions, Number)
    smallest_rectangle1 (SortedRegions, Row11, Column1, Row2, Column21)
    for i := 1 to  Number by 1
        disp_message (WindowHandle, Class[i - 1], 'image', Row2[i - 1]+10, Column1[i - 1], 'blue', 'false')
    endfor
    

    核心思想:先进行极坐标转换,把环形区域拉直,后面套路一样,字符分割、提取、识别
    关键代码:将图像直角坐标系转换成极坐标系函数
    polar_trans_image_ext(Image :输入图像
                                                  PolarTransImage :输出图像
                                                  Row, 环形区域中心点y坐标
                                                  Column, 环形区域中心点x坐标
                                                  AngleStart, 要拉直的环形区域起始角度(与x轴正方向)
                                                  AngleEnd, 要拉直的环形区域终点角度
                                                  RadiusStart,要拉直的环形区域内圆与原点的距离
                                                  RadiusEnd, 要拉直的环形区域外圆与原点的距离
                                                  Width, Height, 输出图像的宽(一般1440)、高(一般字符高度)
                                                  Interpolation : 变换的差值算法)
    在这里插入图片描述
    在这里插入图片描述
    注:因为直接用的halcon训练好的文件,里面并没有训练&,所以会显示8

    总结:一般我们拿到图像后,一般都需要对目标区域进行校正处理,也就是几何变换,几何变换种类有:

    • 极坐标转换:针对环形字符,将原图像直角坐标转换成极坐标,拉直polar_trans_image_ext()
      zoom_image_factor()
    • 仿射变换:针对倾斜字体进行旋转(位移、缩放)等校正处理
    • 投射变换:针对图像可能不是垂直拍摄的,发生了深度变化、垂直于图像方向发生倾斜时使用
    展开全文
  • 关于halcon的OCR字符识别

    万次阅读 2017-09-15 15:09:16
    一、训练OCR字符库为了识别图像中的文字,需要通过图像训练合适的OCR字符库,这时,我们需要利用到halcon上面的OCR助手。下面,我来教大家如何使用这个OCR助手,并且正确地训练出芯片上的字符。 第一步,我们需要...

    这里写图片描述

    上面的图片是一块芯片的信息,我们通过halcon软件里面的OCR助手将这张图片上面的信息进行字符识别。


    一、训练OCR字符库

    为了识别图像中的文字,需要通过图像训练合适的OCR字符库,这时,我们需要利用到halcon上面的OCR助手。下面,我来教大家如何使用这个OCR助手,并且正确地训练出芯片上的字符。
    第一步,我们需要打开OCR字符助手。

    这里写图片描述

    这里写图片描述

    第二步,我们选择“加载一张实例图像”。

    这里写图片描述

    在这里,我们就把上面的图片加载进来。

    第三步,我们选择“使用一个矩形框在图像中标记出需要识别文本地位置”。
    因为我们这一幅图像上面芯片信息的倾斜角度几乎为0,所以我们选择第一个画倾斜角度为0的矩形框即可。

    这里写图片描述

    在这里,我们可以把合适的字符区域选取出来,防止不必要区域对我们训练OCR字符库造成干扰,让训练出来的效果更加精确。

    这里写图片描述

    第四步,我们需要在“分割”里面对一些参数进行适当的设置,具体的设置需要针对图像的情况而定。特别需要注意的是,由于本幅图像的背景相较于字符是非常暗的色调,我们就需要将“符号外观”中的“暗背景中亮文本”这个选项勾选出来,否则无论如何设置参数,OCR字符的识别都是无法达到理想状态的。

    这里写图片描述

    在这里,当我们按照图上面的参数数值进行设置的情况下,OCR字符的识别效果如下:

    这里写图片描述

    在这里,可以看到,除了第三行的横杠没有被识别出来之外,其余的字符已经被正确地识别。由于在芯片的信息中,我们无需理会横杠的意思,所以可以不做相应的处理。

    第五步,我们选择“字体”,勾选“训练文件”。

    这里写图片描述

    然后,我们需要在“学习”的白色文本框内,逐一将图像上的字符进行手动训练,并将训练结果加入训练数据当中。

    这里写图片描述

    最后,我们需要按下“训练”中的“开始训练”按钮,并将训练出来的文件保存到适当的位置。

    这里写图片描述

    训练出来的文件如下:

    这里写图片描述

    第六步,我们选择“代码生成”中的“插入代码”,便可以将上面这一系列的操作化成我们需要用到的算法,供后续的图像处理使用。

    这里写图片描述

    插入的代码如下:

    **以下这一段代码就是我们刚刚在“分割”里面的一些参数设置算法
    ----------
    create_text_model_reader ('manual', [], TextModel)
    set_text_model_param (TextModel, 'polarity', 'light_on_dark')
    set_text_model_param (TextModel, 'char_width', 25)
    set_text_model_param (TextModel, 'char_height', 60)
    set_text_model_param (TextModel, 'stroke_width', 5)
    set_text_model_param (TextModel, 'return_punctuation', 'false')
    set_text_model_param (TextModel, 'return_separators', 'false')
    set_text_model_param (TextModel, 'fragment_size_min', 10)
    set_text_model_param (TextModel, 'eliminate_border_blobs', 'true')
    set_text_model_param (TextModel, 'base_line_tolerance', 0.8)
    set_text_model_param (TextModel, 'max_line_num', 2)
    ----------
    
    **以下这段代码是将上面训练字符的过程以算法的形式呈现,并最终输出字符的准确区域和识别结果
    ----------
    read_ocr_class_mlp ('Fonts.omc', OcrHandle)          //读取训练出来的OCR字符库句柄
    read_image (Image, 'C:/Works/Chip_Information_Identification/Images/1/LM386N-1芯片.jpg')
    gen_rectangle1 (ROI_OCR_02_0, 16.8333, 56.1667, 143.833, 272.5)          //在第二步里面选择的“使用一个矩形框在图像中标记出需要识别文本地位置”绘制的矩形框
    access_channel (Image, TmpObj_Mono, 1)
    reduce_domain (TmpObj_Mono, ROI_OCR_02_0, TmpObj_MonoReduced_OCR_02_0)
    hom_mat2d_identity (TmpCtrl_MatrixIdentity)
    get_domain (TmpObj_MonoReduced_OCR_02_0, TmpObj_Domain)
    get_system ('clip_region', TmpCtrl_ClipRegion)
    set_system ('clip_region', 'false')
    dilation_circle (TmpObj_Domain, TmpObj_DomainExpanded, 25)          //将选定的矩形框以圆角矩形框的形状扩大25个像素
    affine_trans_region (TmpObj_DomainExpanded, TmpObj_DomainTransformedRaw, TmpCtrl_MatrixIdentity, 'true')
    smallest_rectangle1 (TmpObj_DomainTransformedRaw, TmpCtrl_Row1, TmpCtrl_Col1, TmpCtrl_Row2, TmpCtrl_Col2)          //在TmpObj_DomainTransformedRaw区域内取最小的矩形
    hom_mat2d_translate (TmpCtrl_MatrixIdentity, -TmpCtrl_Row1, -TmpCtrl_Col1, TmpCtrl_MatrixTranslation)
    hom_mat2d_compose (TmpCtrl_MatrixTranslation, TmpCtrl_MatrixIdentity, TmpCtrl_MatrixComposite)
    affine_trans_region (TmpObj_Domain, TmpObj_DomainTransformed, TmpCtrl_MatrixComposite, 'true')
    affine_trans_image (TmpObj_MonoReduced_OCR_02_0, TmpObj_ImageTransformed, TmpCtrl_MatrixComposite, 'constant', 'true')
    dilation_circle (TmpObj_Domain, TmpObj_DomainExpanded, 25)
    expand_domain_gray (TmpObj_ImageTransformed, TmpObj_ImageTransformedExpanded, 25)
    reduce_domain (TmpObj_ImageTransformed, TmpObj_DomainTransformed, TmpObj_ImageTransformedReduced)
    crop_part (TmpObj_ImageTransformedReduced, TmpObj_MonoReduced_OCR_02_0, 0, 0, TmpCtrl_Col2-TmpCtrl_Col1+1, TmpCtrl_Row2-TmpCtrl_Row1+1)
    set_system ('clip_region', TmpCtrl_ClipRegion)
    find_text (TmpObj_MonoReduced_OCR_02_0, TextModel, TmpCtrl_ResultHandle_OCR_02_0)
    invert_image (TmpObj_MonoReduced_OCR_02_0, TmpObj_MonoInverted_OCR_02_0)          //将TmpObj_MonoReduced_OCR_02_0区域反色
    get_text_object (Symbols_OCR_02_0, TmpCtrl_ResultHandle_OCR_02_0, 'all_lines')          //提取出已识别字符的轮廓
    clear_text_result (TmpCtrl_ResultHandle_OCR_02_0)          //将TmpCtrl_ResultHandle_OCR_02_0数组的内存释放
    ----------
    dev_display (TmpObj_MonoInverted_OCR_02_0)
    dev_set_draw ('fill')
    dev_set_colored (3)
    dev_display (Symbols_OCR_02_0)          //将字符轮廓以三种颜色间隔填充的方式显示
    do_ocr_multi_class_mlp (Symbols_OCR_02_0, TmpObj_MonoInverted_OCR_02_0, OcrHandle, SymbolNames_OCR_02_0, Confidences_OCR_02_0)          //将字符的识别结果全部放入SymbolNames_OCR_02_0数组中
    clear_text_model (TextModel)          //将TextModel模型的内存释放
    clear_ocr_class_mlp (OcrHandle)          //将识别出来的OCR字符库句柄的内存释放

    其实,只要我们拥有了能够识别图像字符的参数,它的识别过程是可以由我们自己编写的算法实现的。

    decompose3 (Image, Image_R, Image_G, Image_B)          //将RGB图片Image分离出只包含单一R、G、B这三种颜色的三幅图片,方便我们对单一的三原色图片进行处理
    gen_rectangle1 (Rectangle, 16.9774, 55.8333, 122.626, 242.5)
    reduce_domain (Image_R, Rectangle, ImageReduced)
    threshold (ImageReduced, Region, 0, 85)          //将ImageReduced中阈值为0到85之间的区域选取出来
    fill_up (Region, RegionFillUp)          //填充Region区域
    connection (RegionFillUp, ConnectedRegions)          //将RegionFillUp里面的区域分离
    select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)          //将ConnectedRegions里面面积最大的区域选取出来
    reduce_domain (ImageReduced, SelectedRegions, ImageReduced1)
    find_text (ImageReduced1, TextModel, TextResultID)          //在ImageReduced1内查找TextModel模板
    invert_image (ImageReduced1, ImageInvert)
    get_text_object (Characters, TextResultID, 'all_lines')
    clear_text_result (TextResultID)
    dev_display (Image_R)
    dev_set_draw ('fill')
    dev_set_colored (3)
    dev_display (Characters)
    do_ocr_multi_class_mlp (Characters, ImageInvert, OcrHandle, Class, Confidences)
    clear_text_model (TextModel)
    clear_ocr_class_mlp (OcrHandle)

    二、将单独的字符组合成正确的字符串
    为了能够让识别出来的字符正确地结合成我们需要的字符串,我们需要进行区域填充和膨胀,让代表一个字符串的字符区域能够融合在一起,再在各个区域中读取字符以及其个数,把相应个数的字符提取出来组合再放进数组里。

    **将同一个字符串的字符区域膨胀,设置字符宽度并依次选取字符串区域
    ----------
    union1 (Characters, RegionUnion)          //将Characters里面的区域集合成一个区域
    closing_rectangle1 (RegionUnion, RegionClosing, 25, 10)          //将RegionUnion区域按照长度25,宽度10的矩形膨胀
    connection (RegionClosing, ConnectedRegions3)
    count_obj (ConnectedRegions3, Number1)          //计算ConnectedRegions3内区域的个数
    sort_region (ConnectedRegions3, SortedRegions1, 'first_point', 'true', 'row')          //将ConnectedRegions3内的区域按照列的形式排序,并以相应的数字命名
    character_width1 := 21          //第一种字符宽度
    character_width2 := 15          //第二种字符宽度
    for i := 1 to Number1 by 1          
        read_image (Image, images + 'LM386N-1芯片.jpg')
        select_obj (SortedRegions1, ObjectSelected1, i)          //按顺序选取SortedRegions1内的区域
        reduce_domain (Image, ObjectSelected1, ImageReduced7)
    ----------
    **计算出字符串区域内字符的个数
    ----------
        threshold (ImageReduced7, Region1, 85, 255)
        connection (Region1, ConnectedRegions1)
        select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 0, 150)
        difference (Region1, SelectedRegions1, RegionDifference)
        read_image (Image, images + 'LM386N-1芯片.jpg')
        dev_display (RegionDifference)    //去除杂项后的区域
        area_center (RegionDifference, Area, Row1, Column1)
        character_center_x[i-1] := Column1
        character_center_y[i-1] := Row1
        smallest_rectangle1 (RegionDifference, Row11, Column11, Row2, Column2)
        if(i < Number1)
            character_number[i-1] := (Column2 - Column11) / character_width1  //计算每个字符串里面包含的字符数
        elseif(i = Number1)
            character_number[i-1] := (Column2 - Column11) / character_width2
        endif
    endfor
    ----------
    **把相应数目的字符提取出来组成正确的字符串
    ----------
    tuple_round (character_number, character_number_Round)          //把character_number数组内的字符都化成整形
    read_image (Image, images + 'LM386N-1芯片.jpg')
    for a := 0 to 4 by 1
        New_Class[a] := Class[a+2]
    endfor
    for b := 5 to 6 by 1
        New_Class[b] := Class[b-5]
    endfor
    for c := 7 to 11 by 1
        New_Class[c] := Class[c]
    endfor
    ----------

    三、在窗口显示整理出来的字符串

    for j := 0 to |character_number_Round| - 1 by 1
        tuple_first_n (New_Class, character_number_Round[j] - 1, Selected)
        tuple_sum (Selected, character_string)
        windows_data[j] := character_string
        disp_message (WindowHandle, character_string, 'image', character_center_y[j] - 25, character_center_x[j] + 20, 'black', 'true')
        for k := 0 to character_number_Round[j] - 1 by 1
            tuple_remove (New_Class, 0, New_Class)
        endfor
    endfor

    字符串的显示效果如下:

    这里写图片描述

    展开全文
  • labview 如何实现ocr字符识别?

    千次阅读 2020-09-13 23:41:06
    labview自带vision算法库包含了ocr字符识别,与halcon的区别是需要自己建立字库,今天我们来看看如何利用labview视觉助手建立字库。 ocr工具建立字库 设置参考坐标系 建立新的字库文件 旋转需要训练的...
  • OCR字符切割实例

    千次阅读 2016-06-05 00:01:35
    我们来看个字符分割的实例吧 如图我们能看到字符与线粘连 text-based captcha推荐的方法: 1. 水平或垂直投影的直方图分析 对于细小直线  J. Yan and A.S.E. Ahmad. Breaking visual captchas with naive pattern ...
  • ocr字符识别 Google的光学字符识别 (OCR)软件现在可用于248多种世界语言(包括所有主要的南亚语言)。 它非常简单易用,并且可以检测大多数语言,且准确性超过90%。 该技术从图像中提取文本,对打印的文本进行...
  • 比如,输入银行卡号时,直接用手机摄像头扫一扫,软件就能提取银行卡信息。这里用到的技术正是光学字符识别技术(Optical Character Recognition)。 当然,现在很多工业系统里,都需要用到这个技术,早期受限于技术...
  • OCR字符识别总结(一)

    千次阅读 2015-04-12 13:02:28
    从事OCR识别工作已经一个月了。...无论是模糊度还是噪声,直线与分数线的的提取,倾斜校正,字符的粘连拆分,相邻bounding的合并等技术难题,都需要一点点克服。公司要求有很大的准确率,但是图像处理受
  • OCR识别提取图片中文字原理

    万次阅读 2018-03-30 17:16:53
    OCR识别提取图片中文字原理· 预处理:对包含文字的图像进行处理以便后续进行特征提取、学习。这个过程的主要目的是减少图像中的无用信息,以便方便后面的处理。在这个步骤通常有:灰度化(如果是彩色图像)、降噪...
  • OCR字符识别进行初步研究,发现Google有OCR的识别库,于是尝试测试一下。       OCR,即Optical Character Recognition,光学字符识别,是指通过扫描字符,然后通过其形状将其翻译...
  • 应用OpenCV进行OCR字符识别

    千次阅读 2013-12-27 09:42:49
    opencv自带一个字符识别的例子,它的重点不是OCR字符识别,而主要是演示机器学习的应用。它应用的是UCI提供的字符数据(特征数据)。 DAMILES在网上发布了一个应用OpenCV进行OCR的例子, ...
  • 字符提取代码matlab 多用途图像分析仪 这种多用途图像分析器是 Matlab 脚本/函数的资产,专为 CV 与光学字符识别 (OCR)、图像层提取和其他几个实用程序的低分辨率图形内容交互而设计。 特征 光学字符识别 (OCR) 为了...
  • 本文是跟着datawhale组队学习学的,原文在这:动手学CV-Pytorch 6.2_使用transformer实现OCR字符识别 1.数据集相关操作 #! pip install opencv-python import os import cv2 # 数据集根目录,请将数据下载到此位置
  • 凡眼 文字识别工具用于多用途文字识别和提取,陆续丰富多种识别功能,酌情添加大平台识别通道支持,酌情考虑增加翻译功能等。 使用过程中发现任何bug、有任何改进建议、有需要功能扩展或定制,欢迎在反馈留言告知...
  • 光学字符识别 使用Pytorch特征提取的光学字符识别。
  • SVM与ANN实现OCR字符识别

    万次阅读 2017-03-28 00:55:08
    我们看的很清晰,但是有的样本后面的阴影会很大,可能达到导致人眼有时候都会有错觉,最重要的是有时候我们的需求可能不是要我们识别图片中的某一串数字字符,而不是所有字符,就像我们这个试验中的目标一样(要识别...
  • readiris pro mac破解版是一款专业级别的光学识别OCR软件,可对PDF和OCR等图文内容进行识别提取,能够快速精准的将您的PDF、图像和纸质文档转换为能够编辑的文字。而无需执行所有繁琐的重新输入工作!mac Readiris ...
  • 为缓解汽车数量剧增带来的管理压力,很多停车场开始积极引进OCR车牌识别系统,智能高效完成出入车辆的排查与分类。OCR车牌识别打破传统停车模式传统停车场采用的是刷卡停车系统,车主出入停车场需要通过刷卡记录停车...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,978
精华内容 2,791
关键字:

ocr字符提取