导航:首页 > 文字图片 > c图片文字识别算法

c图片文字识别算法

发布时间:2023-05-28 01:00:44

1. 求教从图片中识别文字的方法和算法,谢谢!

你的文字是扫描仪扫描的打印文本,还是用户手写的?
对于前者要用OCR技术,google提供的免费开源ocr包很厉害的(好像叫tessertocr)!现在版本都3.0支持包括中文在内的很多语言。这是个c语言的包
如果是手写线条,,可以使用微软的tablet组件,他对中文的识别,和汉王不相上下,毕竟是花了10亿美元的货。这个c++ c#都能用,,

2. OCR技术浅析

姓名:吴兆阳  学号:14020199009

转自机器人学习研究会

嵌牛导读:OCR(Optical Character Recognition,光学字符识别)的概念早于1920年代便被提出,一直是模式识别领域中重要的研究方向。近年来,随着移动设备的快速更新迭代,以及移动互联网的快速发展,使得OCR有更为广泛的应用场景,从以往的扫描文件的字符识别,到现在应用到自然场景中图片文字的识别,如识别身份证、银行卡、门牌、票据及各类网络图片中的文字。

嵌牛鼻子:ORC技术

嵌牛提问:什么是ORC,如何使用?

嵌牛正文:

以深度学习兴起的时间为分割点,直至近五年之前,业界最为广泛使用的仍然是传统的OCR识别技术框架,而随着深度学习的崛起,基于这一技术的OCR识别框架以另外一种新的思路迅速突破了原有的技术瓶颈(如文字定位、二值化和文字分割等),并已在工业界得到广泛应用。

笔者针对业务中的身份证照片文字识别需求分别尝试了传统OCR识别框架及基于深度学习的OCR识别框架。下面就以身份证文字识别为例分别简要介绍两种识别框架。

传统OCR技术框架

如上图所示,传统OCR技术框架主要分为五个步骤:

首先文本定位,接着进行倾斜文本矫正,之后分割出单字后,并对单字识别,最后基于统计模型(如隐马尔科夫链,HMM)进行语义纠错。可按处理方式划分为三个阶段:预处理阶段、识别阶段和后处理阶段。其中关键在于预处理阶段,预处理阶段的质量直接决定了最终的识别效果,因此这里详细介绍下预处理阶段。

预处理阶段中包含了三步:

定位图片中的文字区域,而文字检测主要基于连通域分析的方法,主要思想是利用文字颜色、亮度、边缘信息进行聚类的方式来快速分离文字区域与非文字区域,较为流行的两个算法分别是:最大极值稳定区域(MSER)算法及笔画宽度变换(SWT)算法,而在自然场景中因受到光照强度、图片拍摄质量和类文字背景的干扰,使得检测结果中包含非常多的非文字区域,而目前从候选区域区分出真正文字区域主要两种方法,用规则判断或轻量级的神经网络模型进行区分;

文本区域图像矫正,主要基于旋转变换和仿射变换;

行列分割提取出单字,这一步利用文字在行列间存在间隙的特征,通过二值化并在投影后找出行列分割点,当在文字与背景的区分度较好时,效果很好,而拍摄的图片中光照、摄像质量的影响,并且文字背景难以区分时,常造成错误分割的情况。

下面介绍基于传统OCR框架处理身份证文字识别:

身份证识别技术流程与上述框架稍微有所差异。对该问题,已知先验信息:a.证件长宽固定;b.字体及大小一致;c.文本相对于证件位置固定;d.存在固定文字。因此,处理该问题的思路为:先定位目标物体(证件),矫正后提取文字进行识别,最后进行语义纠错,如下图:

目标物体定位并矫正。基于现有的先验信息,定位最后的方法为采用模板关键点特征匹配的方法,并利用模板上特征点及目标图像特征点坐标之间的关系进行透视变换,以定位目标物体,如下图所示。接着,基于四角的坐标,进行旋转、仿射、尺寸的变换,并提取出目标物体的俯视图。

