# Scanner_OCR 人工智能程序设计
## 一、开发说明
这是一款简单的图像文字识别程序——使用Python语言,基于**OpenCV**和**Tesseract-OCR**,实现了目标图像导入、手动截取、自动矫正和最终进行文字识别与输出这一系列功能。
>该程序是人工智能课程的个人结课设计,程序全部皆自主学习开发。
>
>于2021年末历时约30天开发与设计完成。
>
>学习新领域知识对实际应用设计与开发的过程稍有曲折,程序总体虽然不大,但整体设计思路均已逐一实现。
#### 开发者:
   靳子恒 北科信息工程系计算机科学与技术
#### 开发技术:
   语言:python
   工具:VsCode
   环境:Windows + Python3.7 + OpenCV库 + numpy库 + Tesseract5.0
## 二、开发过程
### 1、设计思路
>如图所示:
>- 首先通过 OpenCV 的 imread 和 imshow 函数读取图片并创造一个 GUI 窗口进行图像展示;
>
>- 其次利用鼠标回调函数和鼠标事件(鼠标左键双击)实现鼠标双击绘图截选想要识别的文档部分;
>
>- 再利用 OpenCV 的透视变换里的矩阵运算getPerspectivetransform 函数和 warpPerspective 函数共同完成图像的矩阵运算与转换;
>
>- 与此同时对图像边界进行裁剪,以达到在图像截取过程中将不得已截取到的文档以外部分裁剪的目的;
>
>- 最后使用谷歌的 Tesseract-OCR 引擎进行文字识别,与此同时,对识别内容进行保存,设定好存储路径,保存为 txt 文件。

