Bạn đã bao giờ tự hỏi rằng hệ thống ANPR (Nhận dạng Biển số Tự động) hoạt động như thế nào? Hãy để tôi cho bạn biết khái niệm đằng sau nó, camera của hệ thống ANPR chụp ảnh biển số xe và sau đó hình ảnh được xử lý thông qua nhiều thuật toán để cung cấp chuyển đổi chữ số của hình ảnh thành định dạng văn bản. Hệ thống ANPR được sử dụng tại nhiều nơi như Bơm xăng, Trung tâm mua sắm, Sân bay, đường cao tốc, trạm thu phí, Khách sạn, Bệnh viện, Bãi đậu xe, Điểm kiểm tra Quốc phòng & Quân sự, v.v.
Có rất nhiều công cụ xử lý hình ảnh có sẵn để phát hiện biển số, nhưng ở đây trong hướng dẫn này, chúng tôi sẽ sử dụng Xử lý hình ảnh MATLAB để đưa biển số xe sang định dạng văn bản. Nếu bạn chưa quen với MATLAB hoặc xử lý hình ảnh, hãy kiểm tra các dự án MATLAB trước đây của chúng tôi:
- Bắt đầu với MATLAB: Giới thiệu nhanh
- Bắt đầu với Xử lý hình ảnh bằng MATLAB
Trước tiên, hãy để tôi nói sơ qua về khái niệm chúng tôi đang sử dụng để phát hiện biển số. Có ba chương trình hoặc tệp '.m' cho dự án này.
- Tạo mẫu ( template_creation.m ) - Điều này được sử dụng để gọi các hình ảnh đã lưu của chữ và số và sau đó lưu chúng dưới dạng một mẫu mới trong bộ nhớ MATLAB.
- Phát hiện chữ cái ( Letter_detection.m ) - Đọc các ký tự từ hình ảnh đầu vào và tìm chữ và số tương ứng phù hợp nhất.
- Phát hiện mảng ( Plate_detection.m ) - Xử lý hình ảnh và sau đó gọi hai tệp m ở trên để phát hiện số.
Bây giờ, chúng ta sẽ tìm hiểu về cách viết mã các tệp m này và những việc bạn phải làm trước khi bắt đầu viết mã. Sau khi xem qua hướng dẫn này, bạn có thể tìm thấy tất cả các tệp mã và video giải thích hoạt động ở cuối dự án này.
Tạo mẫu
Đầu tiên hãy tạo một thư mục cho dự án (tên thư mục của tôi là Number Plate Detection ) để lưu và lưu trữ các tệp. Chúng tôi đã lưu trữ các hình ảnh nhị phân của tất cả các bảng chữ cái và số trong thư mục con có tên là ' alpha' .
Bây giờ, hãy mở cửa sổ Trình chỉnh sửa trong MATLAB, như được hiển thị trong hình dưới đây,
Nếu bạn không quen với thuật ngữ cơ bản của MATLAB, tôi khuyên bạn nên xem hướng dẫn được liên kết.
Bây giờ, hãy sao chép và dán đoạn mã dưới đây vào tệp template_creation.m và lưu tệp trong thư mục dự án ( Phát hiện Biển số ). Tất cả các tệp liên quan đến dự án này bao gồm các tệp mẫu hình ảnh có thể được tải xuống từ đây. Cũng kiểm tra video được đưa ra ở cuối dự án này.
% Bảng chữ cái 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'); % Số tự nhiên một = imread ('alpha / 1.bmp'); hai = imread ('alpha / 2.bmp'); ba = imread ('alpha / 3.bmp'); bốn = imread ('alpha / 4.bmp'); năm = imread ('alpha / 5.bmp'); sáu = imread ('alpha / 6.bmp'); bảy = imread ('alpha / 7.bmp'); tám = imread ('alpha / 8.bmp'); nine = imread ('alpha / 9.bmp'); zero = imread ('alpha / 0.bmp'); % Tạo mảng cho bảng chữ cái letter =; % Tạo Mảng cho Numbers number =; NewTemplates =; save ('NewTemplates', 'NewTemplates') xóa tất cả
Ở đây, trong đoạn mã trên, chúng tôi đang lưu các hình ảnh vào một biến bằng cách sử dụng lệnh ' imread () '. Chức năng này được sử dụng để gọi các hình ảnh từ thư mục hoặc từ bất kỳ vị trí nào của PC vào MATLAB. Hãy lấy một ví dụ từ đoạn mã trên:
A = imread ('alpha / A.bmp');
Trong đó A là biến và trong ' alpha / A.bmp' , 'alpha' là tên thư mục và ' A.bmp' là tên tệp.
Sau đó, tạo một ma trận gồm ' chữ cái ' và ' số ' và lưu nó trong biến ' NewTemplates ' bằng cách sử dụng lệnh ' save (tên tệp, biến)' .
% Tạo mảng cho bảng chữ cái letter =; % Tạo Mảng cho Numbers number =; NewTemplates =; save ('NewTemplates', 'NewTemplates') xóa tất cả
Bây giờ hãy bắt đầu viết mã Letter_detection.m , trong một cửa sổ soạn thảo mới.
Phát hiện chữ cái
Ở đây chúng tôi đang tạo tệp mã thứ hai có tên là Letter_detection.m . Bây giờ, sao chép và dán đoạn mã dưới đây vào tệp đó và lưu tệp trong thư mục dự án với tên Letter_detection. Tệp này có thể được tải xuống từ đây, tệp zip đính kèm này cũng chứa các tệp khác liên quan đến dự án Phát hiện biển số này.
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))); % Bảng chữ cái danh sách. 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 chữ cái = 'F'; elseif ind == 10 letter = 'G'; elseif ind == 11 letter = '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 chữ cái = 'Y'; elseif ind == 33 letter = 'Z'; % * - * - * - * - * % Chữ số danh sách. 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'; chữ cái khác = '0'; kết thúc cuối cùng
Ở đây, trong đoạn mã trên, chúng ta đã tạo một hàm có tên là ký tự cung cấp cho chúng ta đầu ra chữ và số của hình ảnh đầu vào từ lớp ' alpha ' bằng cách sử dụng lệnh ' readLetter ()' . Và sau đó tải các mẫu đã lưu bằng cách sử dụng lệnh tải 'NewTemplates .
Sau đó, chúng tôi đã thay đổi kích thước hình ảnh đầu vào để nó có thể được so sánh với hình ảnh của mẫu bằng cách sử dụng lệnh 'imresize (tên tệp, kích thước)' . Sau đó, vòng lặp for được sử dụng để so sánh hình ảnh đầu vào với mọi hình ảnh trong mẫu để có được sự phù hợp nhất.
Một ma trận ' rec ' được tạo để ghi lại giá trị tương quan cho từng mẫu chữ và số với mẫu ký tự từ hình ảnh đầu vào, như được hiển thị trong đoạn mã dưới đây,
cor = corr2 (Mẫu mới {1, n}, snap);
Sau đó, lệnh 'find ()' được sử dụng để tìm chỉ mục tương ứng với ký tự được so khớp cao nhất. Sau đó, theo chỉ mục đó, ký tự tương ứng được in bằng câu lệnh 'if-else' .
Bây giờ, sau khi hoàn thành việc này, hãy mở một cửa sổ soạn thảo mới để bắt đầu mã cho chương trình chính.
Phát hiện biển số
Đây là tệp mã thứ ba và cuối cùng có tên Plate_detection.m sao chép và dán đoạn mã dưới đây vào tệp này và lưu vào thư mục dự án. Để bắt đầu nhanh, bạn có thể tải xuống tất cả các tệp mã có mẫu hình ảnh từ đây.
đóng tất cả; Làm sạch tất cả; im = imread ('Hình ảnh Biển số / image1.png'); imgray = rgb2gray (im); imbin = thấm nhuần (imgray); im = edge (imgray, 'prewitt'); % Các bước dưới đây là tìm vị trí của biển số Iprops = regionprops (im, 'BoundBox', 'Area', 'Image'); khu vực = Iprops.Area; count = numel (Iprops); maxa = diện tích; bindingBox = Iprops.BoundsBox; cho i = 1: đếm nếu maxa
Các lệnh cơ bản được sử dụng trong đoạn mã trên được đề cập dưới đây:
imread () - Lệnh này được sử dụng để mở hình ảnh vào MATLAB từ thư mục đích.
rgb2gray () – Lệnh này được sử dụng để chuyển đổi hình ảnh RGB sang định dạng thang độ xám.
Regiinarize () - Lệnh này được sử dụng để Binarize hình ảnh thang độ xám 2-D hoặc đơn giản chúng ta có thể nói nó chuyển đổi hình ảnh thành định dạng đen trắng.
edge () - Lệnh này được sử dụng để phát hiện các cạnh trong hình ảnh, bằng cách sử dụng các phương pháp khác nhau như Roberts, Sobel, Prewitt và nhiều phương pháp khác.
regionprops () - Lệnh này được sử dụng để đo các thuộc tính của vùng ảnh.
numel () - Lệnh này dùng để tính số phần tử của mảng.
imcrop () - Lệnh này được sử dụng để cắt hình ảnh theo kích thước đã nhập.
bwareaopen () - Lệnh này được sử dụng để xóa các đối tượng nhỏ khỏi ảnh nhị phân.
Bằng cách sử dụng các lệnh trên trong mã, chúng tôi đang gọi hình ảnh đầu vào và chuyển đổi nó thành thang độ xám. Sau đó, thang độ xám được chuyển đổi thành ảnh nhị phân và cạnh của ảnh nhị phân được phát hiện bằng phương pháp Prewitt.
Sau đó, mã dưới đây được sử dụng để phát hiện vị trí của biển số trong toàn bộ hình ảnh đầu vào, Iprops = regionprops (im, 'BoundBox', 'Area', 'Image'); khu vực = Iprops.Area; count = numel (Iprops); maxa = diện tích; bindingBox = Iprops.BoundsBox; for i = 1: count nếu maxa
Sau đó, cắt biển số và xóa các đối tượng nhỏ khỏi ảnh nhị phân bằng cách sử dụng lệnh 'imcrop ()' và 'bwareaopen ()' tương ứng.
Sau đó, đoạn mã dưới đây được sử dụng để xử lý hình ảnh biển số xe bị cắt đó và hiển thị số được phát hiện ở định dạng hình ảnh và văn bản (trong cửa sổ lệnh).
Iprops = regionprops (im, 'BoundBox', '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 = end end
Hoạt động của Hệ thống phát hiện biển số xe bằng MATLAB
Trong tệp template_creation.m, chúng tôi đã thiết kế mã để lưu tất cả các hình ảnh nhị phân của chữ và số vào một thư mục hoặc tệp có tên là ' NewTemplates '. Sau đó, thư mục đó được gọi trong Letter_detection.m như bạn có thể thấy bên dưới
Sau đó, trong tệp mã Plate_detection.m, tệp mã Letter_detection.m được gọi khi chúng tôi xử lý hình ảnh như trong hình dưới đây,
Bây giờ, hãy nhấp vào nút 'RUN' để chạy tệp.m
MATLAB có thể mất vài giây để phản hồi, hãy đợi cho đến khi nó hiển thị thông báo bận ở góc dưới bên trái như hình dưới đây,
Khi chương trình bắt đầu, bạn sẽ nhận được cửa sổ bật lên hình ảnh biển số và số trong cửa sổ lệnh. Đầu ra cho hình ảnh của tôi sẽ giống như hình dưới đây;
Hoạt động hoàn chỉnh của Hệ thống phát hiện biển số xe được trình bày trong Video bên dưới và tất cả các tệp mã có mẫu hình ảnh có thể được tải xuống từ đây.
Ngoài ra, hãy kiểm tra tất cả các Dự án MATLAB tại đây.