因文字位置相对固定,接着便分割出文字区域,二值化后,行列分割出单个字符。这里的技术难点在于二值化,二值化效果的好坏直接影响字符分割,并最终影响识别结果。受光照和拍摄质量的影响,全局二值化难以设置统一的阈值,而自适应二值化算法易受到阴影及模糊边界的干扰。所以在这边尝试过许多方法,测试下来未发现在任何情形下效果都满足要求的方法。

分割出单字后接着用分类器进行识别,并在这步基于统计上的先验信息定义了一个简单的优化函数,可看做1-gram语言模型。先验信息为:2400(总共660273)汉字的使用频率之和为99%以上。定义的优化函数为:

式中,Pi为该字出现的概率,confi为置信度值。

下图给出了示例:

因上述的优化过程中假定各状态相互独立并与上一状态没有联系,故不可避免存在语义上的错误。而如何基于现有的输出序列,对序列进行语义上的修正,那么最直观的想法就是用隐马尔可夫模型(Hidden Markov Model,HMM)解决这个问题,其基于观察序列,求出最优隐序列。其可以抽象为如下图的过程。在给定O序列情况下,通过维特比算法,找出最优序列S:

传统OCR冗长的处理流程以及大量人工规则的存在,使得每步的错误不断累积,而使得最终识别结果难以满足实际需求。接下来讨论基于深度学习的OCR。

基于深度学习的OCR识别框架

目前,从技术流程上来说,主要分为两步,首先是检测出图像中的文本行,接着进行序列识别。 可见,基于深度学习的OCR识别框架相比于传统OCR识别框架,减少了三个步骤,降低了因误差累积对最终识别结果的影响。

文本行检测,其又可分为水平行文字检测算法与倾斜文字行检测算法。这里主要介绍下Tian提出算法CTPN,其算法框架如下图。主要思路是将文本行识别看做一个序列识别问题,不同于一般的目标检测问题,引入RNN来利用上下文的信息。

具体流程为:

用VGG16的5个卷积层得到特征图(feature map,W*H*C);

在Conv5的feature map的每个位置上取3*3*C的窗口的特征,这些特征将用于预测该位置k个anchor(anchor的定义和Faster RCNN类似)对应的类别信息,位置信息;

将每一行的所有窗口对应的3*3*C的特征(W*3*3*C)输入到RNN(BLSTM)中,得到W*256的输出;

将RNN的W*256输入到512维的fc层;

fc层特征输入到三个分类或者回归层中。第二个2k scores 表示的是k个anchor的类别信息(是字符或不是字符)。第一个2k vertical coordinate和第三个k side-refinement是用来回归k个anchor的位置信息。2k vertical coordinate表示的是bounding box的高度和中心的y轴坐标(可以决定上下边界),k个side-refinement表示的bounding box的水平平移量。这边注意,只用了3个参数表示回归的bounding box,因为这里默认了每个anchor的width是16,且不再变化(VGG16的conv5的stride是16)。回归出来的box如Fig.1中那些红色的细长矩形,它们的宽度是一定的;

用简单的文本线构造算法,把分类得到的文字的proposal(图Fig.1(b)中的细长的矩形)合并成文本线。

上图为给出基于CTPN的例子,框线部分是算法识别出的文字行,可见在图片光照不均、人工合成及文字背景对比不明显的情形下均有很好的效果。 相比于传统文字定位方法,具有更好的鲁棒性及明显的优势。

文字行识别。近两年比较受关注的主要有两种,一种是CNN+RNN+CTC的方法,另外一种是用attention model+CNN+RNN的方法。这里主要介绍下CNN+RNN+CTC,算法框架由图给出。分为三层,CNN层、RNN层及解码(transcription)层。在CNN层,用于提取图像特征,利用Map-to-Sequence表示成特征向量;在RNN层,用双向LSTM识别特征向量,得到每列特征的概率分布;在解码层,利用CTC和前向后向算法求解最优的label序列。因此,该方法能够识别不定长的文字行。

两个例子:

Out:辽宁省长海县广鹿乡沙尖

Out:河南省邓州市九龙乡姚营

3. 使用原始的c语言把bmp格式的图片识别成文字

这个是最初级的OCR了
很麻烦的
可以到网上找找开源的ocr代码参考一下。

