技术标签: python 图像识别 opencv Python
提示:以下是本篇文章正文内容,python环境的搭建这里暂不做介绍,不会的同学可以参考一下其它文章。
提示:以下是本篇文章正文内容,下面案例可供参考
1、python环境搭建;
2、tesseract安装(pytesseract);
3、python必要的一些库(os、cv2、numpy等);
4、源码调试
可参考文章https://blog.csdn.net/qq_43317529/article/details/83340739
下载链接:https://digi.bib.uni-mannheim.de/tesseract/
1、下载选择对应的版本;
2、选择安装路径进行安装;
3、若需要下载识别其他语言的字符,可到官网下载对应语言包,下载完成后放到Tesseract-OCR\tessdata\tessconfigs下即可;
4、设置环境变量,进入环境变量中;
5、tesseract -v 检查是否安装成功;
运行源码时发现:pytesseract.pytesseract.TesseractNotFoundError: E:/Tesseract-OCR/tesseract.exe is not installed or it’s not in your PATH. See README file for more information.
PS E:\py\python3.7\test\test22> python .\ocr2.py
mylisty [4, 41, 78, 115, 152, 189, 226, 263, 300, 337, 374, 411]
mylistx [0, 53, 218, 307, 374, 441, 508, 568, 670, 769, 901]
Traceback (most recent call last):
File "E:\py\python3.7\Python37\lib\site-packages\pytesseract\pytesseract.py", line 252, in run_tesseract
proc = subprocess.Popen(cmd_args, **subprocess_args())
File "E:\py\python3.7\Python37\lib\subprocess.py", line 756, in __init__
restore_signals, start_new_session)
File "E:\py\python3.7\Python37\lib\subprocess.py", line 1155, in _execute_child
startupinfo)
FileNotFoundError: [WinError 2] 系统找不到指定的文件。
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File ".\ocr2.py", line 82, in <module>
text1 = pytesseract.image_to_string(ROI) #读取文字,此为默认英文
File "E:\py\python3.7\Python37\lib\site-packages\pytesseract\pytesseract.py", line 417, in image_to_string
}[output_type]()
File "E:\py\python3.7\Python37\lib\site-packages\pytesseract\pytesseract.py", line 416, in <lambda>
Output.STRING: lambda: run_and_get_output(*args),
File "E:\py\python3.7\Python37\lib\site-packages\pytesseract\pytesseract.py", line 284, in run_and_get_output
run_tesseract(**kwargs)
File "E:\py\python3.7\Python37\lib\site-packages\pytesseract\pytesseract.py", line 256, in run_tesseract
raise TesseractNotFoundError()
pytesseract.pytesseract.TesseractNotFoundError: E:/Tesseract-OCR/tesseract.exe is not installed or it's not in your PATH. See README file for more information.
解决方式:
1、通过cmd输入pip install pytesseract进行安装,但是安装后并不能直接使用;
2、在Tesseract-OCR的目录下运行pip install pytesseract可以看到自己安装的pytesseract所在路径;
PS E:\py\OCR\Tesseract-OCR> pip install pytesseract
Requirement already satisfied: pytesseract in e:\py\python3.7\python37\lib\site-packages (0.3.8)
Requirement already satisfied: Pillow in e:\py\python3.7\python37\lib\site-packages (from pytesseract) (8.2.0)
3、根据路径找到pytesseract.py;
4、点开编辑,找到tesseract_cmd将它改为你刚刚安装的tesseract的路径。
5、添加环境变量,在Tesseract-OCR路径下,再添加一个tessdata;
path=E:\py\OCR\Tesseract-OCR
path=E:\py\OCR\Tesseract-OCR\tessdata
6、在源码中修改路径为Tesseract-OCR的路径即可;
代码如下(示例):
# -*- coding: utf-8 -*-
"""
Created on Tue May 28 19:23:19 2019
将图片按照表格框线交叉点分割成子图片(传入图片路径)
@author: hx
"""
import cv2
#import cv2 as cv
import numpy as np
import pytesseract
#image = cv2.imread('C:/Users/Administrator/Desktop/7.jpg', 1)
image = cv2.imread(r'E:\py\python3.7\test\test22\src1.jpg', 1)
#灰度图片
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#二值化
binary = cv2.adaptiveThreshold(~gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 35, -5)
#ret,binary = cv2.threshold(~gray, 127, 255, cv2.THRESH_BINARY)
cv2.imshow("二值化图片:", binary) #展示图片
cv2.waitKey(0)
rows,cols=binary.shape
scale = 40
#识别横线
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(cols//scale,1))
eroded = cv2.erode(binary,kernel,iterations = 1)
#cv2.imshow("Eroded Image",eroded)
dilatedcol = cv2.dilate(eroded,kernel,iterations = 1)
cv2.imshow("表格横线展示:",dilatedcol)
cv2.waitKey(0)
#识别竖线
scale = 20
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(1,rows//scale))
eroded = cv2.erode(binary,kernel,iterations = 1)
dilatedrow = cv2.dilate(eroded,kernel,iterations = 1)
cv2.imshow("表格竖线展示:",dilatedrow)
cv2.waitKey(0)
#标识交点
bitwiseAnd = cv2.bitwise_and(dilatedcol,dilatedrow)
cv2.imshow("表格交点展示:",bitwiseAnd)
cv2.waitKey(0)
# cv2.imwrite("my.png",bitwiseAnd) #将二值像素点生成图片保存
#标识表格
merge = cv2.add(dilatedcol,dilatedrow)
cv2.imshow("表格整体展示:",merge)
cv2.waitKey(0)
#两张图片进行减法运算,去掉表格框线
merge2 = cv2.subtract(binary,merge)
cv2.imshow("图片去掉表格框线展示:",merge2)
cv2.waitKey(0)
#识别黑白图中的白色交叉点,将横纵坐标取出
ys,xs = np.where(bitwiseAnd>0)
mylisty=[] #纵坐标
mylistx=[] #横坐标
#通过排序,获取跳变的x和y的值,说明是交点,否则交点会有好多像素值值相近,我只取相近值的最后一点
#这个10的跳变不是固定的,根据不同的图片会有微调,基本上为单元格表格的高度(y坐标跳变)和长度(x坐标跳变)
i = 0
myxs=np.sort(xs)
for i in range(len(myxs)-1):
if(myxs[i+1]-myxs[i]>10):
mylistx.append(myxs[i])
i=i+1
mylistx.append(myxs[i]) #要将最后一个点加入
i = 0
myys=np.sort(ys)
#print(np.sort(ys))
for i in range(len(myys)-1):
if(myys[i+1]-myys[i]>10):
mylisty.append(myys[i])
i=i+1
mylisty.append(myys[i]) #要将最后一个点加入
print('mylisty',mylisty)
print('mylistx',mylistx)
#循环y坐标,x坐标分割表格
for i in range(len(mylisty)-1):
for j in range(len(mylistx)-1):
#在分割时,第一个参数为y坐标,第二个参数为x坐标
ROI = image[mylisty[i]+3:mylisty[i+1]-3,mylistx[j]:mylistx[j+1]-3] #减去3的原因是由于我缩小ROI范围
cv2.imshow("分割后子图片展示:",ROI)
cv2.waitKey(0)
#special_char_list = '`[email protected]#$%^&*()-_=+[]{}|\\;:‘',。《》/?ˇ'
#pytesseract.pytesseract.tesseract_cmd = r'E:/Tesseract-OCR/tesseract.exe'
pytesseract.pytesseract.tesseract_cmd = r'E:\py\OCR\Tesseract-OCR\tesseract.exe'
#pytesseract.pytesseract.tesseract_cmd = r'E:\py\python3.7\Python37\Scripts\py\pytesseract.exe'
text1 = pytesseract.image_to_string(ROI) #读取文字,此为默认英文
#text2 = ''.join([char for char in text2 if char not in special_char_list])
print('识别分割子图片信息为:'+text1)
j=j+1
i=i+1
提示:此源码仅供测试学习,功能尚不完善,持续更新中。
在使用mybatis时,偶尔遇到了“No constructor found in .....”的问题,根据问题提示理解,应该是构造方法引起的,经测试,当引用实体重构了构造方法之后会出现这个问题,因为mybatis需要用到默认构造方法,明确一个默认购置方法即可解决。有问题的代码:/** * <p>类描述:mybatis 引用实体 测试 </p> * &l...
不知到怎么操作的,一个不小心安装了很多的字体覆盖了原来的字体.所以显示出来的字体各种奇怪. 所以只能上网查找一下怎么解决这个问题.给大家看一下这个字体的灾难现场.感觉有点像宋体简直有点不能直视. 有时候字体的大小也是不一样的.所以打算从新还远一下.经过我多番查证,发现这个ubuntu 的默认字体是文泉驿 正黑, mirco hei .然后就上网找安装方法.sudo apt-get...
1.判断有无注入点 ; and 1=1 and 1=2 2.猜表一般的表的名称无非是admin adminuser user pass password 等.. and 0and 0 3.猜帐号数目 如果遇到0and 0and 1 4.猜解字段名称 在len( ) 括号里面加上我们想到的字段名称. and 1=(select count(*) from admin where len(*)
目前在编写个人项目,有一个是管理平台,基本每个页面都有el-from,所以对el-form做了二次封装, 组件在个人开发使用不错,但不确定能满足各种业务需求,所以这里主要和大家分享一下设计思路。设计组件分析问题el-form是element-ui库的表单组件,如果我们要将其进行二次封装,那么需要考虑几个问题:如何设计表单渲染字段不同类型的el-form-item怎么去渲染,比如in...
场景:需要校验手机号是唯一的,如下图代码如下 <el-form-item label="联系电话:" prop="mobile"> // prop需要校验的字段 <el-input v-model="editForm.mobile" auto-complete="off"/> </el-form-item> data() { // 手机号唯一性验证 let validateA
当你的J-Link的灯不再点亮的时候,你是否会怀疑它是坏了呢?先别急着下定论,J-Link没那么容易坏,多半是固件出问题了。那么怎么才能找回当初的感觉呢?分成两部分来说明一下:1.怎么刷固件?2.刷固件后出现“Clone”字样怎么解决。说明第一点之前先看第二点吧,网上有很多刷固件的教程,刷完后更新会显示“Clone”,那怎么办呢?在刷固件之前,先把固件里的S/N号改了吧,怎么改
运算符运算符的种类功能:这里将按运算符的功能分类介绍Java语言中每个运算符的用法。1)算术运算符包含两种:(1)单目运算符 +(取正)、-(取负)、++(增1)、- -1(减1)(2)双目运算符 +(加法)、-(减法)、*(乘法)、/(除法)、%(求余)...
题目内容:求一组数中的最大值、最小值及总和。要求定义函数int f(int a[],int n,int *pmax,int *pmin)函数返回总和,并分别通过指针pmax 和 pmin将最大值、最小值赋值给主函数中的对应变量。输入格式:第1行为正整数n(n>2),表示一组数的个数 第2行包含n个整数,用空格分隔。输出格式:一行包含3个整数,分别为最大值、最小值及总和输入样例:102 5 4 8 6 9 1 3 7 0输出样例:9 0 4
ORM常用字段包括AutoField、BigAutoField、BooleanField、CharField、DateTimeField、EmailField、TextField、URLField等,不同的字段对应着不同的数据类型,可以实现不同的需求。字段常见参数有:null指定是否允许为空;db_column自定义字段名;default设置默认值;unique设置字段值唯一。模型的Meta子类可以设置属性实现控制模型特性:db_table用于自定义表名;ordering用于设置查询数据时的排序方式。
最近在做fpga逻辑实现数据帧头拼接分包时刚接触状态机,随便记一点目前的入门理解。一段二段不用就没管了,直接无脑三段式。首先,三段式状态机是因为代码从外部看上去分成三块,分别描述状态机的切换状态时间,切换状态条件,不同状态下的操作。在这里插入代码片...
微信企业号开发中遇到的问题……
From:https://blog.csdn.net/inter_peng/article/details/53223455 作为习惯了使用Google进行资料查询的我来说,如果没有Google,真的感觉很难受。纵使找了一些可以翻墙的软件,但无奈还是经常不稳定,总是时断时续的。Bing和百度搜索出来的东西,距离自己想要的东西,差别比较大。前段时间在虎嗅上面读到一篇关于搜索引擎的文...