.版本 2
.支持库 edroptarget
.支持库 sqlite3
.支持库 iext
.支持库 eAPI
.程序集 窗口程序集_启动窗口, , , 易语言学习资源、源码下载站:www.eyuyan.la
.程序集变量 DET_MODEL, 文本型, , , 检测模型
.程序集变量 CLS_MODEL, 文本型, , , 方向分类器
.程序集变量 REC_MODEL, 文本型, , , 识别模型
.程序集变量 KEY_FILE, 文本型, , , 字典文件
.程序集变量 DEFAULT_IMG_PATH, 文本型
.程序集变量 DEFAULT_IMG_NAME, 文本型
.程序集变量 集_handle, 整数型
.程序集变量 集_图片, 字节集
.子程序 __启动窗口_创建完毕
透明度 = 100
拖放对象1.注册拖放控件 (图片框_输出.取窗口句柄 ())
DET_MODEL = “models/dbnet.onnx”
CLS_MODEL = “models/angle_net.onnx”
REC_MODEL = “models/crnn_lite_lstm.onnx”
KEY_FILE = “models/keys.txt”
集_handle = OcrCreateW (4, 编码_Ansi到Unicode (DET_MODEL), 编码_Ansi到Unicode (CLS_MODEL), 编码_Ansi到Unicode (REC_MODEL), 编码_Ansi到Unicode (KEY_FILE), 真)
’ 窗口置顶_ (_启动窗口.取窗口句柄 ())
’ 设置窗口透明度 (_启动窗口.取窗口句柄 (), 50)
窗口_总在最前 (_启动窗口.取窗口句柄 (), 真)
.子程序 _按钮_识别_被单击
.局部变量 局_RESULT, 整数型
.局部变量 局_OCR_DETECT_RESULT, OCR_DETECT_RESULT
.局部变量 局_RESULT_TEXTBLOCK, OCR_DETECT_RESULT_TEXTBLOCK
.局部变量 局_图片, 字节集
.局部变量 局_ocr_param, OCR_DETECT_CONFIG
.局部变量 i, 整数型
.局部变量 局_索引, 整数型
.局部变量 局_文本, 文本型
.局部变量 p, 整数型
.局部变量 time, 长整数型
.局部变量 sql, Sqlite数据库
.局部变量 sqlite, Sqlite表
.局部变量 字段, Sqlite字段信息
.局部变量 打开数据库, 逻辑型
.局部变量 打开数据表, 逻辑型
.局部变量 exam_q, 文本型
’ -padding:图像预处理,在图片外周添加白边,用于提升识别率,文字框没有正确框住所有文字时,增加此值。 ' --maxSideLen
:按图片最长边的长度,此值为0代表不缩放,例:1024,如果图片长边大于1024则把图像整体缩小到1024再进行图像分割计算,如果图片长边小于1024则不缩放,如果图片长边小于32,则缩放到32。
’ --boxScoreThresh:文字框置信度门限,文字框没有正确框住所有文字时,减小此值。 ' --boxThresh
:请自行试验。
’ --unClipRatio:单个文字框大小倍率,越大时单个文字框越大。此项与图片的大小相关,越大的图片此值应该越大。 ' --doAngle
:启用(1)/禁用(0) 文字方向检测,只有图片倒置的情况下(旋转90~270度的图片),才需要启用文字方向检测。
’ --mostAngle```:启用(1)/禁用(0) 角度投票(整张图片以最大可能文字方向来识别),当禁用文字方向检测时,此项也不起作用。
’ 写到文件 (取当前目录 () + “\abcdefghijklmn1.jpg”, 快照 (窗口_取句柄_模糊 (编辑框2.内容), , ))
’ 集_图片 = 读入文件 (取当前目录 () + “\abcdefghijklmn1.jpg”)
集_图片 = 读入文件 (取当前目录 () + “\150%chrome.png”)
’ 图片框_输出.图片 = 集_图片
透明标签1.可视 = 假
按钮_识别.禁止 = 真
.如果 (集_handle > 0)
局_ocr_param.padding = 到整数 (编辑框_padding.内容)
局_ocr_param.maxSideLen = 到整数 (编辑框_maxSideLen.内容)
局_ocr_param.boxScoreThresh = 到小数 (编辑框_boxScoreThresh)
局_ocr_param.boxThresh = 到小数 (编辑框_boxThresh.内容)
局_ocr_param.unClipRatio = 到小数 (编辑框_unClipRatio.内容)
局_ocr_param.doAngle = 到整数 (选择框_doAngle.选中)
局_ocr_param.mostAngle = 到整数 (选择框_mostAngle.选中)
.如果真 (字节集_取长度 (集_图片) > 0)
树型框1.清空 ()
time = 系统_取启动时间 ()
局_RESULT = OcrDetect (集_handle, 取指针_字节集型 (集_图片), 字节集_取长度 (集_图片), 局_ocr_param)
.如果真 (局_RESULT > 0)
time = 系统_取启动时间 () - time
复制内存_RESULT (局_OCR_DETECT_RESULT, 局_RESULT, 16)
编辑框1.内容 = “”
编辑框1.加入文本 (编码_utf8到gb2312 (局_OCR_DETECT_RESULT.text), “time:” + 到文本 (time) + “ms”)
局_图片 = 指针到字节集 (局_OCR_DETECT_RESULT.resultImageBuffer, 局_OCR_DETECT_RESULT.resultImageBufferSize)
图片框_输出.图片 = 局_图片
.变量循环首 (0, 局_OCR_DETECT_RESULT.blockSize - 1, 1, i)
复制内存_TEXTBLOCK (局_RESULT_TEXTBLOCK, 局_RESULT + 16 + LocalSize (局_RESULT_TEXTBLOCK) × i, LocalSize (局_RESULT_TEXTBLOCK))
局_索引 = 树型框1.加入项目 (, “TextBlock”, , , , , )
局_文本 = “”
.变量循环首 (0, 局_RESULT_TEXTBLOCK.charScoreSize - 1, 1, p)
局_文本 = 局_文本 + 到文本 (指针到小数 (局_RESULT_TEXTBLOCK.charScores + 4 × p)) + “, ”
.变量循环尾 ()
局_文本 = “Text:” + 到文本 (局_RESULT_TEXTBLOCK.charScoreSize) + “(” + 编码_utf8到gb2312 (局_RESULT_TEXTBLOCK.text) + “), CharScores(” + 局_文本 + “)”
树型框1.加入项目 (局_索引, 局_文本, , , , , )
局_文本 = “”
.计次循环首 (4, p)
局_文本 = 局_文本 + “, [x:” + 到文本 (局_RESULT_TEXTBLOCK.boxPoint [p].x) + “, y: ” + 到文本 (局_RESULT_TEXTBLOCK.boxPoint [p].y) + “]”
.计次循环尾 ()
局_文本 = “TextBox[Score(” + 到文本 (局_RESULT_TEXTBLOCK.boxScore) + “)” + 局_文本 + “]”
树型框1.加入项目 (局_索引, 局_文本, , , , , )
树型框1.扩展 (局_索引)
.变量循环尾 ()
OcrFreeDetectResult (局_RESULT)
.如果真结束
.如果真结束
.否则
信息框 (“cannot initialize the OCR Engine”, 0, , )
.如果结束
打开数据库 = sql.打开 (取当前目录 () + “\line - 副本.db”, 真)
打开数据表 = sqlite.打开 (“exam”, sql)
信息框 (到文本 (sqlite.取记录个数 ()), 0, , )
.计次循环首 (sqlite.取记录个数 (), i)
sqlite.跳到 (i)
exam_q=sqlite.读字段文本值 (“question”, )
编辑框1.加入文本 (sqlite.读字段文本值 (“index”, ) + sqlite.读字段文本值 (“A”, ) + #换行符)
’ 编辑框1.加入文本 (到文本 (sqlite.读字段整数值 (“index”, )) + sqlite.读字段文本值 (“A”, ) + #换行符)
’ 编辑框1.加入文本 (到文本 (sqlite.读字段整数值 (“index”, )) + #换行符)
.计次循环尾 ()
按钮_识别.禁止 = 假
.子程序 __启动窗口_将被销毁
.如果真 (集_handle > 0)
OcrDelete (集_handle)
.如果真结束
.子程序 _拖放对象1_得到文件
.参数 接收到的文件路径, 文本型
集_图片 = 读入文件 (接收到的文件路径)
.如果 (字节集_取长度 (集_图片) > 0)
图片框_输出.图片 = 集_图片
透明标签1.可视 = 假
.否则
透明标签1.可视 = 真
.如果结束
.子程序 _选择夹1_被单击
.子程序 _标签6_反馈事件, 整数型
.参数 参数一, 整数型
.参数 参数二, 整数型
.子程序 _按钮1_被单击
设置窗口透明度 (_启动窗口.取窗口句柄 (), 到数值 (编辑框3.内容))
dll命令表:
.版本 2
.DLL命令 OcrFreeDetectResult, , “OcrLiteOnnx.dll”, “@OcrFreeDetectResult”, 公开
.参数 result, 整数型
.DLL命令 OcrDetect, 整数型, “OcrLiteOnnx.dll”, “@OcrDetect”, 公开
.参数 handle, 整数型
.参数 buffer, 整数型
.参数 bufferSize, 整数型
.参数 config, OCR_DETECT_CONFIG
.DLL命令 复制内存_TEXTBLOCK, , “kernel32.dll”, “RtlMoveMemory”
.参数 pDestination, OCR_DETECT_RESULT_TEXTBLOCK, , 目标地址
.参数 pSource, 整数型, , 源地址
.参数 Length, 整数型, , 长度
.DLL命令 OcrDelete, , “OcrLiteOnnx.dll”, “@OcrDelete”, 公开
.参数 handle, 整数型
.DLL命令 OcrCreateW, 整数型, “OcrLiteOnnx.dll”, “@OcrCreateW”, 公开, 此 DLL使用 Unicode 路径加载文件( 可解决中文路径下崩溃的问题 ),并使用内存数据输入输出图像
.参数 numThread, 整数型, , 线程数量,建议不超过CPU数量
.参数 detModelPath, 字节集, , dbnet模型路径
.参数 clsModelPath, 字节集, , 角度识别模型路径
.参数 recModelPath, 字节集, , crnn推理模型路径
.参数 keysPath, 字节集, , 字典文件路径
.参数 isOutputResultImg, 逻辑型, , 是否返回处理过的图像,便于调试
.DLL命令 复制内存_RESULT, , “kernel32.dll”, “RtlMoveMemory”
.参数 pDestination, OCR_DETECT_RESULT, , 目标地址
.参数 pSource, 整数型, , 源地址
.参数 Length, 整数型, , 长度
.DLL命令 LocalSize, 整数型, “kernel32”, “LocalSize”, , LocalSize返回本地内存块大小
.参数 hMem, OCR_DETECT_RESULT_TEXTBLOCK
.DLL命令 窗口置顶_, 整数型, “user32.dll”, “BringWindowToTop”
.参数 hwnd, 整数型, , 欲带至顶部的那个窗口的句柄
自定义数据:
.版本 2
.数据类型 OCR_DETECT_CONFIG, 公开
.成员 padding, 整数型
.成员 maxSideLen, 整数型
.成员 boxScoreThresh, 小数型
.成员 boxThresh, 小数型
.成员 unClipRatio, 小数型
.成员 doAngle, 整数型
.成员 mostAngle, 整数型
.数据类型 OCR_DETECT_RESULT, 公开
.成员 blockSize, 整数型, , , 识别出的字符块数量
.成员 text, 文本型
.成员 resultImageBuffer, 整数型, , , 返回的图像地址
.成员 resultImageBufferSize, 整数型, , , 图像大小
.成员 blocks, 整数型, , , RESULT_TEXTBLOCK首地址
.数据类型 OCR_DETECT_RESULT_TEXTBLOCK, 公开, 尺寸48
.成员 text, 文本型
.成员 boxScore, 小数型
.成员 charScoreSize, 整数型, , , 字符数量
.成员 charScores, 整数型, , , 字符识别分数
.成员 boxPoint, OCR_DETECT_RESULT_POINT, , “4”
.数据类型 OCR_DETECT_RESULT_POINT, 公开
.成员 x, 整数型
.成员 y, 整数型