Top Ad unit 728 × 90


Nhận diện biển số xe (Dùng SVIM) C++ Phần 2 tìm và nhận dạng ký tự.

Nhận diện biển số xe – Phần 2 tìm ký tự

car_plate1
Để dễ dàng cho việc tìm ký tự, ta quy định kích thước chuẩn của biển số để tách ký tự dễ dàng hơn, source code gốc là 33×144 pixels. Và nhắc lại lần nữa, thuật toán này chỉ là đề tài nghiên cứu chứ không phải sản phẩm thương mại, do đó chỉ phù hợp với các hình ảnh sắc nét và nhìn trực diện.
Dựa trên đặc điểm là các ký tự màu đen nằm trên nền trắng, nên thuật toán khá giống như bài viết Sử dụng floodfill để tìm ký tự

Các bước thực hiện

– Tiền xử lý
– Tìm contours
– Lọc những contours hợp lý

Tiền xử lý

Bước này nhị phân hóa để lấy các ký tự, do các ký tự thì màu đen nên phải nghịch đảo lại bằng tham số cv::THRESH_BINARY_INV. Sau bước này được hình ảnh như bên dưới
char_car1

Tìm contours

Khi nhìn kỹ vào biển số, thấy được trong biển số đã crop có các ký tự, dấu gạch nối và “trash pixels” bên dưới góc phải biển số có màu trắng. Vùng màu đen là background không có giá trị, do đó khi tìm contours thì kết quả là các contours bao lấy các pixels màu trắng mà thôi.
Code để tìm contours như sau:
Trong đó CV_RETR_EXTERNAL nghĩa là chỉ lấy những contours bao lấy ký tự, những contours nằm bên trong ký tự (số 9, số 6, số 0 sẽ có contours nằm bên trong ký tự). Sau bước này ta được 9 contours, bao gồm: 7 ký tự, 1 dấu gạch nối, 1 trash pixels góc dưới bên phải biển số.

Lọc contours

Chúng ta chỉ quan tâm tới 7 ký tự biển số, do đó để biết contours nào đang chứa ký tự thì dựa vào các quy luật gồm:
– width luôn nhỏ hơn height
– Chiều cao tối thiểu 15 pixels
– Tỉ lệ aspect (width/height) phải lớn hơn 0.2 và nhỏ hơn 0.5. Đây là tỉ lệ với biển số nhìn trực diện, nếu có biển số nằm nghiêng phải thay đổi cho phù hợp
– Tỉ lệ pixel màu trắng trong mỗi ký tự phải nhỏ hơn 80%
Sau khi áp dụng những quy luật đó thì ta còn lại các contours hợp lệ:
char_car2
Vậy là hoàn thành bước 2 của công việc nhận diện biển số xe hơi, các ký tự vừa tìm được sẽ được dùng để nhận diện ở bước 3

Load training data

Trong source code gốc có sẵn file svim.tx . Đó là các hình ảnh dùng để training được lưu dưới dạng text trong file svim.txt. Chúng ta chỉ cần load lên là dùng không cần làm gì thêm
Để có thể hình dung cách chuẩn bị tập dữ liệu training bạn có thể đọc bài Sử dụng SVM để nhận diện ký tự. Cũng tương đối giống về cách chuẩn bị data.
Các ký tự dùng để training có kích thước 15×15, biến đổi thành ma trận 1 dòng thành 225×1 pixels, cộng thêm histogram feature theo chiều dọc 20pixels và ngang 20pixels nữa là 265×1 pixels.
Bộ dữ liệu có 671 ký tự, vậy xếp 671 ký tự này thành 1 ảnh 2D ta được ảnh 265×671 pixels dùng để training( Các bạn có thể tìm hiểu rõ hơn trong video hướng dẫn)

Biến đổi các ký tự theo chuẩn
Như đã nói ở trên, mỗi ký tự được biến đổi thành dạng phù hợp thì ngoài giá trị pixels thì còn giá trị histogram nữa. Cụ thể hóa bằng cách vẽ thành histogram cho dễ hình dung.
Phân lớp ký tự và sắp xếp kết quả
Đến bước này chỉ cần dùng model KNN đã load để nhận diện ký tự. Kết quả sẽ trả về tương ứng, sau đó sắp xếp từ trái qua phải ta được kết quả
Video hướng dẫn (1)
Video hướng dẫn (2)


Nhận diện biển số xe (Dùng SVIM) C++ Phần 2 tìm và nhận dạng ký tự. Reviewed by Jacky on tháng 12 10, 2017 Rating: 5

Không có nhận xét nào:

All Rights Reserved by Cộng Đồng OpenCV © 2017
Edit bởi: Jacky Le | Youtube Channel: JACKY LE

Biểu mẫu liên hệ

Tên

Email *

Thông báo *

Được tạo bởi Blogger.