### 2、实现过程
**1. 定义鼠标响应函数:收集源图像的四个顶点坐标点**
```python
#points_collect鼠标响应函数
def points_collect(event,x,y,flags,param): #x,y鼠标xy坐标,flags鼠标状态,可以用参数对应值代替
dic_points = param #param是用户定义的传递到setMouseCallback函数的参数,作为setMouseCallback的参数
if event == cv2.EVENT_LBUTTONDBLCLK:#触发事件为左键双击,左键按下,允许绘图,以及获取绘图坐标
if len(dic_points['ps'])>=4:#如果大于等于4,[]为空,重新记录四个点的坐标位置
dic_points['ps']=[] #[]列表 {}字典
dic_points['ps'].append((x,y))#给dic_points['ps']列表添加数据,数据即获取的绘图坐标
else:
dic_points['ps'].append((x,y))
if event == cv2.EVENT_MOUSEMOVE:#触发事件为鼠标移动时
dic_points['p_move']=(x,y) #定义一个列表,在鼠标移动时获取坐标值,也就是说这里存放的是动点当前位置的坐标
```
>解析:
>
>  *定义一个鼠标回调函数,利用鼠标响应进行图像截取这一事件的触发。图像截取为调用 OpenCV 绘图函数在下一部分,此处是定义 event 事件为鼠标左键双击 LBUTTONDBLCLK 事件。*
>
>  *当鼠标左键双击后,开始描点绘图截取图像矫正部分并进行鼠标坐标点的记录。因图像截取为四个坐标点,截取梯形图,因此定义名为dic_points[]的列表变量,在此函数部分对鼠标双击事件开始后鼠标坐标点的收集。*
>
>  *在绘图过程中,考虑到鼠标点第一个点之后需要显示连线,因此鼠标在移动过程中的坐标也要纳入 dic_points 列表内,为下一步点与点之间连线做好准备,移动的坐标即动点,利用 append 函数将move 动点坐标附加到 dic_points 列表内。*
>
>  *其中,函数参数 param 作用是将定义好的鼠标坐标列表dic_points 赋给 param,在主函数 setmouseback 部分进行参数回调。*
**2. 确认选点并绘图**
```python
def drawlines(img,dic_points):
color = (0,255,0) #red和blue为0 green为255 为绿色
# 已记录顶点复制,将鼠标标记好的四个顶点的坐标取出来,[:]代表截取列表,如[1:3],截取下标为1--3元素,单纯‘:’就是全部提取
points = dic_points['ps'][:]
#追加移动动点,把鼠标移动的点坐标也加进来,append函数数组在末端添加元素
points.append(dic_points['p_move'])
if len(points)>0 and len(points)<5: #四个顶点+动点最多五个,if语句意思是鼠标连接完之前都要做什么
for i in range(len(points)-1): #就是单纯地列表减1,当画到第三个点时,实际为四个,为了保证输出值为0 1 2 ,需要-1;注意下边是line语句是[i]和[i+1]
cv2.circle(img,points[i],4,color,cv2.FILLED)#在img上画圆,points坐标,半径为4 颜色是0 255 0绿色,filled画一个实心的
cv2.line(img,points[i],points[i+1],color,1)#将当前点和下一个点连接
#这一个for循环是和动点连接的一个过程,在最后一个点出现前,保持和动点即鼠标不断移动的点连接
elif len(points)>=5:
#大于等于5就是,最后一个即第四个坐标点画完,带上动点为5个,已经完毕
#接下来执行for[i]循环连接线条就行
for i in range(3): #3是结束值,[0,1,2]
cv2.circle(img,points[i],4,color,cv2.FILLED) #img 后续要导入进来的图片的参数
cv2.line(img,points[i],points[i+1],color,1) #circle函数画圆,img为源图像,points[i]为画圆的圆心坐标,4为圆的半径,clolor为设定好的圆的颜色(python为BGR)
#points[i]是当前点 points[i+1]是下一个点,两点连接,依次往下连接0 1 2 这三个点
cv2.circle(img,points[3],4,color,cv2.FILLED)#point[3]为第四个点
cv2.line(img,points[3],points[0],color,1) #这一句是吧0(起始)顶点和3(结束)顶点连接
```
>解析:
>
>  *此函数就是上一步中所述的 OpenCV 绘图函数,实现过程中起到描点连线,框选想要截选图像部分的功能。该功能是在第一步鼠标响应函数的基础上,当鼠标左键双击,触发事件,开始绘图并记录坐标。*
>
>如图所示:
>
>
>
>  *OpenCV 描点连线颜色 color 设置为(0,255,0)纯绿色。Circle函数画圆,然后用 Filled 函数进行填充,已达到画点的目的。Line函数用于画线,画线函数内利用 point(i)和 point(i+1)函数实现当前点与下一个点的连接,当然此处也间接解释了为什么第一步鼠标回调里要附加(append)鼠标动点坐标到 dic_points[]列表里。*
>
>  *在函数 if-elif 循环部分是考虑到以下情况设置 0-5 区间范围和>=5 的判定值:1.除去鼠标四个固定顶点外还要考虑动点,动点算作第五个坐标点,在鼠标截选图像至要截选最后一个时已经有了四个点(3 顶点 1 动点),此时执行的是 if 语句内的代码;当画第四个
顶点的时候,实际有 5 个点,这时候执行 elif 语句,将第四个点和初始点之间建立连接。2.当描完四个顶点并连线后,如果对框选部分不满意,那么再次双击,此时和上一部鼠标响应函数有关,动点+四个顶点+额外双击时,坐标数已经大于 4,那么执行清空数组语句dic_points[‘ps’]=[],重新开始绘图。*
>
**3. 将绘图中收集到的四个顶点进行排序**
```python
# 将收集的四个顶点按照[左上,右上,左下,右下],opencv的要求
# 顺序进行重新排列
def reorder(points):
points = np.array(points) #np.array()生成数组,二维数组对象的集合
ordered_points = np.zeros([4,2]) #numpy.zeros 创建�
没有合适的资源?快使用搜索试试~ 我知道了~
基于python+Opencv和Tesseract-OCR开发的图像文字识别程序源码+报告文档+演示视频(高分项目)

共14个文件
jpg:4个
traineddata:2个
py:2个

1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉

温馨提示
基于python+Opencv和Tesseract-OCR开发的图像文字识别程序源码+报告文档+演示视频(高分项目),该项目是个人毕设项目,答辩评审分达到98分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 基于python+Opencv和Tesseract-OCR开发的图像文字识别程序源码+报告文档+演示视频(高分项目)基于python+Opencv和Tesseract-OCR开发的图像文字识别程序源码+报告文档+演示视频(高分项目)基于python+Opencv和Tesseract-OCR开发的图像文字识别程序源码+报告文档+演示视频(高分项目)基于python+Opencv和Tesseract-OCR开发的图像文字识别程序源码+报告文档+演示视频(高分项目)基于python+Opencv和Tesseract-OCR开发的图像文字识别程序源码
资源推荐
资源详情
资源评论































收起资源包目录



















共 14 条
- 1
资源评论

- 普通网友2025-01-04总算找到了想要的资源,搞定遇到的大问题,赞赞赞!
- Screeps_Gbo2024-12-04资源不错,内容挺好的,有一定的使用价值,值得借鉴,感谢分享。

yava_free
- 粉丝: 7409
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 信息化教学设计方案评价量规.doc
- 基于互联网+的党校档案管理问题分析.docx
- Delphi短信视频点播前台管理子.doc
- 一种基于图像处理的芯片自动开封算法设计.docx
- 基于Java开发平台的安全性措施.docx
- SolidWorks工程图转换成AutoCADDWG文件后字体不变的方法.doc
- 基于计算机技术的科技管理模式的现代化应用研究.docx
- 实验离散信号的DTFT和DFT及其FFT算法的应用.doc
- 新零售背景下网络零售平台创新模式探索.docx
- 什么是人工智能人工智能知识详解.docx
- C++课程设计方案系统和论文设计方案.docx
- 条高AutoCAD工程项目师绘图技巧.doc
- 基于FTTC的桃源步行街无线网络规划与设计.doc
- 通信工程实习总结.docx
- 某教学楼计算机网络系统集成设计方案.doc
- 基于单片机的十字路口交通灯方案设计书大学大学本科方案设计书(方案设计书).doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