4. 怎么在c语言中调用腾讯云的ocr文字识别api来识别文字

服务简介:手写体 OCR 识别,根据用户上传的图像,返回识别出的字段信息。
计费说明:本接口按实际使用量计费,具体定价请查看 计费说明。
URL说明:支持 http 和 https 两种协议:
http://recognition.image.myqcloud.com/ocr/handwriting
https://recognition.image.myqcloud.com/ocr/handwriting
然后就是向它POST相应格式的数据就行了(用socket连接,发送HTTP request)。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
请求方式
请求头 header

参数名 必选 值 描述

host 是 recognition.image.myqcloud.com 腾讯云文字识别服务器域名
content-length 否 包体总长度 每个请求的包体大小限制为6MB,不支持.gif类型的动图
content-type 是 application/json 或 multipart/form-data 根据不同接口选择:
1. 使用图片 url,选择 application/json;
2. 使用图片 image,选择 multipart/form-data。
authorization 是 鉴权签名 多次有效签名,用于鉴权,生成方式见 鉴权签名方法
注意:
如选择 multipart/form-data,请使用 http 框架/库推荐的方式设置请求的 content-type,不推荐直接调用 setheader 等方法设置,否则可能导致 boundary 缺失引起请求失败。
请求参数

参数名称 必选 类型 说明

appid 是 string 接入项目的唯一标识,可在 账号信息 或 云 API 密钥 中查看
image 否 binary 图片文件,支持多个
url 否 String image 和 url 只提供一个即可;如果都提供,只使用 url
返回内容 字段 类型 说明

code Int 返回状态值
message String 返回错误消息
data.items array(item) 识别出的所有字段信息
item 说明:

字段 类型 说明

itemstring string 字段字符串
itemcoord object 字段在图像中的像素坐标,包括左上角坐标 x,y,以及宽、高 width,height
words array(word) 字段识别出来的每个字的信息
words 说明:

字段 类型 说明

character string 识别出的单字字符
confidence float 识别出的单字字符对应的置信度,取值范围[0,100]

5. 利用CRNN来识别图片中的文字(二)tensorflow中ctc有关函数详解

定岁渗义一个稀疏tensor。

将一个稀疏tensor转换成稠密tensor。

计算ctc_loss。

主要参数1:labels: int32 SparseTensor 是数据的真实标签,一般是先用桐橘sparse_placeholder(),然后在session中feed训练数据batch_y。batch_y为 SparseTensor 利用sparse_tuple_from(y)函数计算得到。

sparse_tuple_from(y)函数的输入是在train_y中随机选择大小为 batch_size 的数据,输出是一个(indices, values, shape)形式的三元组。

主要参数2:inputs:是三维 float Tensor .logits是网络向前传播inference计算的结果。形状为[max_time_step, batch_size, num_classes]这里的num_classes是中文字典的局雀团大小,及992个汉字加1个空白,所以num_classes=993。输入图像经过卷积之后的大小为[batch_size, 11, 1, 512],max_time_step=512,是通道数,可以看作是512个图片特征序列。

主要参数3:sequence_length:一维 int32 向量【注意是向量,不是 Tensor !!!】长度为batch_size(批处理大小),值为max_len(ctc的最大输出长度,这个长度是自己定义的!合理即可!)的可以按照下面的方式定义。

占位符。在session中feed训练数据。

6. 使用原始的c语言把bmp格式的图片识别成文字

这个得有特征提取的算法了,鄙人不会

7. 利用CRNN来识别图片中的文字(一)数据预处理

数据集中含有10072个图片文件和10072个图片所对应的包含图片中中文字内容的文本宴拦渣文。

1.得到图片数据集中所有的中文字符,构成字符字典,字典大小为所包含不同中文字符的类别数;(dict_size=992,加上一个“空白”,在CTC中一共含有992+1=993个类别)

2.构建训练数据 train_x,train_y; train_x中每一个元素为一张图片(cv2.imread()读取的灰度图),train_y 中每一个元素为图片对应的文字在字符字典中的序号;

返回path路径下的符合条件的所有文件,然后用for循环对每一个文件进行操作。

