上一篇文章讲的是1.0怎么批量识别,这一篇则讲解2.0的实现细节

两个版本功能细分如下:

1.0 支持批量识别图片并输出csv文件

2.0 包含1.0所有功能,并支持选定识别区域,单个识别和批量识别功能,支持实时显示识别结果

下面是运行图

以下是需求说明

选择区域就是在图像上拖一个框,一张图片可能会需要识别多个,所以要支持拖动几个框

如果拖错了,就需要有删除框的功能

选完之后,需要测试一下是否能正确识别,有时候框拉得大了,识别效果可能不理想,则需要重新框一次

支持断点续识功能,运行到中途可以关闭,下次打开能继续上一次进度

以下是技术实现细节

图形界面是使作PyQt5实现的

显示图片使用的控件是QLabel,图片的选取框则是使用了鼠标的点击事件加绘图API来实现,具体代码如下

class ImgLabel(QLabel):def __init__(self,parent=None):super(ImgLabel,self).__init__(parent)self.x0=0self.y0=0self.x1=0self.y1=0self.flag=False     #是否点击self.move=False     #是否移动self.pointList=[]self.pointCount=0self.set=QSettings("./point.ini",QSettings.IniFormat)self.set.setIniCodec('UTF-8')if self.set.contains("pointCount"):self.pointCount=int(self.set.value("pointCount"))for i in range(0,self.pointCount):p=self.set.value("point"+str(i))p=p.split(",")p=[int(i) for i in p]if len(p)==4:self.pointList.append(p)self.update()# 鼠标移动事件def mouseMoveEvent(self, event):# barHeight = self.bar.height()self.move = Trueif self.flag:self.x1 = event.pos().x()self.y1 = event.pos().y()self.update()# 鼠标释放事件def mouseReleaseEvent(self, event):self.flag = Falseself.move=Falseif not  self.x1 == 0 and not self.y1 == 0:point=(self.x0,self.y0,self.x1,self.y1)self.pointList.append(point)self.set.setValue("point"+str(self.pointCount),",".join(str(i) for i in point))self.pointCount+=1self.set.setValue("pointCount",self.pointCount)print(self.x0, self.y0, self.x1, self.y1)self.x0, self.y0, self.x1, self.y1=(0,0,0,0)self.update()def paintEvent(self, event):super().paintEvent(event)if self.flag and self.move:     # 只有当鼠标按下并且移动状态rect = QRect(self.x0, self.y0, abs(self.x1 - self.x0), abs(self.y1 - self.y0))painter = QPainter(self)painter.setPen(QPen(Qt.red, 2, Qt.SolidLine))painter.drawRect(rect)# print(self.x0, self.y0, self.x1, self.y1)if not self.flag and not self.move:print(len(self.pointList))painter = QPainter(self)painter.setPen(QPen(Qt.red, 2, Qt.SolidLine))for point in self.pointList:print("point=",point)x0,y0,x1,y1=pointrect = QRect(x0,y0, abs(x1-x0), abs(y1-y0))painter.drawRect(rect)# 单击鼠标触发事件def mousePressEvent(self, event):# barHeight = self.bar.height()self.x0 = event.pos().x()self.y0 = event.pos().y()self.flag = True#删除所有的框def clearPoint(self):self.pointList=[]self.pointCount=0self.set.setValue("pointCount",self.pointCount)#删除最近添加的框点位def deletePoint(self):if len(self.pointList)>0:self.pointList.pop()self.pointCount-=1self.set.setValue("pointCount",self.pointCount)for a in self.pointList:print(a)self.update()#获取所有框的点位def getPointList(self):return self.pointList

通过继续QLabel,重载了它的鼠标点击事件,并将拖动到的框保存到了point.ini里面,方便下一次启动读取,还可以手动修改框的位置,以支持更精细化的框选

点击选择文件后,通过文件选择器,选取文件,并将图像绘制到QLabel上

读取图片并显示图片用了opencv的方法,如果直接读的话,会有问题,具体什么问题不记得了,以下是代码

