b. Phương pháp thực hành
3.1.3. Giai đoạn 3: Tìm đường bao đối tượng
Khi ta tiến hảnh phần ngưỡng sẽ làm hiện rö vùng biên số. trong giai đoạn nảy ta có thẻ sử dụng các phương pháp phát hiện biển.
Khi có ảnh 8-bịt kênh đơn thu được ở giải đoạn 2 chúng ta tiến hành tìm các vùng biến là đôi tượng riêng băng hàm findContourns (trong thư viện openCV) để trích các vùng và lây thông số của các vùng như tọa độ điểm của các cạnh, diện tích của vùng.
Hình 3.2 Tìm đường bao các đối tượng 3.1.4. Giai đoạn 4: Tách vùng biển số
Sau khi có được những thông số của giai đoạn 3 tìm thấy. Dựa vào các đặc điểm của biên số mà em tiên hành như sau:
Tìm đường bao đối tượng với với tiêu chỉ tỉ lệ 3.5<W/H<4.5 hoặc 0.8<W/N <1.4 đề tìm ra những vùng có thẻ là biên số nhất.
Để hạn chế số lượng vùng tím thây em tiền tục lọc ảnh theo tiêu chí điện tích đề hạn chế những vùng quá nhỏ và quá lớn so với vùng biển số. Với ảnh đầu vào được thay đồi kích cỡ vẻ ảnh có cỡ 640X480 thì vùng biển số sẽ nằm trong khoảng diện tích từ 1500 - 25000.
Tiến hành cắt các vùng có thẻ là biên số nhất trên ảnh xám đã lọc ở giai đoạn 1 để làm nguồn cho giai đoạn cắt ký tự để làm mẫu cho các quá trình nhận đạng
ký tự (tự xây dựng). Ở giai đoạn này có thê kết hợp dùng các bài toán nhận dạng ký tự để phát hiện biển số xe.
(a) (b)
Hình 3.3 (a) Ảnh đã khoanh vùng được biển số (b) Ảnh đã tách được biển số
3.2 Nhận dạng kí tự biển số bằng tesseract – OCR
Trong phần này mục đích chính là đọc được các ks tự trong biển số thành văn bản text với hỗ trợ của data set tesseract – OCR
Các giai đoạn trong việc đọc biển số thành text như sau:
Ảnh đầu vào ở đây là ảnh đã được cắt biển số ở giai đoạn 4 của phần “3.3 tách vùng biển số “
Hình 3.4 Ảnh cắt biển số 3.2.1. Giai đoạn 1: biến đổi ảnh xám, làm mịn ảnh
Giai đoạn này tương tự giai đoạn 1 của phần 3.3.
3.2.2. Gia đoạn 2: Tìm các giá trị ngưỡng của Threshold trong ảnh.
Trong giai đoạn này, Simple Thresholding thực hiện phân ngưỡng bằng cách thay thế giá trị lớn hơn hoặc bằng và giá trị bé hơn giá trị ngưỡng bằng một giá trị mới.
Ở đây, nhóm em đã thiết lập giá trị ngưỡng bằng 0, tức là tất cả các điểm ảnh sẽ được gán lại giá trị của nó là 255.
Trong thuật toán này, nhóm em đã sử dụng 2 loại ngưỡng đó là THRESH_BINARY_INV: Ngưỡng nhị phân đảo ngược. Có thể hiểu là nó sẽ đảo ngược lại kết quả của THRESH_BINARY và THRESH_OTSU: Sử dụng thuật toán Otsu để xác định giá trị ngưỡng.
Hình 3.5: Ảnh thresh khi sử dụng 2 ngưỡng THRESH_BINARY_INV & THRESH_OTSU
3.2.3. Tạo ảnh Opening và Invert
Ở đây, nhóm em dùng phép toán mở (opening) để ứng dụng vào việc loại bỏ các phần lồi lõm cho đường bao các đối tượng trong ảnh đã được qua xử lý thresh để các đối tượng trong ảnh trở nên mượt mà hơn. Vì thế mà ảnh opening sẽ tương đương với ảnh threshold.
Sau khi đã có được ảnh Opening, nhóm em đã dùng hàm Invert để thu được ảnh đảo ngược màu sắc so với ảnh Opening trên thang màu RGB.
Hình 3.6 (a) Ảnh Opening (b) Ảnh đảo ngược màu Invert 3.2.4. Nhận dạng kí tự bằng tesseract – OCR
Có rất nhiều cách để nhận dạng văn bản như Tesseract OCR, Train model bằng CNN + SVM, train model CNN – RNN – CTC ….Với dataset của OCR sẵn có thì nhóm em đã quyết định chọn OCR để nhận dạng kí tụ trong biển số thành văn bản text.
Từ những thông tin trong ảnh Invert, Đưa vào Tesseract nhận diện với tham số về language (ngôn ngữ) là English và phương thức xử lý (psm) cho phù hợp. Ở đây nhóm chọn psm = 12 là xử lý tìm 2 dòng text. Và chọn psm =6 hoặc bằng 7 với xử lý 1 dòng text.
Hình 3.7 Những kí tự đã được nhận dạng bàng OCR trên dạng text 3.3. Bài toán điều khiển động cơ DC bằng L298 điều khiển bằng Arduino 3.3.1. Tính toán và lựa chọn động cơ mô phỏng
Động cơ được lựa chọn là động cơ DC giảm tốc vàng 2 trục 1:48
Hình 3.8 Động cơ DC 2 trục 1:48
- Điện áp: 3-12VDC, khuyến nghị ở giải điện áp (6-8VDC)
- Dòng: 70mA (250mA Max) ở 3V
- Mô men xoắn: 800gfcm
- Tỷ số truyền: 1:48
- Tốc độ:
+ 125 rpm 3VDC (bánh 66mm: 26rpm) + 208 rpm 5VDC (bánh 66mm: 44rpm)
Module điều khiển động cơ là module L298N sử dụng IC điều khiển L298N, có gắn tản nhiệt chống nóng cho IC, giúp IC có thể điều khiển với dòng đỉnh đạt 2A. IC L298N được gắn với các điot trên board giúp bảo vệ vi xử lý chống lại các dòng điện cảm ứng từ việc khởi động/ tắt động cơ.
Hình 0.9 Module điều khiển động cơ L298N
3.3.2. Thiết kế mạch điều khiển động cơ
Hình 3.10: Mô phỏng điều khiển động cơ DC bằng L298 trên phần mềm
Nhóm đã dùng mạch điều khiển L298 để điều khiển động cơ DC bằng Arduino Uno(R3) vừa có thể điều khiển tốc độ động cơ, vừa có thể mô phỏng động cơ chạy theo cùng chiều hoặc ngược chiều để có thể đóng ở cổng tự động.
3.4. Kết quả và hướng phát triển mở rộng
3.4.1. Kết quả của hướng giải quyết phân ngưỡng và tìm đối tượng
Với mục đích tìm hiểu bài toán nhận dạng biển số xe và do thời gian có hạn, kiến thức chưa được chuyên sâu về xử lý ảnh nên nhóm em chưa thể hoàn thành được một cách tối ưu hoá nhất code trong phần xử lý ảnh OpenCV of Python. Nhóm em chỉ có thể dừng lại ở việc xây dựng hướng giải quyết và xây dựng chương trình phát hiện biển số xe và đọc biển số.
Trong giai đoạn tìm và chọn ảnh, nhóm em gặp rất nhiều khó khăn khi tìm những ảnh biển số có chất lượng rõ nét để nhận dạng. Mặc dù nhóm em đã sử dụng bộ lọc để làm giảm nhiễu nhưng có rất nhiều ảnh không thể nhận dạng được vị trí của biển số xe, đôi khi còn nhầm biển số sang các vị trí khác.
Từ thực nghiệm, nhóm em đã nhận thấy được chương trình kiểm nghiệm của nhóm em sẽ tiến hành quét ảnh xám với khoảng xám từ [100,220] đây là khoảng xám sẽ được sử dụng để xử lý nhị phân ảnh nên em sẽ sử dụng khoảng ngưỡng là [100,200].
Trong giai đoạn thứ 3 thì nhóm em có sử dụng hàm findcontourns do thư viện của OpenCV cấp sẵn chỉ sử dụng được ảnh đầu vào là Canny hoặc ảnh nhị
phân vì vậy ta bị giới hạn việc sử dụng các phương pháp phát hiện biên hoặc vùng là phương pháp biên Canny và phương pháp nhị phân.
Kết quả thí nghiệm
Mẫu 1 : Ảnh biển số xe ô tô, xe máy dân dụng nền trắng chữ đen
Với mẫu này nhóm em chỉ nhận dạng được vị trí của của biển số xe và cắt được các ảnh của biển số. Chưa thể đi vào đọc được kí tự trong biển thành text, xảy ra rất nhiều lỗi về font chữ khi nhận dạng kí tự.
Mẫu 2: mẫu vẽ tương tượng biển số trên Pain 3D
Với mẫu này thì phần khung và kí tự sẽ được rõ nét, có thể đọc được các kí tự xuất hiện trong ảnh. Đọc được văn bản xuất hiện trong ảnh chuẩn xác đến 90%.
Mô phỏng động cơ có thể điều chỉnh tốc độ theo ý muốn và điều khiển động cơ có thể chạy theo chiều thuận/nghịch theo yêu cầu của người điều khiển.
3.4.2. Hướng phát triển mở rộng bài toán nhận dạng biển số xe3.4.2.1 Nhận xét 3.4.2.1 Nhận xét
Từ những kết quả thu được (phần 4.1) em thấy giải quyết bài toán nhận dạng biến số xe theo hướng “ phân ngưỡng tìm đối tượng” có những ưu điểm sau:
Ưu điểm: Thuật toán cải đặt nhanh. tìm vùng biến số và cách ly ký tự với tỉ
lệ thành công cao ( ở những biên số thông thường). tìm được ở những ảnh tự nhiên, vùng biến số bị nghiêng.
Nhược điểm: Nhận dạng kém với những biên số có sự tương phản với ánh
nên thấp như biển nền đỏ, nền bị mờ, những biển số có đường viễn mảnh, biển số có lắp những thiết bị trang trí. biển bị bóng lóa do ánh sáng, và những biên có phần chữ số không rõ ràng.
Vì vậy. đề bài toán phát huy hiệu quả tốt nhất thì thiết bị quan sát cần đặt ờ vị trí phù hợp. Đẻ thu được những ảnh không có bóng sáng và hiện thị toàn bộ biển số xe. Phương pháp nảy xử lý được ảnh bất kỷ vì vậy có thể được đùng vào việc quan sát quản lý giao thông.
Bài toán mô phỏng động cơ cần hoàn thiện hơn khi thêm cảm biến chạm để báo cho động cơ có thể tự dừng lại khi đến 1 giới hạn nhất định.
3.4.2.2. Hướng phát triển của bài toán.
Nâng cao hiệu quả chương trình, tách ly các kí tự trong biển số trong các trường hợp biên số bị nhiều nhiễu. mắt mắt thông tin đo nhiều từ điều kiện môi
trường. tìm vùng biển số trong ảnh có độ tương phản giữa biển số và nền thấp. Đặc biệt là biển xe có nên màu đỏ chữ trắng.
Phát triển chương trình thành module phần cửng. Có khả năng tương thích với các thiết bị quan sát như camera.
Kết hợp chương trình với những chương trình nhận dạng khác đẻ hồ trợ tốt hơn cho việc quản lý phương tiện giao thông. Ví dụ: kết hợp với chương trình nhận dạng chữ viết đề đưa biển số về dạng ký tự trên máy tính giúp công việc quản lý bến bãi...
Nghiên cứu theo hưởng một ứng dụng cụ thê như : giám sát phương tiện giao thông. xử lý vi phạm giao thông, quản lý xe tại các bãi giữ xe, các kho vật tư....
Bài toán có thể áp dụng cho bãi đỗ xe dễ dàng kiểm soát tốt hơn bằng thẻ RFID.
3.4.3. Ứng dụng thực tiễn của hệ thống nhận dạng biển số xe
Hệ thống nhận dạng biển số xe được xây dựng nhằm mục đích giám sát, kiểm soát các phương tiện. Dưới đây chúng ta để cập đến một số ứng dụng phổ biến đối với hệ thống nhận dạng biển số xe:
- Hệ thống nhận dạng biển số xe có thể phát triển lên đến tự động quét thẻ khi ra vào bến bãi, cửa sẽ tự động mở không cần đến người điều khiển khi nhận dnagj đúng biển số đã quét.
- Lưu trữ lại tất cả những biển số, người dùng đã ra vào bến bãi, thống kê số lượt ra vào/ ngày với công nghệ lưu trữ, xuất thông tin chính xác, có thể từ biển số xác định được chủ xe để dễ quản lý hơn và có thể hướng phát triển đến nhận diện cả khuôn mặt và đối sánh với chủ sở hữu phương tiện được gửi trong bến bãi.
KẾT LUẬN
Sự phát triển của công nghệ thông tin đĩ có những tác động tích cực đến nhiều mặt của đời sống xã hội trong đó phải kể tới lĩnh vực giám sát tự động. Trong giám sát tự động. việc giám sát đối với các phương tiện giao thông là một vẫn đẻ nỗi trội. Nhiều chính phủ, thành phố trên thế giớ đã xây dựng hệ thống giám sát tự động đối với các phương tiện giao thông của mình. Và hệ thống giám sát đều lấy biển số xe là mục tiêu giám sát.
Ở nước ta, các hệ thống giám sát tự động nói cung và hệ thông nhận dạng biển số xe nói riêng cũng đang được chú trọng tuy nhiên nó vẫn còn là lĩnh vực cần nhiều công sức đầu tư đẻ cải thiện phường pháp cũng như tỷ lệ tìm hiển thành công.
Đa phần các công tác quản lý, xử lý đối với các phương tiện giao thông đều cần nhân lực con người. Báo cáo nhằm mục đích tìm hiểu bài toán hệ nhận dnagj biển số xe với mục đích đê quản lý, giám sát các phương tiện giao thông.
Với mục đích xây dựng lên bài toán nhận dạng biển số xe này, em hy vọng sau này có thể làm tài liệu tham khảo để hướng đến phát triển nhưng công nghệ tự động ngày càng tiên tiến, hiện đại hơn.
PHỤ LỤC
Các thư viện cần cài
opencv-python imutils
pytesseract numpy as np openpyxl
Code bài toán Nhận dạng biển số xe với OpenCV
import cv2 import imutils import pytesseract import numpy as np import openpyxl import matplotlib.pyplot as plt from PIL import Image
max_size = 5000 min_size = 900
image = cv2.imread( "006.JPG") image = cv2.resize(image, (640, 480))
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) gray = cv2.bilateralFilter(gray, 11, 17, 17)
edged = cv2.Canny(gray, 100, 120) cv2.imshow(" anh canny", edged)
#cv2.imshow(" anh lam min", gray)
(cnts,_) = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)[:5] NumberPlateCnt = []
tmp = image.copy() count = 0
for c in cnts:
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.02 * peri, True) cv2.drawContours(tmp,[c],-1,(0,0,128), 2) plate = approx break if len(approx) == 4: NumberPlateCnt.append(approx) if NumberPlateCnt is None:
print("khong nhan duoc bien so") else:
for plate in NumberPlateCnt:
cv2.drawContours(image,[plate],-1,(0,255,0),3) #cv2.imshow("anh da duoc nhan bien so",image) mask = np.zeros(gray.shape, np.uint8)
new_image = cv2.drawContours(mask, [plate], 0, 255, -1, ) new_image = cv2.bitwise_and(image , image, mask=mask)
(x, y) = np.where(mask == 255) (topx, topy) = (np.min(x), np.min(y))
(bottomx, bottomy) = (np.max(x), np.max(y))
Cropped = gray[topx-1:bottomx + 1, topy -1:bottomy +1] #cv2.imshow('Anh cat bien so', Cropped)
cv2.imwrite('anh bien so.jpg',Cropped)
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract- OCR\tesseract.exe"
image = cv2.imread( 'anh bien so.jpg' )
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) blur = cv2.GaussianBlur(gray, (3,3), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1) invert = 255 - opening
data = pytesseract.image_to_string(invert, lang='eng', config='--psm 12') print("THONG TIN NHAN DIEN :")
print(data) #cv2.imshow('thresh', thresh) #cv2.imshow('opening', opening) #cv2.imshow('invert', invert) cv2.waitKey(0) cv2.destroyAllWindows()
Code bài toán điều khiển động cơ DC
int in2=6; int nutnhanlen=10; int nutnhanxuong=11; void setup() { pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(nutnhanlen, INPUT_PULLUP); pinMode(nutnhanxuong, INPUT_PULLUP); } void loop() { int trangthainutlen=digitalRead(nutnhanlen); int trangthainutxuong=digitalRead(nutnhanxuong); if(trangthainutlen==0 && trangthainutxuong!=0){ tien();
}
else if (trangthainutlen!=0 && trangthainutxuong==0){ lui(); } else {dung();} } void tien(){ digitalWrite(in1,HIGH); digitalWrite(in2,LOW); } void lui(){
digitalWrite(in1,LOW); digitalWrite(in2,HIGH);} void dung(){ digitalWrite(in1,LOW); digitalWrite(in2,LOW); }
TÀI LIỆU THAM KHẢO Tiếng Việt
[1] Giáo trình môn học PGS.TS Đỗ Năng Toàn,TS Phạm Việt Bình xuất bản tháng 11 năm 2007
[2] Các trang wed dạy trí tuệ nhân tạo, xử lý ảnh MI AI, các trang wed về lập trình Arduino IDE…
Tiếng Anh
[3] learing OpenCV_computer vission with the OpenCV Library_Gảy Nreadki & Kaenler
[4] https://docs.opencv.org/
[5] https://vi.wikipedia.org/wiki/