Professional Documents
Culture Documents
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ận diện kí tự
(Tessnet 2)
Kí tự và số trong
biển số xe
Biển số xe , tỉnh/
thành phố
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
Tìm sườn
Tạo đường
biên
Tìm biển số xe
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
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()
box