龙空技术网

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

UNET 1566

前言:

当前兄弟们对“python制作滚动字幕”可能比较讲究,咱们都需要知道一些“python制作滚动字幕”的相关内容。那么小编也在网摘上收集了一些对于“python制作滚动字幕””的相关资讯,希望我们能喜欢,看官们一起来了解一下吧!

前面有讲在窗体上如何滚动显示大尺寸图像,具体可以参看:84.Python——使用PyQt的ScrollArea滚动显示大尺寸图像。有网友留言能否做一个识别图像中的文字。

本文就在上一篇picview的程序基础上增加一个图像文字识别功能,并保存识别结果到文本文件中。

界面设计

整个垂直布局,分上,中,下三个区域,上区域一个listview和ScrollArea+Label用来显示图像。中间区域用TextEdit文本框来显示识别结果。下面一个功能按钮,一个识别、一个保存。文本框高度设定为窗体的四分之一。

UI

功能实现

功能:

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]
运行效果

结果1

结果2

标签: #python制作滚动字幕