def selectFileProc(self):path=QFileDialog.getOpenFileName(self,"",os.getcwd(),"")[0]self.fileList=[]print(path)self.fileList.append(path)self.showImg(path)def showImg(self,first):self.pathLabel.setText(first)try:Img=cv2.imread(first) #通过opencv读入一张图片image_height, image_width, image_depth=Img.shape #读取图像高宽深度except:return None,0QIm=cv2.cvtColor(Img,cv2.COLOR_BGR2RGB)QIm=QImage(QIm.data, image_width, image_height,  image_width * image_depth,QImage.Format_RGB888)self.imgLabel.setPixmap(QPixmap.fromImage(QIm))self.imgLabel.updatereturn Img,1

单次运行代码

def test(self,testPath=None):if not testPath:testPath=self.fileList[0]if not testPath.endswith(".jpg"):print(testPath)pan=cv2.imread(testPath)#获取当前所有的选取框pointList=self.imgLabel.getPointList()text=""#识别每个框内的图片for point in pointList:x0,y0,x1,y1=pointresults=[]try:#切片之后识别img=pan[y0:y1,x0:x1]results=reader.readtext(img)print(results)except:pass#汇总识别结果for i in range(0,len(results)):result=results[i]x=result[1] if len(result)>2 else ""text=text+x+","self.pointLabel.setText(text)return text

批量识别代码

def run(self):fd=open("result.csv","w")self.table.clear()#遍历当前目录所有的图片for i in range(0,len(self.fileList)):#进度条显示self.processLabel.setText("%s/%s"%(i,len(self.fileList)))path=self.fileList[i]name=path.split("/")[-1]proc=i/len(self.fileList)*100self.process.setValue(proc)text=""#断点续识关键代码if os.path.exists("result/"+name+".result"):text=name+","+open("result/"+name+".result","r").read()else:img,ret=self.showImg(path)if ret:text=self.test(path)#每次识别完之后将结果保存到单独的文件里面,实现断点续识功能if not text=="":open("result/"+name+".result","w").write(text)text=name+","+textif not text=="":fd.write(text+"\n")self.table.addData(name,text)#识别过程中,需要刷新界面,不然会看到界面卡顿,毕竟这是信号槽,没有使用线程QApplication.processEvents(QEventLoop.AllEvents, 1);fd.close()print("run")

识别结果分两部份,一个是csv文件,一个是展示在table里面

如果表格里面有些记录不太好,则可以右键删除,下次运行时就可以重新识别

以下是代码

class ResultTable(QTableView):def __init__(self,parent=None):super(ResultTable,self).__init__(parent)self.setContextMenuPolicy(Qt.CustomContextMenu)self.customContextMenuRequested.connect(self.contextMenuRequested)self.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)self.currentRow=-1header=["fileName","data"]self.model=QStandardItemModel()self.model.setHorizontalHeaderLabels(header)self.setModel(self.model)def addData(self,name,data):count=self.model.rowCount()item=QStandardItem(name)self.model.setItem(count,0,item)item=QStandardItem(data)self.model.setItem(count,1,item)#self.scrollToBottom()def contextMenuRequested(self,point):row_num=-1for i in self.selectionModel().selection().indexes():row_num = i.row()print(row_num)breakself.currentRow=row_numdelAction=QAction("删除",self,triggered=self.delRow)popMenu=QMenu(self)popMenu.addAction(delAction)popMenu.exec_(QCursor.pos())def clear(self):self.model.setRowCount(0)def delRow(self):row=self.currentRowif row<0:returnmodelIndex=self.model.index(row,0)item=self.model.data(modelIndex)path="result/"+item+".result"if os.path.exists(path):os.remove(path)self.model.removeRow(row)if __name__=='__main__':app=QApplication(sys.argv)view=ResultTable()view.addData("aa1","bbbb")view.addData("aa2","bbbb")view.addData("aa3","bbbb")view.addData("aa4","bbbb")view.addData("aa5","bbbb")view.clear()view.show()app.exec_()

