文章目錄
- 前言
- 一、代碼總述&介紹
- 1.1導入必要的庫
- 1.1.1cv2
- 1.1.2re
- 1.1.3paddleocr
- 1.2初始化PaddleOCR
- 1.3打開攝像頭
- 1.4使用 PaddleOCR 進行識別
- 1.5定義正則表達式模式
- 1.6打印提取結果
- 1.7異常處理
- 二、正則表達式
- 2.1簡介
- 2.2常用正則表達式模式及原理
- 2.2.1. 快遞單號模式
- 2.2.2. 手機號模式
- 2.2.3. 姓名模式
- 2.3正則表達式的使用原理
前言
本文簡單介紹了paddleocr中使用的到的正則化。
一、代碼總述&介紹
import cv2
import re
from paddleocr import PaddleOCR# 初始化 PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang="ch")# 打開攝像頭
cap = cv2.VideoCapture(0)if not cap.isOpened():print("無法打開攝像頭")exit()try:while True:# 讀取攝像頭幀ret, frame = cap.read()if not ret:print("無法獲取幀,退出...")break# 使用 PaddleOCR 進行識別result = ocr.ocr(frame, cls=True)text = ""for line in result:for word_info in line:text += word_info[1][0] + " "# 定義正則表達式模式# 快遞單號:通常是數字和字母的組合,長度可能在 10 到 20 位左右express_pattern = r'[A-Za-z0-9]{10,20}'# 手機號:以 1 開頭,后面跟 10 位數字phone_pattern = r'1\d{10}'# 姓名:簡單假設為 2 到 4 個漢字name_pattern = r'[\u4e00-\u9fa5]{2,4}'# 查找匹配項express_numbers = re.findall(express_pattern, text)phone_numbers = re.findall(phone_pattern, text)names = re.findall(name_pattern, text)# 打印提取結果print("快遞單號:", express_numbers)print("手機號:", phone_numbers)print("姓名:", names)# 顯示幀cv2.imshow('Camera Feed', frame)# 按 'q' 鍵退出循環if cv2.waitKey(1) & 0xFF == ord('q'):breakexcept Exception as e:print(f"發生錯誤: {e}")
finally:# 釋放攝像頭并關閉窗口cap.release()cv2.destroyAllWindows()
1.1導入必要的庫
python
import cv2
import re
from paddleocr import PaddleOCR
1.1.1cv2
import cv2:導入 OpenCV 庫,它是一個廣泛用于計算機視覺任務的庫,這里主要用于攝像頭操作和圖像顯示。
1.1.2re
import re:導入 Python 的 re 模塊,用于進行正則表達式匹配,方便從識別出的文本中提取特定信息。
1.1.3paddleocr
from paddleocr import PaddleOCR:從 paddleocr 庫中導入 PaddleOCR 類,用于進行光學字符識別(OCR)。
1.2初始化PaddleOCR
## 初始化 PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
ocr = PaddleOCR(use_angle_cls=True, lang="ch"):創建一個 PaddleOCR 對象 ocr。use_angle_cls=True 表示啟用角度分類功能,能更好地處理不同角度的文字;lang="ch" 表示使用中文進行識別。
1.3打開攝像頭
# 打開攝像頭
cap = cv2.VideoCapture(0)
------
cap = cv2.VideoCapture(0):使用 cv2.VideoCapture 函數打開默認攝像頭(編號為 0),并將返回的視頻捕獲對象賦值給 cap。
檢查攝像頭是否成功打開
if not cap.isOpened():print("無法打開攝像頭")exit()
------
if not cap.isOpened()::檢查攝像頭是否成功打開。如果 cap.isOpened() 返回 False,說明攝像頭未成功打開。
print("無法打開攝像頭"):若攝像頭未成功打開,打印提示信息。
exit():終止程序運行。
開始循環讀取攝像頭幀
try:while True:
------
try::開啟一個異常處理塊,用于捕獲可能出現的異常。
while True::創建一個無限循環,持續從攝像頭讀取幀。
讀取攝像頭幀# 讀取攝像頭幀ret, frame = cap.read()
------
ret, frame = cap.read():調用 cap.read() 方法從攝像頭讀取一幀圖像。ret 是一個布爾值,表示是否成功讀取到幀;frame 是讀取到的圖像幀。
檢查是否成功讀取幀if not ret:print("無法獲取幀,退出...")break
------
if not ret::如果 ret 為 False,說明未成功讀取到幀。
print("無法獲取幀,退出..."):打印提示信息。
break:跳出循環,結束程序。
1.4使用 PaddleOCR 進行識別
使用 PaddleOCR 進行識別result = ocr.ocr(frame, cls=True)
------
result = ocr.ocr(frame, cls=True):調用 ocr.ocr 方法對當前幀 frame 進行 OCR 識別,cls=True 表示啟用角度分類。識別結果存儲在 result 中。
提取識別到的文本text = ""for line in result:for word_info in line:text += word_info[1][0] + " "
------
text = "":初始化一個空字符串 text,用于存儲識別到的所有文本。
for line in result::遍歷識別結果 result 中的每一行。
for word_info in line::遍歷每一行中的每個單詞信息。
text += word_info[1][0] + " ":將每個單詞的文本內容添加到 text 中,并在后面添加一個空格。
1.5定義正則表達式模式
# 定義正則表達式模式# 快遞單號:通常是數字和字母的組合,長度可能在 10 到 20 位左右express_pattern = r'[A-Za-z0-9]{10,20}'# 手機號:以 1 開頭,后面跟 10 位數字phone_pattern = r'1\d{10}'# 姓名:簡單假設為 2 到 4 個漢字name_pattern = r'[\u4e00-\u9fa5]{2,4}'
------
express_pattern = r'[A-Za-z0-9]{10,20}':定義快遞單號的正則表達式模式,匹配由 10 到 20 位的字母(大小寫均可)和數字組成的字符串。
phone_pattern = r'1\d{10}':定義手機號的正則表達式模式,匹配以數字 1 開頭,后面跟 10 位數字的字符串。
name_pattern = r'[\u4e00-\u9fa5]{2,4}':定義姓名的正則表達式模式,匹配由 2 到 4 個中文字符組成的字符串。
查找匹配項# 查找匹配項express_numbers = re.findall(express_pattern, text)phone_numbers = re.findall(phone_pattern, text)names = re.findall(name_pattern, text)
------
express_numbers = re.findall(express_pattern, text):使用 re.findall 方法在 text 中查找所有匹配快遞單號模式的字符串,并將結果存儲在 express_numbers 列表中。
phone_numbers = re.findall(phone_pattern, text):同理,查找所有匹配手機號模式的字符串,存儲在 phone_numbers 列表中。
names = re.findall(name_pattern, text):查找所有匹配姓名模式的字符串,存儲在 names 列表中。
1.6打印提取結果
# 打印提取結果print("快遞單號:", express_numbers)print("手機號:", phone_numbers)print("姓名:", names)
------
分別打印提取到的快遞單號、手機號和姓名列表。
顯示幀# 顯示幀cv2.imshow('Camera Feed', frame)
cv2.imshow('Camera Feed', frame):使用 cv2.imshow 函數顯示當前幀,窗口標題為 Camera Feed。
按 'q' 鍵退出循環# 按 'q' 鍵退出循環if cv2.waitKey(1) & 0xFF == ord('q'):break
------
cv2.waitKey(1):等待 1 毫秒,檢測是否有按鍵事件。
cv2.waitKey(1) & 0xFF == ord('q'):檢查按下的鍵是否為 'q'。如果是,則跳出循環。
1.7異常處理
except Exception as e:print(f"發生錯誤: {e}")
------
except Exception as e::捕獲所有異常,并將異常對象賦值給 e。
print(f"發生錯誤: {e}"):打印錯誤信息。
釋放攝像頭并關閉窗口
finally:# 釋放攝像頭并關閉窗口cap.release()cv2.destroyAllWindows()
------
finally::無論是否發生異常,都會執行 finally 塊中的代碼。
cap.release():釋放攝像頭資源。
cv2.destroyAllWindows():關閉所有由 OpenCV 創建的窗口。
二、正則表達式
2.1簡介
正則表達式是一種用于匹配字符串模式的工具,在處理文本數據時非常有用。
2.2常用正則表達式模式及原理
2.2.1. 快遞單號模式
express_pattern = r'[A-Za-z0-9]{10,20}'
原理剖析:
[A-Za-z0-9]:這是一個字符類,它表示匹配方括號內任意一個字符。A-Z 代表所有大寫字母,a-z 代表所有小寫字母,0-9 代表所有數字。所以這個字符類可以匹配任意一個字母(大小寫均可)或者數字。
{10,20}:這是一個量詞,它規定了前面字符類(也就是 [A-Za-z0-9])出現的次數范圍。{10,20} 表示前面的字符類至少出現 10 次,最多出現 20 次。
綜合起來,[A-Za-z0-9]{10,20} 可以匹配由 10 到 20 位字母(大小寫均可)和數字組成的字符串,比較符合常見快遞單號的特征。
2.2.2. 手機號模式
phone_pattern = r'1\d{10}'
原理剖析:
1:這是一個普通字符,它直接匹配字符 1。在中國,手機號碼都是以數字 1 開頭的。
\d:這是一個元字符,它代表任意一個數字,等價于 [0-9]。
{10}:這是一個量詞,它規定了前面的 \d 必須出現 10 次。
綜合起來,1\d{10} 可以匹配以數字 1 開頭,后面跟著 10 位數字的字符串,符合中國手機號碼的格式。
2.2.3. 姓名模式
name_pattern = r'[\u4e00-\u9fa5]{2,4}'
原理剖析:
[\u4e00-\u9fa5]:這是一個字符類,\u4e00 到 \u9fa5 是 Unicode 編碼中漢字的范圍,所以這個字符類可以匹配任意一個中文字符。
{2,4}:這是一個量詞,它規定了前面的字符類(也就是 [\u4e00-\u9fa5])至少出現 2 次,最多出現 4 次。
綜合起來,[\u4e00-\u9fa5]{2,4} 可以匹配由 2 到 4 個中文字符組成的字符串,簡單模擬了常見姓名的長度。
2.3正則表達式的使用原理
在 Python 里,re 模塊提供了正則表達式的支持。常用的函數有 re.findall、re.search、re.match 等。在你的代碼中,使用了 re.findall 函數:
express_numbers = re.findall(express_pattern, text)
phone_numbers = re.findall(phone_pattern, text)
names = re.findall(name_pattern, text)
re.findall(pattern, string):該函數會在 string 中查找所有匹配 pattern 的子字符串,并將它們作為一個列表返回。例如,re.findall(express_pattern, text) 會在 text 中查找所有符合 express_pattern 模式的子字符串,然后把這些子字符串組成一個列表賦值給 express_numbers。
正則表達式的匹配過程通常是從字符串的開頭開始,依次嘗試匹配模式。如果匹配成功,就記錄下匹配的子字符串,然后繼續從匹配結束的位置往后匹配,直到字符串結束。
綜上所述,這段代碼實現了從攝像頭實時讀取幀,使用 PaddleOCR 進行文字識別,并通過正則表達式提取快遞單號、手機號和姓名的功能。用戶可以通過按 ‘q’ 鍵退出程序。