-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreading_notes.txt
88 lines (87 loc) · 6.79 KB
/
reading_notes.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
一、原ocr库的识别流程
0.核心数据
图片:Mat->IplImage->OCR_IMAGE(OcrImage)
Mat是opencv的图数据结构;
IplImage是Intel的图像处理库的数据结构,包含在opencv代码中;
OCR_IMAGE是OCR库中的图片数据结构,存储宽度、高度、像素所占用bit数、每行像素数据指针数组;
OcrImage是OCR_IMAGE的子类,添加了一些浅拷贝、深拷贝和内存释放的成员函数;
1.OcrEngine::Recog() 是OCR库的顶层函数,其他外部接口基本都是调用的这个函数,来完成识别;
在里面执行了:彩图转灰度图、探测图片倾斜角度
2.OcrEngine::ConvertGray()
在里面执行了:彩图转灰度图、灰度图增强
XColorToGray()的核心是宏定义:#define XRGB2GRAY(r,g,b) (((b)*117 + (g)*601 + (r)*306) >> 10)
XEnhanceGrayImage()的核心是,获取图的平均亮度,然后重新计算图中点的亮度,使整张图尽量在亮度上分布在0-255的两端而不是某一段;
3.OcrEngine::DetectAngle()
deskew.cpp中Ocr_DetectImageSkewAngle(),接收灰度图、单色图,若是单色图,转为灰度图,若是彩图则返回失败;转换完毕后,调用skewDetection()来实际执行角度检测;
skewDetection(),有800+行,(1)其前半部分,尝试划定一片区域,并将区域内图片缩放到一定大小,对大图使用了双线性插值(或降采样),然后做高斯平滑,再边缘检测
1336行->1705行,声明各种宏定义、变量、判断出是否需要缩放,缩放到多大,对大图双线性插值;
使用的外部函数,主要是CannyEdgeDetection()和imageDownSamplingCXImageAverage_G()
1706行->1715行,做高斯平滑,主要是grayImageGaussSmooth33()
1716行->1722行,做边缘检测,主要是CannyEdgeDetection()
1723行->1767行,无用代码
1768行->1803行,将需要的图片,放大几倍,主要是get_n_times_image()
1804行->1821行,debug代码
1822行->2137行,根据宽高值的大小和其他信息确认的fg_type来执行角度计算,主要是skewAngleDetection_H()
4.XTextInfoInit()
设置
5.Ocr_AdjustImageSkew()
位于:deskew.cpp
主要,在图为单色图的情况下,调用ConvertBitImg2ByteImg(),将图转为灰度图;调用rotateGrayImage()来进行倾斜校正;如果是输入是单色图的话,将校正完毕的数据,调用SimpleBinarize()转为单色图;
rotateGrayImage(),位于rotation.cpp,与之类似的函数,还有rotateGrayImage_Whole_t()和rotateGrayImage_Whole(),但是这两个函数并没有地方使用;
rotateGrayImage(),有328行,(1)根据传入的角度,计算x和y的各类角度参数(2)逐点的偏转;
812行->1006行,根据传入的角度,计算各类角度参数;
1007行->1088行,做偏转;
1089行->1134行,复制到输出函数中,并释放临时申请的内存;
6.Ocr_AdjustColorSkew()
位于:deskew.cpp
主要,只处理彩图,调用rotateColorImageSimple()来做倾斜校正;
rotateColorImageSimple(),位于deskew.cpp,
函数较短,暂时不做介绍
7.OcrTextToConn()
位于:../../detect/text/XTextLocalization.cpp
主要,对图像二值化、获取图像的连通域、公式探测(CNN或非CNN)、,调用OcrBinarizeImageIntoLayers()、XIPConnComp()、OCR_ConnToExtractMathFormula_ByCnn()或OCR_ConnToExtractMathFormula()
8.OcrTextLineLocalizationConn()
位于:detect/text/XTextLocalization.cpp
主要,做文本行定位,(1)使用CCA(典型相关分析(Canonical Correlation Analysis))和条件随机场(conditional random field)先选择候选的文本块集合来,
(2)画出经过一次筛选后的二值图,
(3)使用CC linking合并连通域(注意CC为连通域缩写),得到更好的文本行信息
(4)切割行到word,
(5)从各个图层合并文本行
(6)
9.实际未用到的mser
在文本行在图片中占比低于一定程度时,重新倾斜校正,重新获取连通域,重新定位文本行,重新计算文本行比例;根据结果,选择原信息识别或新校正后的数据识别;
RecogText(),是主要的识别函数;
9.1 OcrEngine::mser() 看上去分配了一些内存,实际上什么也没做;
OcrTextLineLocalizationCluster() 位于: detect/text/XTextLocalization.cpp,基于聚类的文本行定位;
OcrEngine::RecogText()
9.2 CheckTextDirect()
Ocr_AdjustImageSkew()
Ocr_AdjustColorSkew()
OcrTextToConn()
OcrTextLineLocalizationConn()
根据角度情况,使用新判断出的或旧的文本行执行OcrEngine::RecogText()
10.释放各类分配的内存
二、新的识别流程
1.OcrNewEngine::Recog() 是OCR新识别流程的主函数;
位于:engine/OcrNewEngine.cpp
主要,转灰度图,根据配置参数,调用OcrNewEngine::RecogByMSER()或OcrNewEngine::RecogByText() 进行识别;
2.OcrEngine::ConvertGray()
在里面执行了:彩图转灰度图、灰度图增强
XColorToGray()的核心是宏定义:#define XRGB2GRAY(r,g,b) (((b)*117 + (g)*601 + (r)*306) >> 10)
XEnhanceGrayImage()的核心是,获取图的平均亮度,然后重新计算图中点的亮度,使整张图尽量在亮度上分布在0-255的两端而不是某一段;
3.OcrNewEngine::RecogByMSER()和OcrNewEngine::RecogByText()
都是先探测角度,之后
3.1 OcrNewEngine::RecogByText()
执行文本探测OcrNewEngine::DetectTextLine(),探测结果较好时,执行OcrNewEngine::RecogTextLine()识别;
探测结果不好时,执行连通域角度探测OcrNewEngine::CheckTextDirect(),将角度信息加入识别信息中,再执行探测文本和识别;
3.2 OcrNewEngine::RecogByMSER()
执行文本探测OcrNewEngine::DetectTextCell(),识别并获取结果OcrNewEngine::textInfoToResult(),当结果平均分大于31时,调用OcrNewEngine::CheckTextDirect()识别并退出;
小于等于31,连通域角度探测OcrNewEngine::CheckTextDirect(),将角度信息加入识别信息中,再执行探测文本和识别;
4.两类文本探测函数OcrNewEngine::DetectTextLine()和OcrNewEngine::DetectTextCell()
4.1 OcrNewEngine::DetectTextLine()
对一、中介绍的OcrEngine::中4.至8.的封装;
4.2 OcrNewEngine::DetectTextCell()
前处理,和OcrNewEngine::DetectTextLine()一样,旋转灰度图,旋转彩图,生成连通域;
从文本行定位部分,变得不同,使用OcrNewEngine::OcrCCRectFilter()过滤CCR,使用OcrNewEngine::OcrTextCellToLine()使用文本块来生成行,使用OcrNewEngine::TextBinary()???,
5.
三、