在 OpenCV 中使用 OCR 從影象中提取文字

Salman Mehmood 2023年10月10日
在 OpenCV 中使用 OCR 從影象中提取文字

本文將介紹開始使用光學字元識別(也稱為 OCR)所需的一切。你將學習如何在 OpenCV 中從影象中提取文字並在影象上視覺化提取的文字。

使用帶有 EasyOCR 庫的 OCR 從 OpenCV 中的影象中提取文字

在本文中,我們需要做四件關鍵的事情:

  • 我們需要安裝和匯入我們的依賴項。
  • 然後,我們需要閱讀我們的影象或視訊。
  • 接下來,我們將繪製我們的結果。
  • 最後,我們將使用 OpenCV 來了解如何處理具有多行文字的影象並將它們視覺化。

光學字元識別,也稱為 OCR,可識別影象中的文字。它將嚴格的手寫或列印文字轉換為機器可讀的格式。

許多行業將 OCR 技術用於自動化銀行業務;可以使用 OCR 處理手寫支票。OCR 的另一個重要應用是從手寫文件中提取資訊。

我們將使用 EasyOCR 庫來使用由 PyTorch 庫提供支援的 OCR。該庫使在影象或文件上進行光學字元識別和執行光學字元識別變得更加容易。

讓我們開始安裝並匯入我們的依賴項。我們需要安裝的第一個依賴項是 PyTorch,因為 EasyOCR 在 PyTorch 上執行。

這取決於使用者正在執行什麼型別的作業系統以及是否使用 GPU。安裝可能略有不同,但好在如果使用者去 python.org,它會自動為使用者選擇最佳的安裝方法型別。

執行以下命令安裝 EasyOCR 包:

pip install easyocr

現在我們準備好使用依賴項了。

import easyocr
import cv2
import matplotlib.pyplot as plot
import numpy as np

現在我們需要閱讀我們的影象。我們將包含一個變數來儲存該影象路徑,接下來是使用 EasyOCR 來執行該光學字元識別。

我們定義了 easyocr.Reader() 類,並將我們想要使用的語言傳遞給它。如果我們不使用 GPU,我們將設定 gpu 引數等於 False

在下一行中,我們定義了 reader.readtext() 方法並傳遞了我們的影象路徑。

IMG_P = "sign.png"
reader = easyocr.Reader(["en"])
RST = reader.readtext(IMG_P)
RST

當我們執行這段程式碼時,它的結果會返回一些不同的東西。

opencv ocr 輸出 1

我們得到了一個陣列,其中文字在我們的影象中,當我們將其視覺化時,我們將能夠更好地看到這一點。第二部分是識別的文字,最後是置信度。

讓我們視覺化結果,為此,我們需要定義幾個關鍵變數來識別我們不同座標的位置。我們將獲取左上角和右下角的值來獲取和定義座標。

我們將從陣列中定義索引以獲取元件值並將它們轉換為元組,因為當將其傳遞給 OpenCV 時,它需要一個元組作為引數。

我們將做類似的事情來抓取右下角和文字,但我們不需要將文字轉換為元組。

T_LEFT = tuple(RST[0][0][0])
B_RIGHT = tuple(RST[0][0][2])
text = RST[0][1]
font = cv2.FONT_HERSHEY_SIMPLEX

現在我們使用 imread() 方法來讀取我們的影象,在下一行中,我們覆蓋了作為元件的矩形,然後我們覆蓋了文字以繪製我們的矩形。

rectangle() 方法將第一個引數作為影象。我們傳遞的下一個引數是 T_LEFT 座標,下一個是 B_RIGHT 座標。

傳遞的下一個引數是一個元組,然後是亮綠色。我們還通過了矩形厚度。

我們使用帶有多個引數的 putText() 方法來視覺化文字。第一個是影象座標,我們要設定提取文字的位置、字型樣式和字型大小,下一個是顏色、粗細和線條樣式。

import easyocr
import cv2
import matplotlib.pyplot as plot
import numpy as np

IMG_P = "surf.jpeg"
reader = easyocr.Reader(["en"])
RST = reader.readtext(IMG_P)
RST

T_LEFT = tuple(RST[0][0][0])
B_RIGHT = tuple(RST[0][0][2])
text = RST[0][1]
font = cv2.FONT_HERSHEY_SIMPLEX

IMG = cv2.imread("surf.jpeg")
IMG = cv2.rectangle(IMG, T_LEFT, B_RIGHT, (0, 255, 0), 3)
IMG = cv2.putText(IMG, text, T_LEFT, font, 0.5, (255, 255, 255), 2, cv2.LINE_AA)
plot.imshow(IMG)
plot.show()

我們可以看到在文字週圍繪製了一個框,並且 surf 出現在矩形內。

opencv ocr 輸出 2

讓我們看看如果我們有一個包含多行文字的影象如何處理。幾乎是一樣的;唯一改變的是當我們列印結果時,我們會看到幾個不同的行。

因此,我們需要迴圈以單獨視覺化和繪製每個檢測。

import easyocr
import cv2
import matplotlib.pyplot as plot
import numpy as np

IMG_P = "sign.png"

reader = easyocr.Reader(["en"])
RST = reader.readtext(IMG_P)
RST

font = cv2.FONT_HERSHEY_SIMPLEX

IMG = cv2.imread(IMG_P)
spacer = 100
for detection in RST:
    T_LEFT = tuple(detection[0][0])
    B_RIGHT = tuple(detection[0][2])
    TEXT = detection[1]
    IMG = cv2.rectangle(IMG, T_LEFT, B_RIGHT, (0, 255, 0), 3)
    IMG = cv2.putText(IMG, TEXT, (20, spacer), font, 0.5, (0, 255, 0), 2, cv2.LINE_AA)
    spacer += 15

plot.imshow(IMG)
plot.show()

輸出:

opencv ocr 輸出 3

作者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

相關文章 - Python OpenCV