前言:
当前兄弟们对“python制作滚动字幕”可能比较讲究,咱们都需要知道一些“python制作滚动字幕”的相关内容。那么小编也在网摘上收集了一些对于“python制作滚动字幕””的相关资讯,希望我们能喜欢,看官们一起来了解一下吧!前面有讲在窗体上如何滚动显示大尺寸图像,具体可以参看:84.Python——使用PyQt的ScrollArea滚动显示大尺寸图像。有网友留言能否做一个识别图像中的文字。
本文就在上一篇picview的程序基础上增加一个图像文字识别功能,并保存识别结果到文本文件中。
界面设计
整个垂直布局,分上,中,下三个区域,上区域一个listview和ScrollArea+Label用来显示图像。中间区域用TextEdit文本框来显示识别结果。下面一个功能按钮,一个识别、一个保存。文本框高度设定为窗体的四分之一。
功能实现
功能:
1、默认打开获取当前目录中的所有图像,点击选择文件夹项,可以选择任意目录。
2、单击图像文件名,可以显示整幅图像,点击图像,可以在图像展示区按比例缩放整个图像。(窗口可以自适应改变大小)
3、对打开的当前图像进行文字识别(这里使用的是 paddleocr)
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、QImage图像格式转为cv2图像格式。文字识别传入的图像参数img: img for ocr, support ndarray, img_path and list or ndarray。所以这里也可以直接使用img_path。
#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]运行效果
标签: #python制作滚动字幕