- การสร้างเทมเพลต
- การตรวจจับจดหมาย
- การตรวจจับป้ายทะเบียน
- การทำงานของระบบตรวจจับหมายเลขทะเบียนรถโดยใช้ MATLAB
คุณเคยสงสัยหรือไม่ว่าระบบ ANPR (Automatic Number Plate Recognition) ทำงานอย่างไร? ให้ฉันบอกแนวคิดเบื้องหลังมันกล้องของระบบ ANPR จะจับภาพป้ายทะเบียนรถยนต์จากนั้นภาพจะถูกประมวลผลผ่านอัลกอริทึมจำนวนมากเพื่อให้การแปลงรูปภาพเป็นตัวเลขตัวอักษรเป็นรูปแบบข้อความ ระบบ ANPR ถูกนำไปใช้ในสถานที่ต่างๆเช่นปั้มน้ำมันห้างสรรพสินค้าสนามบินทางหลวงด่านเก็บเงินโรงแรมโรงพยาบาลที่จอดรถจุดตรวจป้องกันและทหารเป็นต้น
มีเครื่องมือประมวลผลภาพมากมายสำหรับการตรวจจับป้ายทะเบียนนี้ แต่ในบทช่วยสอนนี้เราจะใช้MATLAB Image Processing เพื่อรับหมายเลขป้ายทะเบียนรถในรูปแบบข้อความ หากคุณยังใหม่กับ MATLAB หรือการประมวลผลภาพให้ตรวจสอบโครงการ MATLAB ก่อนหน้าของเรา:
- เริ่มต้นใช้งาน MATLAB: บทนำโดยย่อ
- เริ่มต้นกับการประมวลผลภาพโดยใช้ MATLAB
ก่อนอื่นให้ฉันสรุปเกี่ยวกับแนวคิดที่เราใช้ในการตรวจจับป้ายทะเบียน มีสามโปรแกรมหรือไฟล์ ".m" สำหรับโครงการนี้
- การสร้าง เทมเพลต ( template_creation.m ) - ใช้เพื่อเรียกภาพที่บันทึกเป็นตัวอักษรและตัวเลขจากนั้นบันทึกเป็นเทมเพลตใหม่ในหน่วยความจำ MATLAB
- การตรวจจับจดหมาย ( Letter_detection.m ) - อ่านอักขระจากภาพอินพุตและค้นหาตัวอักษรและตัวเลขที่ตรงกันสูงสุด
- การตรวจจับเพลท ( Plate_detection.m ) - ประมวลผลภาพจากนั้นเรียกไฟล์ m สองไฟล์ด้านบนเพื่อตรวจจับหมายเลข
ตอนนี้เราจะเรียนรู้เกี่ยวกับวิธีการเขียนโค้ด m-files เหล่านี้และสิ่งที่คุณต้องทำก่อนเริ่มเขียนโค้ด หลังจากอ่านบทช่วยสอนนี้แล้วคุณจะพบไฟล์โค้ดทั้งหมดและวิดีโออธิบายการทำงานในตอนท้ายของโปรเจ็กต์นี้
การสร้างเทมเพลต
ขั้นแรกให้สร้างโฟลเดอร์สำหรับโครงการ (ชื่อโฟลเดอร์ของฉันคือ Number Plate Detection ) เพื่อบันทึกและจัดเก็บไฟล์ เราได้จัดเก็บภาพไบนารีของตัวอักษรทั้งหมดและตัวเลขในโฟลเดอร์ย่อยชื่อเป็น ' อัลฟา'
ตอนนี้เปิดหน้าต่างตัวแก้ไขใน 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 ('อัลฟา / F.bmp'); G = imread ('alpha / G.bmp'); H = imread ('alpha / H.bmp'); ฉัน = imread ('alpha / I.bmp'); J = imread ('alpha / J.bmp'); K = imread ('alpha / K.bmp'); L = imread ('อัลฟา / 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 ('อัลฟา / V.bmp'); W = imread ('alpha / W.bmp'); X = imread ('อัลฟา / X.bmp '); Y = imread ('alpha / Y.bmp'); Z = imread ('อัลฟา / Z.bmp'); ธรรมชาติจำนวน หนึ่ง = imread ('alpha / 1.bmp'); สอง = imread ('alpha / 2.bmp'); สาม = imread ('alpha / 3.bmp'); สี่ = imread ('alpha / 4.bmp'); ห้า = imread ('alpha / 5.bmp'); หก = imread ('alpha / 6.bmp'); เจ็ด = imread ('alpha / 7.bmp'); แปด = imread ('alpha / 8.bmp'); เก้า = imread ('alpha / 9.bmp'); ศูนย์ = imread ('alpha / 0.bmp'); % การสร้าง Array สำหรับ Alphabets letter =; % การสร้าง Array สำหรับ Numbers number =; NewTemplates =; บันทึก ('NewTemplates', 'NewTemplates') ล้างทั้งหมด
ที่นี่ในโค้ดข้างต้นที่เรากำลังบันทึกภาพลงในตัวแปรโดยใช้คำสั่ง' imread () 'ฟังก์ชั่นนี้ใช้เพื่อเรียกภาพจากโฟลเดอร์หรือจากตำแหน่งใด ๆ ของพีซีไปยัง MATLAB ลองดูตัวอย่างจากโค้ดด้านบน:
A = imread ('อัลฟา / A.bmp');
โดยที่ A คือตัวแปรและใน ' alpha / A.bmp' , 'alpha' คือชื่อโฟลเดอร์และ ' A.bmp' คือชื่อไฟล์
แล้วสร้างเมทริกซ์ของ ' จดหมาย ' และ ' ตัวเลข ' และบันทึกไว้ใน 'ตัวแปร NewTemplates ' โดยใช้คำสั่ง ' บันทึก (ชื่อไฟล์ตัวแปร)'
% การสร้าง Array สำหรับ Alphabets letter =; % การสร้าง Array สำหรับ Numbers number =; NewTemplates =; บันทึก ('NewTemplates', 'NewTemplates') ล้างทั้งหมด
ตอนนี้เริ่มการเข้ารหัส Letter_detection.m ในหน้าต่างตัวแก้ไขใหม่
การตรวจจับจดหมาย
ที่นี่เราจะสร้างไฟล์รหัสที่สองชื่อLetter_detection.mตอนนี้คัดลอกและวางรหัสด้านล่างในไฟล์นั้นและบันทึกไฟล์ในโฟลเดอร์โครงการด้วยชื่อ Letter_detection ไฟล์นี้สามารถดาวน์โหลดได้จากที่นี่ไฟล์ zip ที่แนบมานี้ยังมีไฟล์อื่น ๆ ที่เกี่ยวข้องกับโครงการตรวจจับป้ายทะเบียนนี้
ตัวอักษรฟังก์ชัน = readLetter (snap) โหลด NewTemplates snap = imresize (snap,); rec =; สำหรับ n = 1: length (NewTemplates) cor = corr2 (NewTemplates {1, n}, snap); rec =; end ind = find (rec == สูงสุด (rec)); แสดง (find (rec == max (rec))); % รายชื่อตัวอักษร ถ้า ind == 1 - ind == 2 letter = 'A'; elseif ind == 3 - ind == 4 ตัวอักษร = 'B'; elseif ind == 5 ตัวอักษร = 'C' elseif ind == 6 - ind == 7 ตัวอักษร = 'D'; elseif ind == 8 ตัวอักษร = 'E'; elseif ind == 9 ตัวอักษร = 'F'; elseif ind == 10 ตัวอักษร = 'G'; elseif ind == 11 ตัวอักษร = 'H'; elseif ind == 12 ตัวอักษร = 'I'; elseif ind == 13 ตัวอักษร = 'J'; elseif ind == 14 ตัวอักษร = 'K'; elseif ind == 15 ตัวอักษร = 'L'; elseif ind == 16 ตัวอักษร = 'M'; elseif ind == 17 ตัวอักษร = 'N'; elseif ind == 18 - ind == 19 ตัวอักษร = 'O'; elseif ind == 20 - ind == 21 ตัวอักษร = 'P'; elseif ind == 22 - ind == 23 ตัวอักษร = 'Q'; elseif ind == 24 - ind == 25 ตัวอักษร = 'R'; elseif ind == 26 ตัวอักษร = 'S'; elseif ind == 27 ตัวอักษร = 'T'; elseif ind == 28 ตัวอักษร = 'U'; elseif ind == 29 ตัวอักษร = 'V'; elseif ind == 30 ตัวอักษร = 'W'; elseif ind == 31 ตัวอักษร = 'X'; elseif ind == 32 จดหมาย = 'Y'; elseif ind == 33 ตัวอักษร = 'Z'; % * - * - * - * - * รายชื่อ% ตัวเลข elseif ind == 34 ตัวอักษร = '1'; elseif ind == 35 ตัวอักษร = '2'; elseif ind == 36 ตัวอักษร = '3'; elseif ind == 37 - ind == 38 ตัวอักษร = '4'; elseif ind == 39 ตัวอักษร = '5'; elseif ind == 40 - ind == 41 - ind == 42 ตัวอักษร = '6'; elseif ind == 43 ตัวอักษร = '7'; elseif ind == 44 - ind == 45 ตัวอักษร = '8'; elseif ind == 46 - ind == 47 - ind == 48 ตัวอักษร = '9'; จดหมายอื่น = '0'; ปลาย ปลาย
ที่นี่ในโค้ดข้างต้นเราได้สร้างฟังก์ชั่นการตั้งชื่อ ตัวอักษร ซึ่งทำให้เราส่งออกและตัวเลขของภาพที่นำเข้าจาก 'class อัลฟา ' โดยใช้คำสั่ง ' readLetter ()' และแล้วโหลดแม่แบบที่บันทึกไว้โดยใช้คำสั่ง โหลด 'NewTemplates
หลังจากที่เราได้มีการปรับขนาดภาพที่นำเข้าเพื่อที่จะสามารถนำมาเปรียบเทียบกับภาพเทมเพลตโดยใช้คำสั่ง 'imresize (ชื่อไฟล์ขนาด)' จากนั้น สำหรับการ วนซ้ำจะใช้เพื่อเชื่อมโยงภาพอินพุตกับทุกภาพในเทมเพลตเพื่อให้ได้ภาพที่ตรงกัน
เมทริกซ์ ' rec ' ถูกสร้างขึ้นเพื่อบันทึกค่าของความสัมพันธ์สำหรับแต่ละเทมเพลตที่เป็นตัวอักษรและตัวเลขด้วยเทมเพลตอักขระจากภาพอินพุตดังแสดงในโค้ดด้านล่าง
cor = corr2 (NewTemplates {1, n}, snap);
จากนั้นใช้คำสั่ง 'find ()' เพื่อค้นหาดัชนีที่ตรงกับอักขระที่ตรงกันสูงสุด จากนั้นตามดัชนีนั้นอักขระที่เกี่ยวข้องจะถูกพิมพ์โดยใช้คำสั่ง 'if-else'
ตอนนี้หลังจากเสร็จสิ้นด้วยสิ่งนี้ให้เปิดหน้าต่างตัวแก้ไขใหม่เพื่อเริ่มโค้ดสำหรับโปรแกรมหลัก
การตรวจจับป้ายทะเบียน
นี่คือไฟล์รหัสที่สามและสุดท้ายชื่อ Plate_detection.m คัดลอกและวางรหัสด้านล่างในไฟล์นี้และบันทึกลงในโฟลเดอร์โครงการ สำหรับการเริ่มต้นอย่างรวดเร็วคุณสามารถดาวน์โหลดไฟล์โค้ดทั้งหมดพร้อมเทมเพลตรูปภาพได้จากที่นี่
ปิดทั้งหมด ลบทั้งหมด; im = imread ('Number Plate Images / image1.png'); imgray = rgb2gray (ฉัน); imbin = imbinarize (imgray); im = ขอบ (imgray, 'prewitt'); ขั้นตอนด้านล่างนี้คือการค้นหาตำแหน่งของป้ายทะเบียน Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); พื้นที่ = Iprops.Area; นับ = ตัวเลข (Iprops); maxa = พื้นที่; boundingBox = Iprops.BoundingBox; สำหรับ i = 1: นับ ถ้า maxa
คำสั่งพื้นฐานที่ใช้ในโค้ดด้านบนมีดังต่อไปนี้:
imread () - คำสั่งนี้ใช้เพื่อเปิดภาพไปยัง MATLAB จากโฟลเดอร์เป้าหมาย
rgb2gray () - คำสั่งนี้ใช้เพื่อแปลงภาพ RGB เป็นรูปแบบสีเทา
imbinarize () - คำสั่งนี้ใช้สำหรับ Binarize 2-D grayscale image หรือเรียกง่ายๆว่ามันแปลงรูปภาพเป็นรูปแบบขาวดำ
edge () - คำสั่งนี้ใช้เพื่อตรวจจับขอบในภาพโดยใช้วิธีการต่างๆเช่น Roberts, Sobel, Prewitt และอื่น ๆ อีกมากมาย
regionprops () - คำสั่งนี้ใช้เพื่อวัดคุณสมบัติของขอบเขตรูปภาพ
numel () - คำสั่งนี้ใช้เพื่อคำนวณจำนวนองค์ประกอบอาร์เรย์
imcrop () - คำสั่งนี้ใช้เพื่อครอบตัดรูปภาพตามขนาดที่ป้อน
bwareaopen () - คำสั่งนี้ใช้เพื่อลบวัตถุขนาดเล็กออกจากภาพไบนารี
โดยใช้คำสั่งข้างต้นในโค้ดเรากำลังเรียกภาพอินพุตและแปลงเป็นโทนสีเทา จากนั้นสีเทาจะถูกแปลงเป็นภาพไบนารีและตรวจพบขอบของภาพไบนารีโดยวิธี Prewitt
จากนั้นโค้ดด้านล่างนี้จะใช้ในการตรวจสอบสถานที่ของแผ่นตัวเลขในภาพที่นำเข้าทั้งหมด, Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); พื้นที่ = Iprops.Area; นับ = ตัวเลข (Iprops); maxa = พื้นที่; boundingBox = Iprops.BoundingBox; สำหรับ i = 1: นับ ถ้า maxa
หลังจากนั้นครอบตัดแผ่นตัวเลขและลบวัตถุขนาดเล็กออกจากภาพไบนารีโดยใช้คำสั่ง 'imcrop ()' และ 'bwareaopen ()' ตามลำดับ
จากนั้นรหัสด้านล่างจะใช้ในการประมวลผลภาพป้ายทะเบียนที่ครอบตัดและเพื่อแสดงหมายเลขที่ตรวจพบในรูปแบบรูปภาพและข้อความ (ในหน้าต่างคำสั่ง)
Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); นับ = ตัวเลข (Iprops); noPlate =; สำหรับ i = 1: count ow = length (Iprops (i).Image (1,:)); โอ้ = ความยาว (Iprops (i).Image (:, 1)); ถ้า ow <(h / 2) & oh> (h / 3) letter = Letter_detection (Iprops (i).Image); noPlate = end end
การทำงานของระบบตรวจจับหมายเลขทะเบียนรถโดยใช้ MATLAB
ใน ไฟล์ template_creation.m เราได้ออกแบบโค้ดเพื่อบันทึกภาพไบนารีทั้งหมดของตัวอักษรและตัวเลขลงในไดเร็กทอรีหรือไฟล์ที่มีชื่อว่า ' NewTemplates ' จากนั้นไดเร็กทอรีนั้นจะถูกเรียกใน Letter_detection.m ดังที่คุณเห็นในด้านล่าง
จากนั้นในไฟล์โค้ด Plate_detection.m ไฟล์โค้ด Letter_detection.m จะถูกเรียกเมื่อเราประมวลผลภาพดังที่แสดงในภาพด้านล่าง
ตอนนี้คลิกที่ปุ่ม 'RUN' เพื่อเรียกใช้ไฟล์. m
MATLAB อาจใช้เวลาสองสามวินาทีในการตอบกลับรอจนกว่าข้อความไม่ว่างที่มุมล่างซ้ายดังที่แสดงด้านล่าง
เมื่อเริ่มโปรแกรมคุณจะได้รับป๊อปอัพภาพป้ายทะเบียนและหมายเลขในหน้าต่างคำสั่ง ผลลัพธ์สำหรับภาพของฉันจะมีลักษณะเหมือนภาพที่ระบุด้านล่าง
การทำงานที่สมบูรณ์ของระบบตรวจจับป้ายทะเบียนรถยนต์แสดงอยู่ในวิดีโอด้านล่างและสามารถดาวน์โหลดไฟล์รหัสทั้งหมดพร้อมเทมเพลตรูปภาพได้จากที่นี่
ตรวจสอบโครงการ MATLAB ทั้งหมดได้ที่นี่