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
このコードを実行すると、その結果はいくつかの異なるもので返されます。
画像内のテキストを含む配列を取得しました。これを視覚化すると、これをよりよく見ることができます。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
が表示されます。
複数行のテキストがある画像がある場合の処理方法を見てみましょう。それはほとんど同じです。変更されるのは、結果を印刷するときに、いくつかの異なる行が表示されることだけです。
したがって、ループして各検出を個別に視覚化してプロットする必要があります。
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()
出力:
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