Python を使用してナンバー プレートを簡単に検出および認識する (コードを使用)

ナンバープレートの検出および認識技術は広く使用されており、道路システム、チケットレス駐車場、車両アクセス制御などで使用できます。このテクノロジーは、コンピューター ビジョンと人工知能を組み合わせたものです。

この記事では、Python を使用してナンバー プレートの検出および認識プログラムを作成します。プログラムは入力画像を処理し、ナンバー プレートを検出して認識し、最終的にナンバー プレートの文字を出力として表示します。

技術のアップグレード

テクノロジーは共有とコミュニケーションを学ぶ必要があり、密室で作業することはお勧めできません。一人は速く、大勢は遠くまで行ける。

良い記事は、ファンの共有と推奨、乾いたデータ、データ共有、データ、技術交流の改善と切り離せません。これらはすべて、コミュニケーション グループを追加することで取得できます。グループには 2,000 人以上の友人がいて、メモを追加する最良の方法です。つまり、ソース + 興味の方向性であり、志を同じくする友人を簡単に見つけることができます。

方法①、WeChat ID追加:pythoner666、備考:CSDNから
方法②、WeChat検索公式アカウント:Python学習とデータマイニング、バックグラウンド返信:グループ追加

Python 環境を作成する

このチュートリアルを簡単に実行するには、Python の基本に精通している必要があります。プログラム環境を最初に作成する必要があります。

プログラミングを開始する前に、いくつかのライブラリを環境にインストールする必要があります。任意の Python IDE を開き、Python ファイルを作成します。ターミナルでコマンドを実行して、適切なライブラリをインストールします。コンピューターに Python PIP が事前にインストールされている必要があります。

  • OpenCV-Python:このライブラリを使用して、入力画像を前処理し、個々の出力画像を表示します。

pip install OpenCV-Python

  • imutils:このライブラリを使用して、元の入力画像を目的の幅にトリミングします。
pip install imutils
  • pytesseract:このライブラリを使用して、ナンバー プレートの文字を抽出し、文字列に変換します。
pip install pytesseract

pytesseract ライブラリは、文字認識のために Tesseract OCR エンジンに依存しています。

あなたのコンピュータではどうですか

Tesseract OCR をインストールしますか?

Tesseract OCR は言語文字を認識できるエンジンです。pytesseract ライブラリを使用する前に、コンピュータにインストールする必要があります。次のように進めます。

1. Chrome ベースのブラウザーを開きます。

2. Tesseract OCR インストーラーをダウンロードします。

3. インストーラーを実行し、他のプログラムと同様にインストールします。

環境を整えてtesseract OCRをインストールしたら、プログラムを書くことができます。

ライブラリのインポート

まず、環境にインストールされているライブラリをインポートします。インポート ライブラリを使用すると、プロジェクトでそれらの関数を呼び出して使用できます。

  • インポートcv2

  • imutilsをインポート

  • インポートpytesseract

OpenCV-Python ライブラリを cv2 としてインポートする必要があります。インストールしたときと同じ名前の他のライブラリをインポートします。

入力を得る

次に、Tesseract エンジンがインストールされている場所を pytesseract で指定します。cv2.imread 関数を使用して、車の画像を入力として受け取ります。イメージ名を、使用しているイメージの名前に置き換えます。簡単に操作できるように、プロジェクトと同じフォルダーに画像を保存します。

pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'  
original_image = cv2.imread('image3.jpeg')  

左右にスワイプして完全なコードを表示します

以下の入力画像を、使用したい画像に置き換えることができます。

入力の前処理

画像の幅を 500 ピクセルにサイズ変更してから、画像をグレースケール画像に変換します。キャニー エッジ検出機能はグレースケール画像でしか機能しないためです。最後に、関数 bilateralFilter を呼び出してイメージ ノイズを減らします。

original_image = imutils.resize(original_image, width=500 )  
gray_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY)  
gray_image = cv2.bilateralFilter(gray_image, 11, 17, 17)

入力時にナンバー プレートを検出する

ナンバー プレートの検出は、車のどの部分にナンバー プレートの文字があるかを判断するプロセスです。

(1) エッジ検出を行う

まず、前処理された画像のエッジを自動的に検出できる cv2.Canny 関数を呼び出します。

edged_image = cv2.Canny(gray_image, 30,200)

これらのエッジを通る輪郭を見つけます。

(2) 輪郭を見つける

