# 實時英文 OCR 文字識別:從攝像頭到 PyQt5 界面的實現

實時英文 OCR 文字識別:從攝像頭到 PyQt5 界面的實現

引言

在數字化時代,文字識別技術(OCR)在眾多領域中發揮著重要作用。無論是文檔掃描、車牌識別還是實時視頻流中的文字提取,OCR 技術都能提供高效且準確的解決方案。本文將介紹如何使用 Python 和 PaddleOCR 實現從攝像頭捕獲視頻流并實時識別其中的英文文字,同時將結果顯示在 PyQt5 界面中。

技術棧

  • PaddleOCR:百度開源的 OCR 工具,支持多種語言的文字識別。
  • OpenCV:用于圖像處理和視頻流操作。
  • PyQt5:用于創建圖形用戶界面(GUI)。
  • Python:作為主要編程語言。

環境準備

在開始之前,確保你的環境中安裝了以下必要的庫:

pip install paddlepaddle paddleocr opencv-python PyQt5

實現步驟

1. 創建 PyQt5 界面

首先,我們需要創建一個簡單的 PyQt5 界面,用于顯示攝像頭視頻流和識別結果。界面包含一個視頻顯示區域、一個文本顯示區域和一個控制按鈕。

文件 1:untitled6.py
# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'untitled6.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(1273, 877)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")# 創建一個 QLabel 用于顯示攝像頭視頻流self.label = QtWidgets.QLabel(self.centralwidget)self.label.setGeometry(QtCore.QRect(240, 60, 501, 261))self.label.setText("")self.label.setObjectName("label")# 創建一個 QPushButton 用于控制攝像頭的開關self.pushButton = QtWidgets.QPushButton(self.centralwidget)self.pushButton.setGeometry(QtCore.QRect(450, 490, 93, 51))self.pushButton.setObjectName("pushButton")# 創建一個 QTextEdit 用于顯示 OCR 識別結果self.textEdit = QtWidgets.QTextEdit(self.centralwidget)self.textEdit.setGeometry(QtCore.QRect(973, 6, 301, 581))self.textEdit.setObjectName("textEdit")MainWindow.setCentralWidget(self.centralwidget)self.menubar = QtWidgets.QMenuBar(MainWindow)self.menubar.setGeometry(QtCore.QRect(0, 0, 1273, 26))self.menubar.setObjectName("menubar")MainWindow.setMenuBar(self.menubar)self.statusbar = QtWidgets.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")MainWindow.setStatusBar(self.statusbar)self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "OCR Camera"))self.pushButton.setText(_translate("MainWindow", "打開"))

2. 實現主程序邏輯

接下來,我們實現主程序邏輯,包括初始化 PaddleOCR、捕獲攝像頭視頻流、進行 OCR 識別并將結果顯示在 PyQt5 界面中。

文件 2:ocrCap.py
from paddleocr import PaddleOCR
import cv2
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QMessageBoxfrom untitled6 import Ui_MainWindow  # 導入UI類import sysclass PyQtMainEntry(QMainWindow, Ui_MainWindow):def __init__(self):super().__init__()self.setupUi(self)# 初始化 PaddleOCR,設置為英文識別self.ocr = PaddleOCR(use_angle_cls=True, use_gpu=True, show_log=False,det_model_dir='en_PP-OCRv3_det_infer',rec_model_dir='en_PP-OCRv3_rec_infer',cls_model_dir='ch_ppocr_mobile_v2.0_cls_slim_infer',lang="en")# 初始化攝像頭self.camera1 = cv2.VideoCapture(0)self.is_camera_opened = Falseself._timer = QtCore.QTimer(self)self._timer.timeout.connect(self._queryFrame)self._timer.setInterval(30)self.pushButton.clicked.connect(self.slot1)def slot1(self):# 控制攝像頭的開關self.is_camera_opened = not self.is_camera_openedif self.is_camera_opened:self.pushButton.setText("關閉")self._timer.start()else:self.pushButton.setText("打開")self._timer.stop()def _queryFrame(self):# 從攝像頭讀取一幀ret1, self.frame1 = self.camera1.read()if ret1:# 調整幀大小self.frame11 = cv2.resize(self.frame1, (640, 480))qimage = cv2.cvtColor(self.frame11, cv2.COLOR_BGR2RGB)qimage = QtGui.QImage(qimage.data, qimage.shape[1], qimage.shape[0],QtGui.QImage.Format_RGB888)pixmap = QtGui.QPixmap.fromImage(qimage)self.label.setPixmap(pixmap)# 進行 OCR 識別result = self.ocr.ocr(self.frame1, cls=True)if result is not None:a_list = [line[1][0] for line in result[0]]zz = '\n'.join(a_list)self.textEdit.setText(zz)else:self.textEdit.setText("未檢測到文本")if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)window = PyQtMainEntry()window.show()sys.exit(app.exec_())

