Python を使用して車のナンバー プレートを検出および認識する方法

Python を使用して車のナンバー プレートを検出および認識する方法

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

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 をインストールしたら、プログラムをコーディングする準備が整いました。

1. ライブラリのインポート

環境にインストールしたライブラリをインポートすることから始めます。ライブラリをインポートすると、プロジェクトでそれらの関数を呼び出して使用できるようになります。

import cv2
import imutils
import pytesseract

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

2. インプットを取る

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

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

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

ナンバー プレートの付いた青い車

3. 入力の前処理

画像の幅を 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)

4. 入力でのナンバー プレートの検出

ナンバー プレートの検出は、ナンバー プレートの文字がある車の部品を特定するプロセスです。

エッジ検出の実行

前処理された画像のエッジを自動的に検出するcv2.Canny関数を呼び出すことから始めます。

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

輪郭を見つけるのはこれらのエッジからです。

輪郭を見つける

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)

プログラムは、車の画像で検出したすべての輪郭を明確に描画します。

目に見えるすべての輪郭が緑色でマークされた車

等高線を見つけたら、それらを並べ替えて最適な候補を特定する必要があります。

輪郭の並べ替え

最小面積 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)

最初より輪郭が少なくなりました。描かれた唯一の等高線は、ナンバー プレートを含むように近似されたものです。

最初の 30 個の目に見える輪郭が描かれた車

最後に、並べ替えられた等高線をループして、どれがナンバー プレートであるかを判断する必要があります。

上位 30 の等高線をループする

輪郭をループする for ループを作成します。4 つの角を持つ輪郭を探し、その周囲と座標を決定します。ナンバー プレートを含む輪郭の画像を保存します。最後に、元のイメージにナンバー プレートの輪郭を描画して表示します。

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)

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

検出されたナンバー プレートを示す車

5. 検出されたナンバー プレートの認識

ナンバープレートを認識するということは、ナンバープレートの切り抜き画像の文字を読み取ることを意味します。以前に保存したナンバー プレートの画像を読み込み、表示します。次に、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')

トリミングされたナンバー プレートを以下に示します。その上の文字は、後で画面に印刷する出力になります。

トリミングされたナンバー プレートの画像

ナンバー プレートを検出して認識したら、出力を表示する準備が整いました。

6. 出力の表示

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

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

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

ナンバー プレートを検出するプロセスを示す 3 つの車の写真と 1 つのトリミングされたナンバー プレート

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

Python スキルを磨く

Python での車のナンバー プレートの検出と認識は、興味深いプロジェクトです。やりがいがあるので、Python についてもっと学ぶのに役立つはずです。

プログラミングに関して言えば、練習は言語を習得するための中核です。スキルを練習するには、興味深いプロジェクトに取り組む必要があります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です