如何用python批量识别图片上的文字(二)相关推荐

  1. 如何用python批量识别图片上的文字(一)

    最近收到一个任务,任务内容如下: 指定一个目录,内含数千张图片,要求能将指定区域的数字记录下来,便于分析,图片如下所示 红框部分是需要识别出的区域 先分析下功能需求 1.识别指定区域的数据 2.将数据 ...

  2. python识别图片指定位置文字_python批量识别图片指定区域文字内容

    Python批量识别图片指定区域文字内容,供大家参考,具体内容如下 简介 对于一张图片,需求识别指定区域的内容 1.截取原始图上的指定图片当做模板 2.根据模板相似度去再原始图片上识别准确坐标 3.根 ...

  3. python 制定识别图片的某些区域_python批量识别图片指定区域文字内容

    Python批量识别图片指定区域文字内容,供大家参考,具体内容如下 简介 对于一张图片,需求识别指定区域的内容 1.截取原始图上的指定图片当做模板 2.根据模板相似度去再原始图片上识别准确坐标 3.根 ...

  4. python查找图片区域_python批量识别图片指定区域文字内容

    python批量识别图片指定区域文字内容,供大家参考,具体内容如下 简介 对于一张图片,需求识别指定区域的内容 1.截取原始图上的指定图片当做模板 2.根据模板相似度去再原始图片上识别准确坐标 3.根 ...

  5. python3识别图中的文字_Python3.x:如何识别图片上的文字

    Python3.x:如何识别图片上的文字 安装pytesseract库,必须先安装其依赖的PIL及tesseract-ocr,其中PIL为图像处理库,而后面的tesseract-ocr则为google ...

  6. python怎么识别图片里面的文字并合成语音_几行代码搞定识别图片中的文字信息,同时转换成语音...

    image前几天想把一篇不错的文章保存下来,无奈是图片的,于是想利用python把图片中的文字识别出来 实现的方式还是挺多的,这里介绍下百度的AI开放平台,毕竟大公司,感觉识别的精度会高点,同时相信他 ...

  7. 识别图片上的文字,如何在线识别?

    如何在线识别图片上的文字?其实很简单的,我们借助一些工具就可以进行识别了.不会识别图片文字的小伙伴们,可以跟着小编一起来学习一下哈! 步骤一:首先我们就是要在电脑上,下载一款工具.下载安装完成识别图片 ...

  8. 教你用OCR文字识别工具快速识别图片上的文字

    OCR文字识别工具,指利用OCR(Optical Character Recognition,光学字符识别) 技术,将图片.照片上的文字内容,直接转换为可编辑文本的工具.软件可以把图片 转换成可以编辑 ...

  9. 可以识别图片上的文字的小程序

    微信上的小程序相信大家都不陌生,近年来,微信小程序从"跳一跳"之后,越发火了.由于小程序的出现,微信上的功能也逐渐增加了,今天就给大家介绍一个小程序,比较实用,它可以快速识别图片上 ...

最新文章

  1. 汇编语言 第3版 王爽 检测点6.1自己的答案
  2. 技术非中立,语言非同质:机器翻译正被用于维护文化障碍
  3. 替换ubuntu 源
  4. kubernetes使用ansible快速构建集群
  5. Java 14:记录
  6. 对于引用的控件被拒绝访问的解决办法的补充(续)
  7. 怎么把php写入文件格式,如何将一个PHP数组有格式的写入文件中
  8. PDF虚拟打印机(virtual printer)软件汇总
  9. WPF的错误以及笔记
  10. win10电脑:。。。该内存不能为written.要终止程序,请单击确定
  11. centos7.6 挂载硬盘
  12. WiFi模块种类二:单WiFi功能双频WiFi模块
  13. 手机厂商为何取消3.5mm耳机孔?主要原因有5点,看完你就知道了
  14. JS生成随机颜色(rgb)
  15. Jenkins 打包配置
  16. jacobi旋转法的VB实现
  17. [ACTF新生赛2020]easyre
  18. matlab 删除workspace,MATLAB命令中清空workspace的是
  19. 传统企业PaaS平台功能设计与业务上云思考
  20. 新闻推荐数据集MIND介绍

热门文章

  1. 苏宁618公布8大福利 5亿膨胀红包已到位
  2. snprintf函数
  3. u盘文件删去了怎么样找得回来
  4. 微信小程序部分安卓机型无法保存图片的问题解决办法
  5. APP逆向案例之(三)sign 参数破解
  6. rpm卸载mysql不依靠依赖_centos彻底卸载mysql(不保留数据)
  7. 无线WiFi破解教程(转载)
  8. 【2022年】中科大研究生-考试题、复习资料汇总(往年真题+复习资料)(持续更新中)
  9. andriod TV 获取已连接蓝牙遥控器电池电量总结
  10. 谷歌chrome浏览器设置成深色(护眼)模式