OpenCV で画像からテキストを抽出するために OCR を使用する

Salman Mehmood 2023年10月10日
OpenCV で画像からテキストを抽出するために OCR を使用する

この記事では、OCR とも呼ばれる光学文字認識を開始するために必要なすべてをカバーします。OpenCV で、画像からテキストを抽出し、抽出されたテキストを画像上で視覚化する方法を学習します。

EasyOCR ライブラリで OCR を使用して、OpenCV の画像からテキストを抽出する

この記事では、私たちがしなければならない 4つの重要なことがあります。

  • 依存関係をインストールしてインポートする必要があります。
  • 次に、画像またはビデオを読む必要があります。
  • 次に、結果を描画します。
  • 最後に、OpenCV を使用して、複数行のテキストを含む画像を処理し、それらを視覚化する方法を確認します。

OCR とも呼ばれる光学文字認識は、画像内のテキストを認識します。タイトな手書きまたは印刷されたテキストを機械で読み取り可能な形式に変換します。

多くの業界では、自動化バンキングに OCR テクノロジーを使用しています。OCR を使用して手書きのチェックを処理できます。OCR のもう 1つの重要なアプリケーションは、手書きのドキュメントから情報を抽出することです。

EasyOCR ライブラリを使用して、PyTorch ライブラリを利用した OCR を使用します。このライブラリを使用すると、画像やドキュメントの光学文字認識を簡単に実行できます。

インストールを開始して、依存関係をインポートしましょう。EasyOCR は PyTorch で実行されるため、インストールする必要がある最初の依存関係は 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

画像内のテキストを含む配列を取得しました。これを視覚化すると、これをよりよく見ることができます。2 番目の部分は識別されたテキストであり、最後の部分は信頼度です。

結果を視覚化してみましょう。これを行うには、さまざまな座標がどこにあるかを識別するために、いくつかの重要な変数を定義する必要があります。座標を取得して定義するために、左上隅と右下隅の値を取得します。

配列からインデックスを定義してコンポーネント値を取得し、それらをタプルに変換します。これは、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() メソッドを使用してテキストを視覚化しました。1つ目は、抽出したテキストの位置、フォントスタイル、フォントサイズを設定する画像座標で、次は色、太さ、線のスタイルで構成されます。

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