You are on page 1of 6

Phần mềm nhận diện biển số xe

I. Giới thiệu tổng quan về các Open Source sử dụng


1. Tesseract OCR
Tesseract bộ công cụ mã nguồn mở để nhận diện kí tự (OCR) được
phát triển bởi hãng HP giữa những năm 1984 và 1994. Bộ mã nguồn mở
này thực hiện đọc môt bức ảnh nhị phân, ảnh đen trắng hay ảnh màu và
cho ra những dòng kí tự chứa trong bức ảnh đó. Quá trình nhận dạng và
cho ra kí tự được thực hiện từng bước một theo cơ chế liên kết pipeline.
Đầu tiên là phân tích những đường nét phác thảo của hình ảnh đưa vào.
Sau đó tạo ra các Blobs chứa các dòng kí tự. Tiếp theo những dòng kí tự
này được phá vỡ tiếp thành các từ độc lập dựa vào khoảng giãn cách giữa
các từ. Quá trình xử lí tiếp theo sẽ là phá vỡ ở mức kí tự trong từng từ và
phân chia chúng thành các nhóm kí tự khác nhau. Tiếp theo chúng ta có
thể tạo ra dữ liệu huấn luyện hay dùng những bộ dữ liệu đã có để cho ra
kí tự được mã hóa trên máy tính với từng nhóm kí tự vừa được phân chia.
Sau đó các kí tự được trả về theo trật tự từng từ đã tách ra và từng dòng
đã phân tích.

2. OpenCV
OpenCV là bộ thư viện tầm nhìn máy tính mã nguồn mở
(Computer Vision Library) được viết bằng C và C++ và được chạy trên
Linux, Windows và cả Mac OS X do Intel phát minh. OpenCV được thiết
kế cho những tính toán hiệu quả với khả năng đáp ứng thời gian thực cao.
Bộ thư viện của OpenCV chứa hơn 500 chức năng có thể mở rộng ra
nhiều lĩnh vực về nhìn nhận, bao gồm an ninh, nhận diện khuôn mặt, xử lí
ảnh, xử lí video…

3. EmguCV
Các bộ mã nguồn mở đa số đều được viết bằng ngôn ngữ C hay C+
+ và như trên chúng ta đã tìm hiểu thì OpenCV cũng nằm trong số đó.
Với yêu cầu đưa ra nhiều lựa chọn về ngôn ngữ sử dụng mã nguồn mở
cho bộ OpenCV thì Emgu CV ra đời nhằm tạo ra một bộ mã nguồn mở
đa nền tảng trên .Net (a cross platform .Net) cho OpenCV. Qua đó những
hàm chức năng của OpenCV có thể được gọi bằng các ngôn ngữ tương
thích .NET như C#, VB, IronPython…

4. Tessnet2
Tessnet2 là bộ mã ngồn mở OCR trên nền tảng .NET 2.0 dùng
engine Tesseract đã được trình bày ở trên. Tessnet2 giúp cho việc sử
dụng Tesseract trở nên dễ dàng hơn trong các dự án của bạn với môi
trường .NET.
II. Sơ đồ khối hệ thống
1. Sơ đồ tổng quát

C#

Ảnh chứa biển số


xe
Xử lý ảnh
(Emgu CV)
Ảnh con chỉ chứa
vùng biển số xe

Nhận diện kí tự
(Tessnet 2)

Kí tự và số trong
biển số xe

Hiển thị và lưu trữ


(CSDL)

Biển số xe , tỉnh/
thành phố

Hình 1: Sơ đồ tổng quát của hệ thống

Hệ thống của chúng ta có đầu vào đơn giản từ những bức hình chụp
phương tiện cần nhận diện biển số xe. Sau đó, bức hình sẽ được xử lí
nhằm tìm ra vùng chứa biển số xe. Tiếp theo engine OCR sẽ nhận diện
được kí tự trong vùng chứa biển số xe và đưa vào CSDL để xử lí và lưu
trữ .
2. Quá trình xử lí ảnh

Xử lí ảnh

Ảnh chứa biển số


xe
Chuyển ảnh
sang dạng
byte
Ảnh nhị phân

Tìm sườn

Ảnh hiển thị dạng


sườn

Tạo đường
biên

Tệp các đường


biên Counters

Tìm biển số xe

Ảnh con chứa vùng


biển số xe

Hình 2: Công đoạn xử lí ảnh