cv2.findContours 関数を呼び出して、エッジ イメージのコピーを渡します。この関数は輪郭を検出します。cv2.drawContours 関数を使用して、検出された輪郭を元の画像に描画します。最後に、すべての目に見える輪郭が描画された元の画像を出力します。

contours, new = cv2.findContours(edged_image.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)  
img1 = original_image.copy()  
cv2.drawContours(img1, contours, -1, (0, 255, 0), 3)  
cv2.imshow("img1", img1)  

左右にスワイプして完全なコードを表示します

プログラムは、車の画像で見つけたすべての輪郭を描画します。

輪郭を見つけたら、それらをふるいにかけ、最適な輪郭候補を特定する必要があります。

(3) フィルタープロファイル

輪郭は、最小面積 30 に基づいてフィルタリングされます。この領域より小さい輪郭は、ナンバー プレートの輪郭である可能性が低いため無視されます。元の画像を複製し、画像に最初の 30 個の輪郭を描きます。最後に画像を表示します。

contours = sorted(contours, key = cv2.contourArea, reverse = True)[:30]  
# stores the license plate contour  
screenCnt = None  
img2 = original_image.copy()  
  
# draws top 30 contours  
cv2.drawContours(img2, contours, -1, (0, 255, 0), 3)  
cv2.imshow("img2", img2)

左右にスワイプして完全なコードを表示します

最初より輪郭が少なくなりました。描かれている等高線は、ナンバー プレートをほぼ含むものだけです。

最後に、フィルタリングされた等高線を繰り返し処理して、どれがナンバー プレートであるかを判断する必要があります。

(4) 最初の 30 等高線をトラバースする

等高線を反復処理する for ループを作成します。四隅のある輪郭を見つけ、その周囲と座標を決定します。ナンバー プレートの輪郭を含む画像が保存されます。最後に、元の画像にナンバー プレートの輪郭を描画して表示します。

count = 0  
idx = 7  
  
**for** c **in** contours:  
    # approximate the license plate contour  
    contour_perimeter = cv2.arcLength(c, True)  
    approx = cv2.approxPolyDP(c, 0.018 * contour_perimeter, True)  
  
    # Look for contours with 4 corners  
    **if** len(approx) == 4:  
        screenCnt = approx  
  
        # find the coordinates of the license plate contour  
        x, y, w, h = cv2.boundingRect(c)  
        new_img = original_image [ y: y + h, x: x + w]  
  
        # stores the new image  
        cv2.imwrite('./'+str(idx)+'.png',new_img)  
        idx += 1  
        break  
  
# draws the license plate contour on original image  
cv2.drawContours(original_image , [screenCnt], -1, (0, 255, 0), 3)  
cv2.imshow("detected license plate", original_image )

ループの後、プログラムはナンバー プレートを含む輪郭を識別しました。

検出されたナンバー プレートを認識する

ナンバー プレートの認識とは、ナンバー プレートのトリミングされた画像の文字を読み取ることを意味します。以前に保存したナンバー プレートの画像を読み込んで表示します。次に、pytesseract.image_to_string 関数を呼び出して、切り取ったナンバー プレートの画像を渡します。この関数は、画像内の文字を文字列に変換します。

# filename of the cropped license plate image  
cropped_License_Plate = './7.png'  
cv2.imshow("cropped license plate", cv2.imread(cropped_License_Plate))  
  
# converts the license plate characters to string  
text = pytesseract.image_to_string(cropped_License_Plate, lang='eng')

左右にスワイプして完全なコードを表示します

切り取ったナンバー プレートを以下に示します。上記の文字は、後で画面に出力するものです。

ナンバー プレートが検出および認識されたら、出力を表示できます。

表示出力

これが最後のステップです。抽出したテキストを画面に出力します。テキストにナンバー プレートの文字が含まれています。

print("License plate is:", text)  
cv2.waitKey(0)  
cv2.destroyAllWindows()

プログラムの期待される出力は次のようになります。

ナンバー プレートのテキストは端末で見ることができます。

Python のスキルを磨く

Python を使用したナンバー プレートの検出と認識は、興味深いプロジェクトです。難しいので、Python についてさらに学ぶのに役立つはずです。

プログラミングに関して言えば、実用的なアプリケーションは言語を習得するための鍵です。スキルを開発するには、興味深いプロジェクトを開発する必要があります。

おすすめ

転載: blog.csdn.net/weixin_38037405/article/details/128960826