在許多項目中,Raspberry Pi被用作監控攝像頭或執行機器學習任務。在這些場景中,圖像中經常包含應用程序感興趣的文本信息。我們希望提取這些信息并將其轉換,以便通過程序分析文本。Raspberry Pi也能實現這種文本識別,而且并不困難。我們可以從靜態圖像或攝像頭的實時流中讀取文本。
在本教程中,我們將探討如何使用Raspberry Pi實現文本識別,以及為此需要哪些組件。
開始前的必要組件
該應用的主要部分是純軟件基礎的。因此,我們只需要少量的硬件來設置文本識別。我們將需要并使用以下組件:
強大的Raspberry Pi(例如 Model 4)
官方Raspberry Pi攝像頭,或者:USB 網絡攝像頭
電源連接:micro USB 線纜和 USB 適配器
可以使用屏幕、鍵盤和鼠標,但由于我們遠程操作Raspberry Pi,因此它們并非必需。因此,您應該已經相應地設置了Raspberry Pi,并啟用了 SSH,還建立了遠程桌面連接。之后,我們就可以直接開始了。使用 SSH 和 Putty 遠程訪問
什么是文本識別(OCR)以及它在Raspberry Pi上是如何工作的?
簡而言之,圖像上的文本識別(光學字符識別或簡稱 OCR)實際上是識別單個字母。如果它們足夠接近,就會形成一個單詞。
在之前的教程中,我們已經看到可以訓練一個模型來識別圖像上的物體。如果我們現在訓練所有(拉丁)字母——而不是物體——我們也可以通過模型再次識別它們。
理論上,這是可行的,但需要付出很多努力。必須先訓練不同的字體、顏色、格式等。但是,我們想節省為此所需的時間。
因此,我們使用來自 Google 的 Tesseract庫。它已包含此類模型,并且經過了許多開發人員的優化。
安裝 Tesseract OCR 庫
我們可以自己編譯 Tesseract,或者簡單地通過包管理器安裝它。后者可以通過以下命令輕松完成:
sudo apt install tesseract-ocr
我們可以使用tesseract -v 輕松檢查安裝是否成功。
現在,我們可以進行第一次小測試。為此,我們將使用這張圖片:
您可以通過以下方式下載它:
wget https://tutorials-raspberrypi.de/wp-content/uploads/coffee-ocr.jpg
然后,我們執行以下命令:
tesseract coffee-ocr.jpg stdout
輸出如下所示:
Warning: Invalid resolution 0 dpi. Using 70 instead.Estimating resolution as 554COFFEE
因此,在我們的輸入圖像中,文本“COFFEE”被識別出來了。
由于我們想在 Python 腳本中使用整個功能,因此我們需要一些庫,如 OpenCV和 Tesseract 的 Python 包裝器。OpenCV:https://opencv.org/我們通過 Python 包管理器安裝它們:
pip3 install opencv-python pillow pytesseract imutils numpy
在Raspberry Pi上通過 Python 腳本測試文本識別
到目前為止,我們僅在未處理的彩色圖像上嘗試識別單詞。預處理步驟通常可以改善結果。例如,通過將彩色圖像轉換為灰度圖像。另一方面,我們也可以嘗試檢測圖像中的邊緣,以更好地突出字母/單詞。
因此,讓我們首先通過 Python 腳本在Raspberry Pi上啟用文本識別。為此,我們創建一個文件夾和一個文件。
mkdir ocrcd ocrsudo nano example.py
我們插入以下內容:
import cv2import pytesseractimport numpy as npfrom pytesseract import Output img_source = cv2.imread('images/coffee.jpg') def get_grayscale(image): return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) def thresholding(image): return cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] def opening(image): kernel = np.ones((5, 5), np.uint8) return cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel) def canny(image): return cv2.Canny(image, 100, 200) gray = get_grayscale(img_source)thresh = thresholding(gray)opening = opening(gray)canny = canny(gray) for img in [img_source, gray, thresh, opening, canny]: d = pytesseract.image_to_data(img, output_type=Output.DICT) n_boxes = len(d['text']) # back to RGB if len(img.shape) == 2: img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB) for i in range(n_boxes): if int(d['conf'][i]) > 60: (text, x, y, w, h) = (d['text'][i], d['left'][i], d['top'][i], d['width'][i], d['height'][i]) # don't show empty text if text and text.strip() != "": img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) img = cv2.putText(img, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 255, 0), 3) cv2.imshow('img', img) cv2.waitKey(0)
讓我們看看一些有趣的行:
導入庫(第1-4行)
加載圖像(第5行),根據需要調整路徑!
預處理函數,用于轉換為灰度值(第9-23行)
第32行:在這里,我們提取任何數據(文本、坐標、分數等)
為了能夠在之后為框著色,如果必要,我們將灰度圖像轉換回具有顏色通道的圖像(第36-37行)
從第39行開始,將為分數高于60的框著色。
為此,我們在第41行提取文本、起始坐標和框的尺寸。
只有當檢測到(非空)文本時,我們才繪制框(第43-45行)。
然后,我們運行腳本并等待按下轉義鍵(第47/48行)。
我們現在運行腳本:
python3 example.py
然后,5張不同的圖像會依次出現(按 ESC 鍵顯示下一張圖像)。識別出的文本會在圖像上被標記出來。這樣,您可以確定哪個預處理步驟最適合您。
通過Raspberry Pi攝像頭識別實時圖像中的文本
到目前為止,我們僅使用靜態圖像作為文本識別的輸入。現在,我們還希望在連接的攝像頭的實時流中識別文本。這只需要對我們之前的腳本進行一些小的更改。我們創建一個新文件:
sudo nano ocr_camera.py
文件內容如下:
import cv2import pytesseractfrom pytesseract import Output cap = cv2.VideoCapture(0)cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) while True: # Capture frame-by-frame ret, frame = cap.read() d = pytesseract.image_to_data(frame, output_type=Output.DICT) n_boxes = len(d['text']) for i in range(n_boxes): if int(d['conf'][i]) > 60: (text, x, y, w, h) = (d['text'][i], d['left'][i], d['top'][i], d['width'][i], d['height'][i]) # don't show empty text if text and text.strip() != "": frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) frame = cv2.putText(frame, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), 3) # Display the resulting frame cv2.imshow('frame', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break # When everything done, release the capturecap.release()cv2.destroyAllWindows()
我們現在的改動如下:
在第5-6行,我們定義了相機,而不是固定的圖像。相機必須被連接并被識別。
在第10行,我們讀取了當前的幀。
這里我們省略了預處理步驟,但這些步驟也很容易被插入(在第11行)。
最后但同樣重要的是,我們也運行了腳本:
python3 ocr_camera.py
現在將相機對準文本,觀察文本上的單詞是如何被識別的:
在我的示例中,你可以清楚地看到轉換為灰度圖像是有意義的,因為單詞“Tutorials”太亮了。
其他語言的文本識別
Tesseract默認只安裝了英語作為識別語言。我們可以用以下命令檢查:
tesseract --list-langs
如果你想添加更多應該識別文本的語言,可以這樣做:
sudo apt-get install tesseract-ocr-[lang]
將[lang]替換為語言的縮寫(all表示安裝所有現有的語言)。
https://askubuntu.com/questions/793634/how-do-i-install-a-new-language-pack-for-tesseract-on-16-04/798492#798492然后你可以在Python腳本中選擇語言。添加參數:
d = pytesseract.image_to_data(img, lang='eng')
結論
Tesseract是一個強大的工具,它為圖像或幀提供了開箱即用的文本識別功能。這意味著我們不需要訓練和創建自己的機器學習模型。盡管計算量相對較大,但Raspberry Pi的文本識別效果非常好。通過各種處理步驟,可以進一步改進結果。
順便提一下,你可以在Github倉庫中找到這兩個腳本。
-
文本
+關注
關注
0文章
119瀏覽量
17256 -
Raspberry Pi
+關注
關注
2文章
613瀏覽量
22547 -
樹莓派
+關注
關注
118文章
1882瀏覽量
106257
發布評論請先 登錄
相關推薦
樹莓派DIY之打造mini版BOOMBOX

樹莓派做人臉識別
在Windows、OSX和樹莓派下編輯樹莓派config
樹莓派語音識別機器人(下)
樹莓派怎么打造開心農場
樹莓派3硬件配置_樹莓派3都能裝什么系統_樹莓派3系統安裝教程
CES 2019:谷歌欲把數字助手打造成大平臺
海南電網將致力把海南打造成國內首個智能電網示范省
樹莓派的學習設計方案合集

樹莓派5終極開發方案:VSCode Server避坑實戰指南

評論