Bức ảnh sau khi được đưa vào sẽ được chuyển về trắng đen và mã
hóa thành dạng nhị phân kiểu byte. Tiếp theo là bước tìm sườn của bức
ảnh (edges) để phục vụ cho bước tìm đường biên tiếp theo. Trước hết
chúng ta cần hiểu sườn trong một bức ảnh là những vùng với độ tương
phản rất mạnh. Tìm sườn của một bức ảnh là giảm thiểu đáng kể tổng số
dữ liệu của bức ảnh và lọc ra những thông tin không cần thiết trong khi
vẫn lưu trữ được những đặc tính cấu trúc quan trọng của bức ảnh đó.
Hình 3: Sử dụng thuật toán Canny để tìm sườn
Công việc này được thực hiện nhờ thuật toán Canny, được biết đến
như một thuật toán tìm sườn tối ưu nhất. Chi tiết xem tại Canny
Algorithm.
Quá trình xử lí tiếp theo là tạo đường biên (counters). Mặc dù thuật
toán tìm sườn (Canny) giúp chúng ta có được những điểm ảnh mô tả sườn
của bức ảnh song chúng lại không thể chỉ ra cho ta biết sự liên kết giữa
những sườn ảnh này, ví dụ việc có hay không những sườn ảnh khác bên
trong một sườn ảnh mà ta đang xét !? Để giải quyết vấn đề này, OpenCV
đưa ra một hàm chức năng mang tên cvFindCounters(). Thuật ngữ đường
biên hay Counters được sử dụng ở đây được hiểu là một danh sách những
điểm mà nó miêu tả, hay có thể gọi theo một cách khác là những đường
cong của bức ảnh. Sự miêu tả này có thể khác nhau tùy thộc vào những
trường hợp cụ thể. Có nhiều cách để miêu tả một đường cong, riêng trong
OpenCV một đường biên (counter) được miêu tả bởi môt chuỗi số
(sequence) mà mỗi thực thể trong chuỗi đó mã hóa thông tin về vị trí của
điểm tiếp theo trên đường biên. Những đường biên sau khi được phát
hiện sẽ được tổ chức theo một trật tự nhất định, giúp chúng ta có thể biết
được quan hệ giữa các đường biên. Với yêu cầu ứng dụng đưa ra là tìm
biển số xe, ta sẽ xét đến cách tổ chức theo dạng cây của các đường biên.
Hình 4: Các đường biên sau khi được tạo ra

Để dễ hiểu, ta xét một ví dụ về một bức ảnh biển số xe sau khi qua
tìm sườn và tạo đường biên. Có 12 đường biên được tạo ra, và chúng sẽ
được sắp xếp theo dạng cây với đỉnh là đường biên c0, tiếp theo là 7
nhánh con từ c1 đến c7. Trong nhánh con c2 lại chứa một nhánh con nữa
là c21, trong nhánh chon c4 chứa 2 nhánh con là c41 và c42, trong nhánh
con c5 chứa một nhánh con c51. Mô hình lư trữ dạng cây của hình trên
được mô tả theo hình vẽ dưới đây:
c0

c1 c2 c3 c4 c5 c6 c7

c21 c41 c42 c51

Hình 5: Mô hình lưu trữ Counters dạng cây

Trong file counters được tạo ra sẽ có các tham số HNext, HPrev,


VNext và VPrev để mô tả dạng cây này. Với HNext (Horizontal Next) để
chỉ các đường viền đồng mức theo chiều ngang, và VNext (Vertical) để
chỉ các đường viền con theo chiều dọc.
Để xác định vùng chứa biển số xe, ta sẽ dựa vào tỉ lệ kích thước
biển số xe và số kí tự chứa trong biển biển số xe. Theo quy định về biển
số xe ở Việt Nam, biển số xe ô tô gồm biển trước và biển sau không
giống nhau, kích thước chiều cao và chiều dài của biển trước là 110 x 470
mm, biển sau là: 200 x 280 mm, đối với xe mô tô là 140 x 190 mm. Vậy
nếu chỉ xét trường hợp nhận diện biển phía sau thì tỉ lệ vùng chứa biển số
phải nằm trong khoảng 1 ÷ 2 ( ~ 1.4). Về số kí tự trong biển số xe là từ 5
đến 8 kí tự bao gồm cả số và chữ. Do đó ta sẽ xác định những đường viền
nào có ít nhất 3 nhánh con mới có thể là vùng chứa biển số xe. Kết hợp 2
điều kiện này lại ta sẽ tìm được vùng chứa biển số xe với độ chính xác
khá cao.
counters != Null

child = counters.VNext

count = 0

counters = counters.VNext
child = child.HNext

count ++

child = Null

count != 0 &
counters.Area >100 counters = counters.Hnext

count >= 3

box = counters.GetMinAreaRect()

whRatio = box.Width / box.Height

1 < whRatio < 2

box

You might also like