3. 代碼解釋

  • PaddleOCR 初始化

    • use_angle_cls=True:啟用角度分類器,用于處理旋轉文本。
    • use_gpu=True:使用 GPU 加速,提高識別速度。
    • show_log=False:關閉日志輸出,避免不必要的信息干擾。
    • det_model_dirrec_model_dircls_model_dir:指定模型文件路徑。
    • lang="en":設置識別語言為英文。
  • 視頻流捕獲

    • 使用 cv2.VideoCapture(0) 捕獲默認攝像頭的視頻流。
    • 每次循環讀取一幀,并進行 OCR 識別。
  • OCR 識別

    • ocr.ocr(frame, cls=True):對當前幀進行 OCR 識別,返回識別結果。
    • 遍歷識別結果,提取文本框的四個角點,并繪制文本框。
    • 提取識別的文本內容,并在文本框左上角位置顯示。
  • 顯示結果

    • 使用 cv2.imshow 顯示處理后的視頻幀。
    • 按下 ‘q’ 鍵退出程序,并釋放攝像頭資源。

4. 運行程序

最后,運行程序并查看效果:

python ocrCap.py

總結

通過上述步驟,我們成功地實現了一個從攝像頭捕獲視頻流并實時識別其中英文文字的程序,并將結果顯示在 PyQt5 界面中。這個項目不僅可以用于學習和研究,還可以應用于實際場景,如實時文檔掃描、車牌識別等。希望這篇文章能幫助你更好地理解和應用 OCR 技術。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905390.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905390.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905390.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

<C#>log4net 的配置文件配置項詳細介紹

log4net 是一個功能強大的日志記錄工具&#xff0c;通過配置文件可以靈活地控制日志的輸出方式、格式、級別等。以下是對 log4net 配置文件常見配置項的詳細介紹&#xff1a; 根元素 <log4net> 這是 log4net 配置文件的根元素&#xff0c;所有配置項都要包含在該元素內…

編譯docker版openresty

使用alpine為基礎鏡像 # 使用Alpine作為基礎鏡像 FROM alpine:3.18# 替換為阿里云鏡像源&#xff0c;并安裝必要的依賴 RUN sed -i s|https://dl-cdn.alpinelinux.org/alpine|https://mirrors.aliyun.com/alpine|g /etc/apk/repositories && \apk add --no-cache \bui…

conda 輸出指定python環境的庫 輸出為 yaml文件

conda 輸出指定python環境的庫 輸出為 yaml文件。 有時為了項目部署&#xff0c;需要匹配之前的python環境&#xff0c;需要輸出對應的python依賴庫。 假設你的目標環境名為 myenv&#xff0c;運行以下命令&#xff1a; conda env export -n myenv > myenv_environment.ym…

[Java][Leetcode middle] 121. 買賣股票的最佳時機

暴力循環 總是以最低的價格買入&#xff0c;以最高的價格賣出: 例如第一天買入&#xff0c;去找剩下n-1天的最高價格&#xff0c;計算利潤 依次計算到n-1天買入&#xff1b; 比較上述利潤 // 運行時間超時。 o(n^2)public int maxProfit1(int[] prices) {int profit 0;for (i…

克隆虛擬機組成集群

一、克隆虛擬機 1. 準備基礎虛擬機 確保基礎虛擬機已安裝好操作系統&#xff08;如 Ubuntu&#xff09;、Java 和 Hadoop。關閉防火墻并禁用 SELinux&#xff08;如適用&#xff09;&#xff1a; bash sudo ufw disable # Ubuntu sudo systemctl disable firewalld # CentO…

記錄一次使用thinkphp使用PhpSpreadsheet擴展導出數據,解決身份證號碼等信息科學計數法問題處理

PhpSpreadsheet官網 PhpSpreadsheet安裝 composer require phpoffice/phpspreadsheet使用composer安裝時一定要下載php對應的版本&#xff0c;下載之前使用php -v檢查當前php版本 簡單使用 <?php require vendor/autoload.php;use PhpOffice\PhpSpreadsheet\Spreadshee…

前端工程化:從 Webpack 到 Vite

引言 前端工程化是現代Web開發不可或缺的一部分&#xff0c;它通過自動化流程和標準化實踐&#xff0c;提高了開發效率和代碼質量。在這個領域中&#xff0c;構建工具扮演著核心角色&#xff0c;而Webpack和Vite則是其中的兩位重要角色。本文將探討前端工程化的演進歷程&#…

Leetcode 3543. Maximum Weighted K-Edge Path

Leetcode 3543. Maximum Weighted K-Edge Path 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3543. Maximum Weighted K-Edge Path 1. 解題思路 這一題思路上就是一個遍歷的思路&#xff0c;我們只需要考察每一個節點作為起點時&#xff0c;所有長為 k k k的線段的長度&…

香橙派zero3 安卓TV12,更換桌面launcher,開機自啟動kodi

打開開發者模式&#xff0c;連擊版本號&#xff0c;基本上都是這樣。 adb連接 查找桌面包名 adb shell dumpsys activity activities | findstr mResumedActivity 禁用原桌面com.android.tv.launcher&#xff0c;已經安裝了projectivylauncher434.apk桌面。 adb shell pm …

