ANPR(自動ナンバープレート認識)システムがどのように機能するのか疑問に思ったことはありませんか?その背後にある概念をお話ししましょう。ANPRシステムのカメラは車両のナンバープレートの画像をキャプチャし、画像を複数のアルゴリズムで処理して、画像をテキスト形式に英数字で変換します。ANPRシステムは、ガソリンポンプ、ショッピングモール、空港、高速道路、料金所、ホテル、病院、駐車場、防衛および軍事チェックポイントなどの多くの場所で使用されています。
このナンバープレート検出に使用できる画像処理ツールは多数ありますが、このチュートリアルでは、MATLAB画像処理を使用して、車両のナンバープレート番号をテキスト形式に変換します。MATLABまたは画像処理を初めて使用する場合は、以前のMATLABプロジェクトを確認してください。
- MATLAB入門:簡単な紹介
- MATLABを使用した画像処理入門
まず、ナンバープレートの検出に使用している概念について簡単に説明します。このプロジェクトには3つのプログラムまたは「.m」ファイルがあります。
- テンプレートの作成( template_creation.m )–これは、保存された英数字の画像を呼び出して、MATLABメモリに新しいテンプレートとして保存するために使用されます。
- Letter Detection( Letter_detection.m ) –入力画像から文字を読み取り、最も一致する対応する英数字を見つけます。
- プレート検出( Plate_detection.m ) –画像を処理してから、上記の2つのmファイルを呼び出して番号を検出します。
ここで、これらのmファイルのコーディング方法と、コーディングを開始する前に行う必要があることについて学習します。このチュートリアルを終えると、このプロジェクトの最後にすべてのコードファイルと実用的な説明ビデオがあります。
テンプレートの作成
まず、プロジェクト用のフォルダー(私のフォルダー名は ナンバープレート検出 )を作成して、ファイルを保存および保存します。すべてのアルファベットと数字のバイナリイメージを「 alpha」 という名前のサブフォルダに保存しました。
次の画像に示すように、MATLABでエディターウィンドウを開きます。
MATLABの基本的な用語に慣れていない場合は、リンクされたチュートリアルを確認することをお勧めします。
次に、以下のコードをコピーして template_creation.m ファイルに貼り付け、ファイルをプロジェクトフォルダー( ナンバープレート検出 )に保存します。画像テンプレートファイルを含むこのプロジェクトに関連するすべてのファイルは、ここからダウンロードできます。このプロジェクトの最後にあるビデオもチェックしてください。
%Alphabets A = imread( 'alpha / A.bmp'); B = imread( 'alpha / B.bmp'); C = imread( 'alpha / C.bmp'); D = imread( 'alpha / D.bmp'); E = imread( 'alpha / E.bmp'); F = imread( 'alpha / F.bmp'); G = imread( 'alpha / G.bmp'); H = imread( 'alpha / H.bmp'); I = imread( 'alpha / I.bmp'); J = imread( 'alpha / J.bmp'); K = imread( 'alpha / K.bmp'); L = imread( 'alpha / L.bmp'); M = imread( 'alpha / M.bmp'); N = imread( 'alpha / N.bmp'); O = imread( 'alpha / O.bmp'); P = imread( 'alpha / P.bmp'); Q = imread( 'alpha / Q.bmp'); R = imread( 'alpha / R.bmp'); S = imread( 'alpha / S.bmp'); T = imread( 'alpha / T.bmp'); U = imread( 'alpha / U.bmp'); V = imread( 'alpha / V.bmp'); W = imread( 'alpha / W.bmp'); X = imread( 'alpha / X.bmp '); Y = imread( 'alpha / Y.bmp'); Z = imread( 'alpha / Z.bmp'); %自然数 one = imread( 'alpha / 1.bmp'); two = imread( 'alpha / 2.bmp'); three = imread( 'alpha / 3.bmp'); four = imread( 'alpha / 4.bmp'); five = imread( 'alpha / 5.bmp'); six = imread( 'alpha / 6.bmp'); セブン= imread( 'alpha / 7.bmp');エイト= imread( 'alpha / 8.bmp'); nine = imread( 'alpha / 9.bmp'); zero = imread( 'alpha / 0.bmp'); %アルファベットの配列の作成 letter =; %数値の配列の作成 number =; NewTemplates =; 保存( 'NewTemplates'、 'NewTemplates') すべてクリア
ここで、上記のコードでは、コマンド' imread() 'を使用して画像を変数に保存しています。この関数は、フォルダーまたはPCの任意の場所からMATLABに画像を呼び出すために使用されます。上記のコードの例を見てみましょう。
A = imread( 'alpha / A.bmp');
ここで、Aは変数であり、「 alpha / A.bmp」 では、 「alpha」 はフォルダー名、「 A.bmp」 はファイル名です。
次に、「 文字 」と「 数値 」の行列を作成し、コマンド「 save(filename、variables)」 を使用して変数「 NewTemplates 」に 保存します 。
%アルファベットの配列の作成 letter =; %数値の配列の作成 number =; NewTemplates =; 保存( 'NewTemplates'、 'NewTemplates') すべてクリア
次に、新しいエディターウィンドウで Letter_detection.mの コーディングを開始します。
文字検出
ここでは、 Letter_detection.m という名前の2番目のコードファイルを作成しています。次に、以下のコードをコピーしてそのファイルに貼り付け、 Letter_detection という名前でプロジェクトフォルダーにファイルを保存します 。 このファイルはここからダウンロードできます。この添付のzipファイルには、このナンバープレート検出プロジェクトに関連する他のファイルも含まれています。
function letter = readLetter(snap) load NewTemplates snap = imresize(snap、); rec =; n = 1の場合:length(NewTemplates) cor = corr2(NewTemplates {1、n}、snap); rec =; 終了 ind = find(rec == max(rec)); display(find(rec == max(rec))); %アルファベットリスト。 if ind == 1 --ind == 2 letter = 'A'; elseif ind == 3--ind == 4 letter = 'B'; elseif ind == 5 letter = 'C' elseif ind == 6 --ind == 7 letter = 'D'; elseif ind == 8 letter = 'E'; elseif ind == 9 letter = 'F'; elseif ind == 10 letter = 'G'; elseif ind == 11 文字= 'H'; elseif ind == 12 letter = 'I'; elseif ind == 13 letter = 'J'; elseif ind == 14 letter = 'K'; elseif ind == 15 letter = 'L'; elseif ind == 16 letter = 'M'; elseif ind == 17 letter = 'N'; elseif ind == 18 --ind == 19 letter = 'O'; elseif ind == 20-ind == 21 letter = 'P'; elseif ind == 22 --ind == 23 letter = 'Q'; elseif ind == 24--ind == 25 letter = 'R'; elseif ind == 26 letter = 'S'; elseif ind == 27 letter = 'T'; elseif ind == 28 letter = 'U'; elseif ind == 29 letter = 'V'; elseif ind == 30 letter = 'W'; elseif ind == 31 letter = 'X'; elseif ind == 32 letter = 'Y'; elseif ind == 33 letter = 'Z'; %* - * - * - * - * %の数字のリスト。 elseif ind == 34 letter = '1'; elseif ind == 35 文字= '2'; elseif ind == 36 文字= '3'; elseif ind == 37-ind == 38 letter = '4'; elseif ind == 39 letter = '5'; elseif ind == 40 --ind == 41 --ind == 42 letter = '6'; elseif ind == 43 letter = '7'; elseif ind == 44--ind == 45 文字= '8'; elseif ind == 46-ind == 47-ind == 48 letter = '9'; else letter = '0'; エンド エンド
ここで、上記のコードでは、コマンド ' readLetter()' を使用して、クラス ' alpha 'からの入力画像の英数字出力を提供する letter という名前の関数を作成しました。次に、コマンド load'NewTemplates を使用して、保存されたテンプレートを ロードします 。
その後、コマンド 'imresize(filename、size)' を使用してテンプレートの画像と比較できるように、入力画像のサイズを変更しました。次に 、for ループを使用して、入力画像をテンプレート内のすべての画像と相関させ、最適な一致を取得します。
次のコードに示すように、入力画像の文字テンプレートと各英数字テンプレートの相関値を記録するために、行列「 rec 」が作成されます。
cor = corr2(NewTemplates {1、n}、snap);
次に、 「find()」 コマンドを使用して、最も一致する文字に対応するインデックスを検索します。次に、そのインデックスに従って、対応する文字が 「if-else」 ステートメントを使用して出力されます。
これが完了したら、新しいエディタウィンドウを開いて、メインプログラムのコードを開始します。
ナンバープレート検出
これが Plate_detection.m という名前の3番目で最後のコードファイルです。 以下のコードをコピーしてこのファイルに貼り付け、プロジェクトフォルダーに保存します。クイックスタートのために、ここから画像テンプレートを含むすべてのコードファイルをダウンロードできます。
すべて閉じる; すべてクリア; im = imread( 'ナンバープレート画像/image1.png'); imgray = rgb2gray(im); imbin = imbinarize(imgray); im = edge(imgray、 'prewitt'); %以下の手順は、ナンバープレートの場所を見つけることです Iprops = regionprops(im、 'BoundingBox'、 'Area'、 'Image'); area = Iprops.Area; count = numel(Iprops); maxa =面積; boundingBox = Iprops.BoundingBox; i = 1の 場合:maxaの場合は
カウント
上記のコードで使用される基本的なコマンドを以下に示します。
imread() –このコマンドは、ターゲットフォルダーからMATLABに画像を開くために使用されます。
rgb2gray() –このコマンドは、RGB画像をグレースケール形式に変換するために使用されます。
imbinarize() –このコマンドは、2Dグレースケール画像を二値化するために使用されます。または、単に画像を白黒形式に変換すると言うこともできます。
edge() –このコマンドは、Roberts、Sobel、Prewittなどのさまざまなメソッドを使用して、画像のエッジを検出するために使用されます。
regionprops() –このコマンドは、画像領域のプロパティを測定するために使用されます。
numel() –このコマンドは、配列要素の数を計算するために使用されます。
imcrop() –このコマンドは、入力されたサイズで画像をトリミングするために使用されます。
bwareaopen() –このコマンドは、バイナリイメージから小さなオブジェクトを削除するために使用されます。
コードで上記のコマンドを使用することにより、入力画像を呼び出してグレースケールに変換しています。次に、グレースケールがバイナリイメージに変換され、バイナリイメージのエッジがPrewittメソッドによって検出されます。
次に、以下のコードを使用して、入力画像全体のナンバープレートの位置を検出します。
Iprops = regionprops(im、 'BoundingBox'、 'Area'、 'Image'); area = Iprops.Area; count = numel(Iprops); maxa =面積; boundingBox = Iprops.BoundingBox; i = 1の 場合:maxaの場合は
カウント
その後、ナンバープレートをトリミングし、コマンド 「imcrop()」 と 「bwareaopen()」を それぞれ使用して、バイナリイメージから小さなオブジェクトを削除します。
次に、以下のコードを使用して、トリミングされたナンバープレート画像を処理し、検出された番号を画像とテキスト形式で(コマンドウィンドウに)表示します。
Iprops = regionprops(im、 'BoundingBox'、 'Area'、 'Image'); count = numel(Iprops); noPlate =; for i = 1:count ow = length(Iprops(i).Image(1、:)); oh = length(Iprops(i).Image(:、1)); if ow <(h / 2)&oh>(h / 3) letter = Letter_detection(Iprops(i).Image); noPlate = 終了 終了
MATLABを使用した車両ナンバープレート番号検出システムの動作
で template_creation.mの ファイル私たちは「と名付けられたディレクトリやファイルに英数字のすべてのバイナリ画像を保存するためのコード設計してい NewTemplatesを 」。次に、以下に示すように、そのディレクトリが Letter_detection.mで呼び出さ れます。
次に、 Plate_detection.m コードファイルで、 下 の画像に示すように画像を処理するときに、 Letter_detection.m コードファイルが呼び出されます。
次に、[実行]ボタンをクリックして.mファイルを実行します
MATLABは、応答するのに数秒かかる場合があります。以下に示すように、左下隅にビジーメッセージが表示されるまで待ちます。
プログラムが起動すると、コマンドウィンドウにナンバープレートの画像ポップアップと番号が表示されます。私の画像の出力は、以下の画像のようになります。
車両ナンバープレート検出システムの完全な動作は、以下のビデオで示されています。画像テンプレートを含むすべてのコードファイルは、ここからダウンロードできます。
また、ここですべてのMATLABプロジェクトを確認してください。