ANPR (Automatic Number Plate Recognition) 시스템이 어떻게 작동하는지 궁금한 적이 있습니까? 그이면의 개념을 말씀 드리겠습니다. ANPR 시스템의 카메라는 차량 번호판의 이미지를 캡처 한 다음 여러 알고리즘을 통해 이미지를 처리하여 이미지의 영숫자 변환을 텍스트 형식으로 제공합니다. ANPR 시스템은 가솔린 펌프, 쇼핑몰, 공항, 고속도로, 요금소, 호텔, 병원, 주차장, 국방 및 군사 검문소 등과 같은 많은 장소에서 사용됩니다.
이 번호판 감지에 사용할 수있는 많은 이미지 처리 도구가 있지만이 튜토리얼에서는 MATLAB Image Processing을 사용 하여 차량 번호판 번호 를 텍스트 형식으로 가져옵니다. MATLAB 또는 이미지 처리를 처음 사용하는 경우 이전 MATLAB 프로젝트를 확인하십시오.
- MATLAB 시작하기: 빠른 소개
- MATLAB을 사용하여 이미지 처리 시작하기
먼저 번호판 감지에 사용하는 개념에 대해 간략히 설명하겠습니다. 이 프로젝트에는 세 개의 프로그램 또는 '.m'파일이 있습니다.
- 템플릿 생성 ( template_creation.m ) – 저장된 영숫자 이미지를 호출 한 다음 MATLAB 메모리에 새 템플릿으로 저장하는 데 사용됩니다.
- 문자 감지 ( Letter_detection.m ) – 입력 이미지에서 문자를 읽고 가장 일치하는 해당 영숫자를 찾습니다.
- Plate Detection ( Plate_detection.m ) – 이미지를 처리 한 다음 위의 두 m 파일을 호출하여 번호를 감지합니다.
이제 이러한 m- 파일을 코딩하는 방법과 코딩을 시작하기 전에 수행해야하는 작업에 대해 알아 봅니다. 이 튜토리얼을 마치면 이 프로젝트의 끝에서 모든 코드 파일과 작업 설명 비디오를 찾을 수 있습니다 .
템플릿 생성
먼저 프로젝트 폴더 (내 폴더 이름은 Number Plate Detection )를 만들어 파일을 저장하고 저장합니다. 모든 알파벳과 숫자의 이진 이미지를 ' alpha' 라는 하위 폴더에 저장했습니다.
이제 아래 이미지와 같이 MATLAB에서 편집기 창을 엽니 다.
MATLAB의 기본 용어에 익숙하지 않은 경우 링크 된 튜토리얼을 확인하는 것이 좋습니다.
이제 template_creation.m 파일에 아래 코드를 복사하여 붙여넣고 프로젝트 폴더 ( Number Plate Detection )에 파일을 저장합니다. 이미지 템플릿 파일을 포함하여이 프로젝트와 관련된 모든 파일은 여기에서 다운로드 할 수 있습니다. 이 프로젝트의 마지막에 주어진 비디오 도 확인하십시오.
% 알파벳 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 ('알파 /6.bmp'); seven = imread ('alpha / 7.bmp'); eight = imread ('alpha / 8.bmp'); nine = imread ('alpha / 9.bmp'); zero = imread ('알파 /0.bmp'); % 알파벳 배열 만들기 letter =; % 숫자 배열 만들기 number =; NewTemplates =; save ('NewTemplates', 'NewTemplates') 모두 지우기
여기에서 위의 코드에서는 ' imread () ' 명령을 사용하여 이미지를 변수에 저장합니다. 이 함수는 폴더 또는 PC의 임의 위치에서 MATLAB으로 이미지를 호출하는 데 사용됩니다. 위의 코드에서 예를 들어 보겠습니다.
A = imread ('alpha / A.bmp');
A는 변수이고 ' alpha / A.bmp' 에서 'alpha' 는 폴더 이름이고 ' A.bmp' 는 파일 이름입니다.
그런 다음 ' 문자 '와 ' 숫자 ' 의 행렬을 만들고 ' save (filename, variables)' 명령을 사용하여 ' NewTemplates ' 변수에 저장합니다.
% 알파벳 배열 만들기 letter =; % 숫자 배열 만들기 number =; NewTemplates =; save ('NewTemplates', 'NewTemplates') 모두 지우기
이제 새 편집기 창에서 Letter_detection.m 코딩을 시작 합니다.
문자 감지
여기서는 Letter_detection.m 이라는 두 번째 코드 파일을 만듭니다 . 이제 해당 파일에 아래 코드를 복사하여 붙여넣고 이름이 Letter_detection 인 프로젝트 폴더에 파일을 저장합니다 . 이 파일은 여기에서 다운로드 할 수 있으며 첨부 된이 zip 파일에는이 번호판 감지 프로젝트와 관련된 다른 파일도 포함되어 있습니다.
function letter = readLetter (snap) load NewTemplates snap = imresize (snap,); rec =; for n = 1: length (NewTemplates) cor = corr2 (NewTemplates {1, n}, snap); rec =; end ind = find (rec == max (rec)); display (find (rec == max (rec))); % 알파벳 목록. 만약 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 문자 = 'G'; elseif ind == 11 글자 = 'H'; elseif ind == 12 letter = '나'; elseif ind == 13 letter = 'J'; elseif ind == 14 letter = 'K'; elseif ind == 15 letter = 'L'; elseif ind == 16 letter = 'M'; elseif ind == 17 문자 = '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 문자 = 'W'; elseif ind == 31 문자 = 'X'; elseif ind == 32 letter = 'Y'; elseif ind == 33 letter = 'Z'; % * - * - * - * - * %의 숫자의 명부. elseif ind == 34 letter = '1'; elseif ind == 35 letter = '2'; elseif ind == 36 letter = '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 letter = '8'; elseif ind == 46-ind == 47-ind == 48 letter = '9'; 그렇지 않으면 편지 = '0'; 끝 끝
여기, 위의 코드 에서 ' readLetter ()' 명령을 사용하여 ' alpha ' 클래스의 입력 이미지의 영숫자 출력을 제공하는 letter 라는 함수를 만들었습니다. 그런 다음 load 'NewTemplates' 명령을 사용하여 저장된 템플릿을로드합니다.
그 후 'imresize (filename, size)' 명령을 사용하여 템플릿의 이미지와 비교할 수 있도록 입력 이미지의 크기를 조정했습니다. 그런 다음 for 루프를 사용하여 입력 이미지를 템플릿의 모든 이미지와 연관시켜 최상의 일치를 얻습니다.
아래 코드와 같이 입력 이미지의 문자 템플릿과 각 영숫자 템플릿에 대한 상관 값을 기록하기 위해 행렬 ' rec '가 생성됩니다.
cor = corr2 (NewTemplates {1, n}, snap);
그런 다음 'find ()' 명령을 사용하여 가장 일치하는 문자에 해당하는 인덱스를 찾습니다. 그런 다음 해당 색인에 따라 'if-else' 문을 사용하여 해당 문자를 인쇄 합니다.
이제이 작업을 완료 한 후 새 편집기 창을 열어 주 프로그램의 코드를 시작합니다.
번호판 감지
다음은 Plate_detection.m 이라는 세 번째 코드 파일입니다. 아래 코드를 복사하여이 파일에 붙여넣고 프로젝트 폴더에 저장합니다. 빠른 시작을 위해 여기에서 이미지 템플릿이있는 모든 코드 파일을 다운로드 할 수 있습니다.
모두 닫으십시오. 모두 지우기; im = imread ('번호판 이미지 / image1.png'); imgray = rgb2gray (im); imbin = imbinarize (imgray); im = edge (imgray, 'prewitt'); % 아래 단계는 번호판의 위치를 찾는 것입니다. Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); 면적 = Iprops.Area; 개수 = numel (Iprops); maxa = 면적; boundingBox = Iprops.BoundingBox; for i = 1: count if maxa
위 코드에서 사용되는 기본 명령은 다음과 같습니다.
imread () –이 명령은 대상 폴더에서 MATLAB으로 이미지를 여는 데 사용됩니다.
rgb2gray () –이 명령은 RGB 이미지를 회색조 형식으로 변환하는 데 사용됩니다.
imbinarize () –이 명령은 2 차원 회색조 이미지를 이진화 하는 데 사용되거나 단순히 이미지를 흑백 형식으로 변환한다고 말할 수 있습니다.
edge () –이 명령은 Roberts, Sobel, Prewitt 등과 같은 다양한 방법을 사용하여 이미지의 가장자리를 감지하는 데 사용됩니다.
regionprops () –이 명령은 이미지 영역의 속성을 측정하는 데 사용됩니다.
numel () –이 명령은 배열 요소의 수를 계산하는 데 사용됩니다.
imcrop () –이 명령은 입력 한 크기로 이미지를 자르는 데 사용됩니다.
bwareaopen () –이 명령은 이진 이미지에서 작은 개체를 제거하는 데 사용됩니다.
코드에서 위의 명령을 사용하여 입력 이미지를 호출하고이를 회색조로 변환합니다. 그런 다음 회색조가 이진 이미지로 변환되고 이진 이미지의 가장자리가 Prewitt 방법으로 감지됩니다 .
그런 다음 아래 코드를 사용 하여 전체 입력 이미지에서 번호판의 위치 를 감지합니다.
Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); 면적 = Iprops.Area; 개수 = numel (Iprops); maxa = 면적; boundingBox = Iprops.BoundingBox; for i = 1: count if maxa
그런 다음 'imcrop ()' 및 'bwareaopen ()'명령을 각각 사용하여 번호판 을 자르고 이진 이미지에서 작은 개체를 제거합니다.
그런 다음 아래 코드를 사용하여 자른 번호판 이미지 를 처리하고 감지 된 번호를 이미지 및 텍스트 형식 (명령 창에서)으로 표시합니다.
Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); 개수 = numel (Iprops); noPlate =; for i = 1: count ow = length (Iprops (i).Image (1,:)); 오 = 길이 (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 코드 파일이 호출됩니다.
이제 'RUN'버튼을 클릭하여.m 파일을 실행하십시오.
MATLAB이 응답하는 데 몇 초가 걸릴 수 있습니다. 아래와 같이 왼쪽 하단에 사용 중 메시지가 표시 될 때까지 기다립니다.
프로그램이 시작되면 번호판 이미지 팝업과 명령 창에 번호가 표시됩니다. 내 이미지의 출력은 아래 주어진 이미지와 같습니다.
차량 번호판 감지 시스템의 완전한 작동은 아래 비디오에 나와 있으며 이미지 템플릿이있는 모든 코드 파일은 여기에서 다운로드 할 수 있습니다.
또한 여기에서 모든 MATLAB 프로젝트를 확인하십시오.