85.人工智能——PyQt+图像文字识别

前面有讲在窗体上如何滚动显示大尺寸图像,具体可以参看:84.——使用PyQt的滚动显示大尺寸图像 。有网友留言能否做一个识别图像中的文字 。
本文就在上一篇的程序基础上增加一个图像文字识别功能人工智能图像识别技术,并保存识别结果到文本文件中 。
界面设计
整个垂直布局,分上,中,下三个区域,上区域一个和+Label用来显示图像 。中间区域用文本框来显示识别结果 。下面一个功能按钮人工智能图像识别技术 , 一个识别、一个保存 。文本框高度设定为窗体的四分之一 。
UI
功能实现
功能:
1、默认打开获取当前目录中的所有图像,点击选择文件夹项,可以选择任意目录 。
2、单击图像文件名,可以显示整幅图像,点击图像,可以在图像展示区按比例缩放整个图像 。(窗口可以自适应改变大?。?
3、对打开的当前图像进行文字识别(这里使用的是 )
4、保存文字识别结果
代码:
import sysimport osfrom PyQt5 import QtCore, QtGui,QtWidgetsfrom Ui_picocr import Ui_MainWindowimport paddleocrimport numpy as npclass 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通道BGRself.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
【85.人工智能——PyQt+图像文字识别】本文到此结束,希望对大家有所帮助 。