半小時快速入門Spring AI:使用騰訊云編程助手CodeBuddy 開發簡易聊天程序

引言 隨著人工智能&#xff08;AI&#xff09;技術的飛速發展&#xff0c;越來越多的開發者開始探索如何將AI集成到自己的應用中。人工智能正在迅速改變各行各業的工作方式&#xff0c;從自動化客服到智能推薦系統&#xff0c;AI的應用幾乎無處不在。Spring AI作為一種開源框架…

【unity游戲開發——編輯器擴展】使用MenuItem自定義菜單欄拓展

免職聲明&#xff1a; 1、目前本博客分享的大部分知識產出方式是&#xff1a;學習別人知識自己實際做一遍自己的理解擴展內容自己整理、歸納、總結再分享。2、正如博客簡介所說&#xff1a;這里沒有教程&#xff0c;這里只做學習分享。所有的內容都是學習筆記&#xff0c;可以說…

數學復習筆記 7

前言 現在復習線代基礎&#xff0c;慢慢打基礎。。 轉置 方陣轉置之后行列式保持不變。我的筆記感覺主要不是整理知識點&#xff0c;主要是把我的一些理解記錄下來。這才是我自己的東西&#xff0c;那些需要記住的知識和內容記住就好了。記住轉置有四個性質&#xff0c;在講…

AIGC時代的內容安全:AI檢測技術如何應對新型風險挑戰?

在數字時代&#xff0c;互聯網內容以文本、圖像、音頻和視頻等形式呈現爆發式增長&#xff0c;深刻塑造了信息傳播的格局。然而&#xff0c;內容的快速傳播也帶來了嚴峻挑戰&#xff1a;違法信息&#xff08;如涉黃、涉政&#xff09;、虛假廣告、網絡暴力等內容不僅威脅用戶體…

PyTorch中的nn.Embedding應用詳解

PyTorch 文章目錄 PyTorch前言一、nn.Embedding的基本原理二、nn.Embedding的實際應用簡單的例子自然語言處理任務 前言 在深度學習中&#xff0c;詞嵌入&#xff08;Word Embedding&#xff09;是一種常見的技術&#xff0c;用于將離散的詞匯或符號映射到連續的向量空間。這種…

AI 檢測原創論文:技術迷思與教育本質的悖論思考

當高校將 AI 寫作檢測工具作為學術誠信的 "電子判官"&#xff0c;一場由技術理性引發的教育異化正在悄然上演。GPT-4 檢測工具將人類創作的論文誤判為 AI 生成的概率高達 23%&#xff08;斯坦福大學 2024 年研究數據&#xff09;&#xff0c;這種 "以 AI 制 AI&…

langchain4j集成QWen、Redis聊天記憶持久化

langchain4j實現聊天記憶默認是基于進程內存的方式&#xff0c;InMemoryChatMemoryStore是具體的實現了&#xff0c;是將聊天記錄到一個map中&#xff0c;如果用戶大的話&#xff0c;會造成內存溢出以及數據安全問題。位了解決這個問題 langchain4提供了ChatMemoryStore接口&am…

Tomcat 日志體系深度解析:從訪問日志配置到錯誤日志分析的全鏈路指南

一、Tomcat 核心日志文件架構與核心功能 1. 三大基礎日志文件對比&#xff08;權威定義&#xff09; 日志文件數據來源核心功能典型場景catalina.out標準輸出 / 錯誤重定向包含 Tomcat 引擎日志與應用控制臺輸出&#xff08;System.out/System.err&#xff09;排查 Tomcat 啟…

萬物互聯時代:ONVIF協議如何重構安防監控系統架構

前言 一、ONVIF協議是什么 ONVIF&#xff08;Open Network Video Interface Forum&#xff0c;開放式網絡視頻接口論壇&#xff09;是一種全球性的開放行業標準&#xff0c;由安訊士&#xff08;AXIS&#xff09;、博世&#xff08;BOSCH&#xff09;和索尼&#xff08;SONY&…

leetcode - 雙指針問題

文章目錄 前言 題1 移動零&#xff1a; 思路&#xff1a; 參考代碼&#xff1a; 題2 復寫零&#xff1a; 思考&#xff1a; 參考代碼&#xff1a; 題3 快樂數&#xff1a; 思考&#xff1a; 參考代碼&#xff1a; 題4 盛最多水的容器&#xff1a; 思考&#xff1a;…

從概念表達到安全驗證:智能駕駛功能迎來系統性規范

隨著輔助駕駛事故頻發&#xff0c;監管機制正在迅速補位。面對能力表達、使用責任、功能部署等方面的新要求&#xff0c;行業開始重估技術邊界與驗證能力&#xff0c;數字樣機正成為企業合規落地的重要抓手。 2025年以來&#xff0c;圍繞智能駕駛功能的爭議不斷升級。多起因輔…