用于打开一个文件。创建衡嫌一个 file 对象,相关的方法才可以调用它进行读写。

readline()函数读取整行,包括 "\n" 字符。

返回一个无序不重复元素集(这里用于删除重复的中文字符)。

用于将元组晌悄转换为列表。

8. CRNN算法详解

文字识别是对序列的预测方法,所以采用了对序列预测的RNN网络。通过CNN将图片的特征提取出来后采用RNN对序列进行预测,最后通过一个CTC的翻译层得到最终结果。

所以CRNN算法主要采用的是CNN+RNN+CTC三层网络结构,从下到上,依次为:

(1)卷积层,使用CNN,从输入图像中提取特征序列;

(2)循环层,使用RNN,预测从卷积层获取的特征序列的标签(真实值)分布;

(3)转录层,使用CTC,把从循环层获取的标签分布通过去重整合等操作转换成最终的识别结果。

卷积层共包含7层卷积神经网络,基础结构采用的是VGC的结构,其中输入是把灰度图缩放到尺寸为W*32,即固定高。在第三个和第四个池化层的时候,为了追求真实的高宽比例,采用的核尺寸为1*2(并非2*2)。为了加速收敛并引入了BN层。 把CNN提取到的特征图按列切分,每一列的512维特征,输入到两层各256单元的双向LSTM进行分类。在训练过程中,通过CTC损失函数的指导,实现字符位置与类标的近似软对齐。

如图:

现在需要从CNN模型产生的特征图中提取特征向量序列,每一个特征向量(红色框)在特征图上按列从左到右生成,每一列包含512维汪握特征,这意味着第i个特征向量是所有的特征图第i列像素的连接,这些特征向量就构成一个序列。

由于卷积层,最大池化层和激活函数在局部区域上执行,因此它们是平移不变的。因此特征图的每列(即一个特征向量)对应于原始图像的一个矩形区域(成为感受野),并且这些矩形区域与特征图上从左到右的相应列具有相同的顺序。特征序列中的每个向量关联一个感受野。

提取的特征序列中的向量是从特征图上从左到右按照顺序生成的,每个特征向量表示了图像上一定宽度上的特征,论文中使用的这个宽度是1,就是单个像素。

如果一张包含10个字符的图片大小为100×32,经过上述的CNN网络得到的特征尺度为25×1(这里忽略通道数),这样得到一个序列,每一列特征对应原图的一个矩形区域(如下图所示),这样就很方便作为RNN的输入进行下一步的计算了,而且每个特征与输入有一个一对一的对应关系。

从上图可以看出,对VGG的调整如下:

1.为了能将CNN提取的特征作为输入,输入到RNN网络中,文章将第三和第困高庆四个maxpooling的核尺度从2×2改为了1×2
2.为了加速网络的训练,在第五和第六个卷积层后面加上了BN层。

为什么将第三和第四个maxpooling的核尺度从2×2改为1×2是为了方便的将CNN的提取特征作为RNN的输入.首先要注意的是这个网络的输入为W×32,也就是说该网络对输入图片的宽没有特殊的要求,但是高都必须resize到32。

假设现在输入有个图像,为了将特征输入到Recurrent Layers,做如下处理:

关于CNN原理详解,具体可以参考: https://www.jianshu.com/writer#/notebooks/46006121/notes/71156459

因为 RNN 有梯度消失的问题,不能获取更多上下文信息,所以 CRNN 中使用的是 LSTM,LSTM 的特殊设计允许它捕获长距离依赖。

RNN网络是对于CNN输出的特征序列x=x1,⋯⋯,xt,每一个输入xt,都有一个输出yt, 为了防止训练时梯度的消失,文章采用了LSTM神经单元作为RNN的单元。文章认为对于序列的预测,序列的前向信息和后向信息都有助于序列的预测,所以文章采用了双向念衫RNN网络。LSTM神经元的结构和双向RNN结构如下图所示。

示例:
通过上面一步,我们得到了40个特征向量,每个特征向量长度为512,在 LSTM 中一个时间步就传入一个特征向量进行分类,这里一共有40个时间步。

