使用Python PyQt5实现一个简单的图像识别软件
摘要:之前學習了tkinter庫,現在再學習一下python的另一個GUI庫——PyQt5,本文主要介紹如何使用Python PyQt5實現一個簡單的圖像識別軟件的步驟。
1.開發環境
語言:python3
開發工具:pycharm
工具庫:
PyQt5 5.12.1
pyqt5-tools 5.11.2.1.3
注:導入上面兩個庫要先導入sip庫
2.簡介
介紹:關于圖片和文字識別問題,采用Python、QT編程方法,借助百度AI提供的圖像識別接口,制作出一個簡單的圖片文字識別軟件;達到了對銀行卡、身份證、植物和動物圖像的識別功能,實現了對識別結果進行復制功能。
主要工作:
1.UI界面的設計
2.整個程序函數的書寫(功能實現)
3.軟件的測試與打包
3.效果圖
我已經將程序打包成了可以執行的python.exe文件,并放到了桌面,點擊即可運行。
點擊運行后:
4.開發步驟
4.1導入所需的庫
使用pip命令或者通過pycharm導入都可,以下是需要導入的庫。
sip PyQt5 5.12.1 pyqt5-tools 5.11.2.1.34.2設計GUI界面
1.通過QtDesigner方式設計UI界面,要先在pycharm上配置好擴展工具
file——>settings——>Tools——>ExternalTools
要添加兩個工具,一個用來設計GUI,另一個用來把設計好的GUI變成python代碼文件。
用來設計GUI的工具創建如下圖:
把設計好的GUI變成python代碼文件的工具創建如下圖:
設置:
第一個框 設置名稱
第二個框 設置python解釋器路徑(就是虛擬環境下的scripts\python.exe)
第三個框
第四個框:
$FileDir$
查看是否創建成功,選中一個.py文件,右鍵;如下圖所示,如果出現剛剛創建的即可:
以上是使用QtDesigner設計GUI界面的準備工作,如果你有QtDesigner基礎,上面的可以直接不看。
2.正式設計軟件的界面
2.1點擊下圖按鈕
2.2點擊后出現下面界面,這里是設計GUI的界面,這里可以拖動標簽和按鈕來設計自己想要的軟件界面。
2.3設計好后的效果
3.把設計好的ui文件轉成py文件,選中剛剛創建好的ui文件,使用第二個擴展工具,即可生成同名的.py文件
4.3整個程序函數的書寫(功能實現)
主要在上面生成的.py文件里修改完善軟件功能。添加點擊事件和識別調用接口以及函數功能的完善。
值得一提的是,這里主要是調用了百度AI提供的圖像文字識別接口,而我們的主要任務就是整個軟件的邏輯控制和功能拼接。以及對返回數據進行解析和數據可視化。
網址:點擊前往百度智能云
想要整個軟件的全部代碼請私信我,里面包含詳細的注釋:
# -*- coding: utf-8 -*-""" 2020.7.8 yue AI圖片識別軟件介紹:關于圖片和文字識別問題,采用Python、QT編程方法,借助百度AI提供的圖像識別接口,制作出一個簡單的圖片文字識別軟件;達到了對銀行卡、身份證、植物和動物圖像的識別功能,實現了對識別結果進行復制功能。主要工作: 1.UI界面的設計 2.整個程序函數的書寫(功能實現) 3.軟件的測試與打包"""# Form implementation generated from reading ui file 'imgreconition.ui' # # Created by: PyQt5 UI code generator 5.12.1 # # WARNING! All changes made in this file will be lost! import json import sysimport requests from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *import urllib,urllib.request import sslimport base64#自己申請到的 圖像文字識別 文字識別 API_KEY = ' ' SECRET = ' '# 另外獲取token值 圖像識別 P_KEY = ' ' P_SECRET = ' 'class Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(597, 471)self.horizontalLayoutWidget = QtWidgets.QWidget(Form)self.horizontalLayoutWidget.setGeometry(QtCore.QRect(90, 50, 171, 31))self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)self.horizontalLayout.setContentsMargins(0, 0, 0, 0)self.horizontalLayout.setObjectName("horizontalLayout")self.label = QtWidgets.QLabel(self.horizontalLayoutWidget)self.label.setObjectName("label")self.horizontalLayout.addWidget(self.label)self.comboBox = QtWidgets.QComboBox(self.horizontalLayoutWidget)self.comboBox.setObjectName("comboBox")self.comboBox.addItem("")self.comboBox.addItem("")self.comboBox.addItem("")self.comboBox.addItem("")self.comboBox.addItem("")self.comboBox.addItem("")self.comboBox.addItem("")self.comboBox.addItem("")self.comboBox.addItem("")self.comboBox.addItem("")self.comboBox.addItem("")self.horizontalLayout.addWidget(self.comboBox)self.horizontalLayoutWidget_2 = QtWidgets.QWidget(Form)self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(40, 100, 271, 31))self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2")self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2)self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)self.horizontalLayout_2.setObjectName("horizontalLayout_2")self.label_2 = QtWidgets.QLabel(self.horizontalLayoutWidget_2)self.label_2.setObjectName("label_2")self.horizontalLayout_2.addWidget(self.label_2)self.lineEdit = QtWidgets.QLineEdit(self.horizontalLayoutWidget_2)self.lineEdit.setObjectName("lineEdit")self.horizontalLayout_2.addWidget(self.lineEdit)self.pushButton = QtWidgets.QPushButton(self.horizontalLayoutWidget_2)self.pushButton.setObjectName("pushButton")self.horizontalLayout_2.addWidget(self.pushButton)self.label_3 = QtWidgets.QLabel(Form)self.label_3.setGeometry(QtCore.QRect(40, 140, 271, 261))#self.label_3.setStyleSheet("background-color: rgb(255, 255, 127);")self.label_3.setStyleSheet("border-width: 1px;border-style: solid;boder-color: rgb(0,0,0);")self.label_3.setText("")self.label_3.setObjectName("label_3")self.label_4 = QtWidgets.QLabel(Form)self.label_4.setGeometry(QtCore.QRect(330, 50, 241, 321))#self.label_4.setStyleSheet("background-color: rgb(85, 255, 0);")self.label_4.setStyleSheet("border-width: 1px;border-style: solid;boder-color: rgb(0,0,0);")self.label_4.setText("")self.label_4.setObjectName("label_4")self.pushButton_2 = QtWidgets.QPushButton(Form)self.pushButton_2.setGeometry(QtCore.QRect(330, 380, 241, 23))self.pushButton_2.setObjectName("pushButton_2")self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)''' 1.QFileDialog.getOpenFileName(self.horizontalLayoutWidget_2,"選擇要識別的圖片","/","Image File(*.jpg *.png)")getOpenFileName返回一個被用戶選中的文件的路徑,前提是這個文件是存在的。第一個參數parent,用于指定父組件。注意,很多Qt組件的構造函數都會有這么一個parent參數,并提供一個默認值0;第二個參數caption,是對話框的標題;第三個參數dir,是對話框顯示時默認打開的目錄,"." 代表程序運行目錄,"/" 代表當前盤符的根目錄(Windows,Linux下/就是根目錄了),也可以是平臺相關的,比如"C:\\"等;例如我想打開程序運行目錄下的Data文件夾作為默認打開路徑,這里應該寫成"./Data/",若想有一個默認選中的文件,則在目錄后添加文件名即可:"./Data/teaser.graph"第四個參數filter,是對話框的后綴名過濾器,比如我們使用"Image Files(*.jpg *.png)"就讓它只能顯示后綴名是jpg或者png的文件。如果需要使用多個過濾器,使用";;"分割,比如"JPEG Files(*.jpg);;PNG Files(*.png)";第五個參數selectedFilter,是默認選擇的過濾器;第六個參數options,是對話框的一些參數設定,比如只顯示文件夾等等,它的取值是enum QFileDialog::Option,每個選項可以使用 | 運算組合起來。如果我要想選擇多個文件怎么辦呢?Qt提供了getOpenFileNames()函數,其返回值是一個QStringList。你可以把它理解成一個只能存放QString的List,也就是STL中的list<string>。2.QPixmap類用于繪圖設備的圖像顯示,它可以作為一個QPaintDevice對象,也可以加載到一個控件中,通常是標簽或按鈕,用于在標簽或按鈕上顯示圖像。QPixmap可以讀取的圖像文件類型有BMP、GIF、JPG、JPEG、PNG、PBM、PGM、PPM、XBM、XPM等。利用QImage、QPxmap類可以實現圖像的顯示,并且利用類中的方法可以實現圖像的基本操作(縮放、旋轉)。3.QApplication.clipboard()4.完善運行測試代碼,如下: if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)main = QtWidgets.QMainWindow()#創建一個主窗體(必須要有一個主窗體)content = SimpleDialogForm()#創建對話框content.setupUi(main)#將對話框依附于主窗體main.show()#主窗體顯示sys.exit(app.exec_())'''4.4把程序打包成可執行文件
1.先導入Pyinstaller庫
2.打開終端
3.輸入以下命令:
-F 是用于將所有的支持文件全部都打包在一起,不顯示其他的依賴文件(如果沒有這個屬性,你會發現所有生成的、所需支持的依賴文件會全部在文件夾下)
-w 在程序運行的過程中隱藏后臺控制的黑窗口
4.命令執行成功后會生成多個新的文件夾,而可執行文件在dist文件夾里面。
5.續
說明:2020.11.6日,為完成算法可作業棋盤覆蓋問題作業,UI設計我還是采用QT5制作,發現幾個問題,記錄一下:
1.lineEdit輸入框輸入數值若是要整數型,則要進行強轉為int形,否則程序會出現無法運行情況。
2.由ui設計到.py文件,需要每修改一次后進行重新生成.py文件。因此,UI設計最好一開始就設計完美,然后再進行程序邏輯的書寫。
3.這里采用了plt繪制熱力圖的實現方式,生成圖片后保存圖片,然后讀取圖片。
4.若出現python.exe已停止工作,說明程序有bug,使用pycharm的deBug模式找到bug并且修改。
5.若出現生成的.exe文件報Failed to execute script錯誤,很大概率時當前虛擬環境不存在要用到的包,需在文件夾中查看,然后導入,再生成exe文件。
總結
以上是生活随笔為你收集整理的使用Python PyQt5实现一个简单的图像识别软件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uni-app+flask 快速开发图像
- 下一篇: python对excel读写操作