前面有讲在窗体上如何滚动显示大尺寸图像,具体可以参看:84.——使用PyQt的滚动显示大尺寸图像。有网友留言能否做一个识别图像中的文字。
本文就在上一篇的程序基础上增加一个图像文字识别功能人工智能图像识别技术,并保存识别结果到文本文件中。
界面设计
整个垂直布局,分上,中,下三个区域,上区域一个和+Label用来显示图像。中间区域用文本框来显示识别结果。下面一个功能按钮人工智能图像识别技术,一个识别、一个保存。文本框高度设定为窗体的四分之一。
UI
功能实现
功能:
1、默认打开获取当前目录中的所有图像,点击选择文件夹项,可以选择任意目录。
2、单击图像文件名,可以显示整幅图像,点击图像,可以在图像展示区按比例缩放整个图像。(窗口可以自适应改变大小)
3、对打开的当前图像进行文字识别(这里使用的是 )
4、保存文字识别结果
代码:
import sysimport osfrom PyQt5 import QtCore, QtGui,QtWidgetsfrom Ui_picocr import Ui_MainWindowimport paddleocrimport numpy as np class MainWindow(QtWidgets.QMainWindow,Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) self.imgname="" self.npimg=np.array([]) #设置图片控件的双击事件 self.lblimg.mousePressEvent=self.img_scale #图像列表框按键事件 self.lstimg.keyPressEvent=self.on_lstimg_keyPressEvent #文字识别按钮点击事件 self.btnocr.clicked.connect(self.on_btnocr_clicked) #保存按钮点击事件 self.btnsave.clicked.connect(self.on_btnsave_clicked) #设置图片控件文本提示 self.lblimg.setToolTip("双击自动调整大小") #获取当前目录 curdir=os.path.abspath(os.curdir) #获取当前目录下的所有图片文件 lstimg=["选择文件夹"] for root,dir,file in os.walk(curdir): for f in file: if os.path.splitext(f)[1] in ['.jpg','.png','.bmp']: lstimg.append(os.path.join(root,f)) #把图片文件列表放到listview中 slm=QtCore.QStringListModel() slm.setStringList(lstimg) self.lstimg.setModel(slm) #设置txtedit高度 self.txtedit.setFixedHeight(self.height()//4) #图片列表单击事件 def on_lstimg_clicked(self,index): #获取当前图片文件名 self.imgname=self.lstimg.model().stringList()[index.row()] if self.imgname=="选择文件夹": #打开选择文件夹对话框 dirname=QtWidgets.QFileDialog.getExistingDirectory(self,'选择文件夹') lstimg=["选择文件夹"] for root,dir,file in os.walk(dirname): for f in file: if os.path.splitext(f)[1] in ['.jpg','.png','.bmp']: lstimg.append(os.path.join(root,f)) #把图片文件列表放到listview中 slm=QtCore.QStringListModel() slm.setStringList(lstimg) self.lstimg.setModel(slm) else: #获取图像的宽高 img=QtGui.QImage(self.imgname) h,w,c=img.height(),img.width(),img.format() #QImage图像格式转换为cv2图像格式########## # Format_RGB32 = 4,存入格式为B,G,R,A 对应 0,1,2,3 # RGB32图像每个像素用32比特位表示,占4个字节, # R,G,B分量分别用8个bit表示,存储顺序为B,G,R,最后8个字节保留 img2bgr=img.convertToFormat(QtGui.QImage.Format_RGB32) ptr=img2bgr.bits() ptr.setsize(img2bgr.byteCount()) self.npimg=np.array(ptr,dtype=np.uint8).reshape(h,w,4) #去掉alpha通道BGR self.npimg=self.npimg[:,:,:3] #设置scrollarea的滚动范围和自动调整大小 self.scrollAreaWidgetContents.setMinimumSize(w,h) #设置图像控件的宽高 self.lblimg.setFixedSize(w,h) #显示图片 self.lblimg.setPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(self.imgname))) self.statusBar().showMessage(self.imgname) #图像列表框按键事件 def on_lstimg_keyPressEvent(self,event): if event.key()==QtCore.Qt.Key_Down or event.key()==QtCore.Qt.Key_Up: self.lstimg.setCurrentIndex(self.lstimg.currentIndex().sibling(self.lstimg.currentIndex().row()+1,0)) self.on_lstimg_clicked(self.lstimg.currentIndex()) #图像控件双击事件 def img_scale(self,event): #设置大小为滚动区域的大小 self.lblimg.setFixedSize(self.scroll.width(),self.scroll.height()) #设置图像大小自适应控件大小 self.lblimg.setPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(self.imgname)).scaled(self.lblimg.width(), self.lblimg.height(),QtCore.Qt.KeepAspectRatio)) #ocr按钮事件 def on_btnocr_clicked(self): ocr=paddleocr.PaddleOCR(use_angle_cls=True,lang="ch") result=ocr.ocr(self.npimg) boxes=[] txts=[] scores=[] for line in result: boxes.append(line[0]) txts.append(line[1][0]) scores.append(line[1][1]) self.txtedit.setText("n".join(txts)) def on_btnsave_clicked(self): #保存文本,打开保存文本对话框 filename=QtWidgets.QFileDialog.getSaveFileName(self,'保存文本','','Text Files(*.txt)') with open(filename[0],"w") as f: f.write(self.txtedit.toPlainText()) self.statusBar().showMessage("保存成功") if __name__ == '__main__': app=QtWidgets.QApplication(sys.argv) window=MainWindow() window.setWindowTitle("picocr") window.show() sys.exit(app.exec_())
注意:
1、列表响应箭头按键事件
#图像列表框按键事件 self.lstimg.keyPressEvent=self.on_lstimg_keyPressEvent
2、图像格式转为cv2图像格式。文字识别传入的图像参数img: img for ocr, , and list or 。所以这里也可以直接使用。
#QImage图像格式转换为cv2图像格式########### Format_RGB32 = 4,存入格式为B,G,R,A 对应 0,1,2,3# RGB32图像每个像素用32比特位表示,占4个字节,# R,G,B分量分别用8个bit表示,存储顺序为B,G,R,最后8个字节保留img2bgr=img.convertToFormat(QtGui.QImage.Format_RGB32)ptr=img2bgr.bits()ptr.setsize(img2bgr.byteCount())self.npimg=np.array(ptr,dtype=np.uint8).reshape(h,w,4)#去掉alpha通道BGRself.npimg=self.npimg[:,:,:3]
运行效果
结果1
结果2
本文到此结束,希望对大家有所帮助。
本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至81118366@qq.com举报,一经查实,本站将立刻删除。发布者:简知小编,转载请注明出处:https://www.jianzixun.com/99654.html