我们知道一个特征向量就相当于原图中的一个小矩形区域,RNN 的目标就是预测这个矩形区域为哪个字符,即根据输入的特征向量,进行预测,得到所有字符的softmax概率分布,这是一个长度为字符类别数的向量,作为CTC层的输入。

因为每个时间步都会有一个输入特征向量 ,输出一个所有字符的概率分布 ,所以输出为 40 个长度为字符类别数的向量构成的后验概率矩阵,然后将这个后验概率矩阵传入转录层。

测试时,翻译分为两种,一种是带字典的,一种是没有字典的。
带字典的就是在测试的时候,测试集是有字典的,测试的输出结果计算出所有字典的概率,取最大的即为最终的预测字符串
不带字典的,是指测试集没有给出测试集包含哪些字符串,预测时就选取输出概率最大的作为最终的预测字符串。

端到端OCR识别的难点在于怎么处理不定长序列对齐的问题!(因为是不定长序列,按照以前的方法我们很难去计算loss,如果是定长的话容易造成信息的丢失,而且局限性太大!)

转录是将 RNN 对每个特征向量所做的预测转换成标签序列的过程。数学上,转录是根据每帧预测找到具有最高概率组合的标签序列。
具体可以参考: https://www.jianshu.com/writer#/notebooks/46006121/notes/71156474

9. C语言中如何识别字符与数字

  1. 凡是数字皆为字符。任何数字首先是字符,然后才能是数字。所以这个问题应该是如何在字符中识别数字。

  2. 直接将每个字符挨个提取出来,将他赋给一个整型,得到它的ASCII码值。然后根据ASCII码的范围来判断它到底是数字字符还是非数字字符。由下表可以得知,数字范围在48~57的都是数字字符。

    #include<stdio.h>
    #include<ctype.h>
    voidmain()
    {
    chara[10];
    inti,j,flag=0;/*flag标记小数点个数,如果超过一个,那么就不是数字*/
    printf("inputanumber: ");
    scanf("%s",a);
    for(i=0;a[i]!=0;i++)
    {
    if(i==0&&(a[i]=='+'||a[i]=='-'))
    {
    i++;
    continue;
    }/*如果第一个字符为+或-,不判断为非数字,可能是符号标志,继续向下判断*/
    if(a[i]=='.')
    {
    flag++;
    缺谨烂if(flag>1)/*如果小数点个数超过一个,则表示不是数字*/
    {
    break;
    }
    elseif(flag==1)/*如果小数点个数为1个,则可能为小数,继续判断*/
    {
    continue;
    }
    }
    j=isdigit(a[i]);
    if(j==0)
    {
    break;
    }
    }
    if(j!=0)
    printf("%syes",a);
    else
    printf("%sno",a);
    getch();
    }

10. c语言 关于汉字怎样识别

每个汉字都用2个字节表示,这两个字节必须都大于0xa0,所以汉野友字的两个字节必须是无符燃友号型(unsigned)。

例程:
unsigned char ch[2];

//把汉颂段槐字赋值给ch[2]
.....代码略

if ((ch[0]>0xa0) && (ch[1]>0xa0))
{
// 汉字处理
}
else
{
// 字符处理
}

阅读全文

与c图片文字识别算法相关的资料

热点内容
请勿打扰男生图片 浏览:729
帅气男人动漫图片 浏览:329
女生奔跑图片 浏览:382
卖油翁思维导图图片简单 浏览:303
真茅台酒价格表和图片 浏览:401
怎么用手机自己做图片 浏览:327
一年级班旗图片大全 浏览:455
毕业图片漫画简单 浏览:912
word题注后面怎么插入图片 浏览:418
妩媚图片女孩 浏览:871
渐增型发型图片 浏览:268
一家四口卡通图片可爱 浏览:575
ps怎么做图片文字 浏览:730
豪雅手表价格与图片 浏览:491
衣服上有干的血图片 浏览:180
裙子配发型图片 浏览:443
男生露锁骨的衣服图片 浏览:51
好多泡泡图片大全可爱 浏览:927
皇冠蛋糕图片价格查询 浏览:965
小白鞋配高袜搭配衣服图片 浏览:149