TRƯỜNG ĐẠI HỌC CẦN THƠ
KHOA CÔNG NGHỆ TT VÀ TT
BỘ MÔN TIN HỌC ỨNG DỤNG
LUẬN VĂN TỐT NGHIỆP ĐẠI HỌC
NGHIÊN CỨU THƯ VIỆN OPENCV
ỨNG DỤNG TRONG VIỆC NHẬN DẠNG
BIỂN BÁO GIAO THÔNG
Sinh viên thực hiện:
Nguyễn Thái Hưng
MSSV: 1111525
Cán bộ hướng dẫn:
Ths. Nguyễn Đức Khoa
Cần Thơ, 06/2015
TRƯỜNG ĐẠI HỌC CẦN THƠ
KHOA CÔNG NGHỆ TT VÀ TT
BỘ MÔN TIN HỌC ỨNG DỤNG
LUẬN VĂN TỐT NGHIỆP ĐẠI HỌC
NGHIÊN CỨU THƯ VIỆN OPENCV
ỨNG DỤNG TRONG VIỆC NHẬN DẠNG
BIỂN BÁO GIAO THÔNG
Sinh viên thực hiện:
Nguyễn Thái Hưng
MSSV: 1111525
Cán bộ hướng dẫn:
Ths. Nguyễn Đức Khoa
Cán bộ phản biện:
Ths. Nguyễn Thị Thuỳ Linh
Ks. Hoàng Minh Trí
Luận văn được bảo vệ tại: Hội đồng chấm luận văn tốt nghiệp Bộ môn Tin
học Ứng dụng, Khoa Công nghệ TT và TT vào ngày 26 tháng 06 năm 2015
Mã số đề tài:
Có thể tìm hiểu luận văn tài:
- Trung tâm học liệu, trường Đại học Cần Thơ
- Website:
Cần Thơ, 06/2015
THƯ CÁM ƠN
Đầu tiên, em xin chân thành cám ơn toàn thể quý thầy cô thuộc bộ môn Tin học Ứng
dụng, khoa Công nghệ thông tin và truyền thông đã giảng dạy và cung cấp các kiến thức nền
tảng cho em trong suốt 4 năm học qua. Tuy các kiến thức đó chưa đủ để làm việc trong môi
trường thực tế, nhưng lượng kiến thức đó vô cùng quý báo, vì đó là nền tảng để tìm hiểu và
nghiên cứu sâu hơn, chi tiết hơn vào các lĩnh vực Công nghệ thông tin; và nhờ những kiến
thức quý báo đó đã giúp em xin được một công việc ổn định trong một Công ty Xuất khẩu
phần mềm hàng đầu của Việt Nam, TMA Solutions.
Tiếp theo, em xin chân thành cám ơn thầy Nguyễn Đức Khoa, thuộc bộ môn Tin học
Ứng dụng, trường Đại học Cần Thơ đã cung cấp cho em đề tài Luận văn: “Nghiên cứu thư
viện OpenCV – Ứng dụng trong việc nhận dạng biển báo giao thông” và tận tình hướng dẫn
đề tài cho em, cũng như trong việc giúp em tìm và đưa ra các hướng giải quyết vấn đề. Tuy
không có nhiều thời gian làm dự án này xuyên suốt với thầy, nhưng nhờ những gợi ý của
thầy mà em có thể thuận lợi giải quyết được các vấn đề trong dự án và hoàn thành tốt được
đề tài Luận văn tốt nghiệp.
Và, em cũng chân thành cám ơn trường Đại học Cần Thơ đã cung cấp cho em một
môi trường học tập với đầy đủ các trang thiết bị và tài liệu học tập và nghiên cứu trong 4
năm học vừa qua.
Cuối cùng em xin chúc trường Đại học Cần Thơ ngày càng phát triển và mở rộng quy
mô, đạt chuẩn chất lượng của khu vực và thế giới, cung cấp đầu ra nguồn nhân lực chất
lượng cao. Và em xin chúc quý thầy cô thuộc Bộ môn Tin học ứng dụng dồi dào sức khoẻ
và thành công trong cuộc sống.
Cần Thơ, ngày 20 tháng 06 năm 2015
Sinh viên
Nguyễn Thái Hưng
i
MỤC LỤC
THƯ CÁM ƠN........................................................................................................................ i
MỤC LỤC............................................................................................................................ iii
DANH MỤC HÌNH...............................................................................................................v
DANH MỤC CÁC CHỮ VIẾT TẮT....................................................................................vi
TÓM TẮT............................................................................................................................ vii
ABSTRACT........................................................................................................................ viii
CHƯƠNG 1: TỔNG QUAN..................................................................................................1
1.1. Đặt vấn đề...................................................................................................................1
1.2. Một số nghiên cứu.......................................................................................................1
1.3. Phạm vi của đề tài.......................................................................................................2
1.4. Phương pháp tiếp cận..................................................................................................2
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT.......................................................................................3
2.1. Thị giác máy tính (Computer vision)...........................................................................3
2.1.1. Ứng dụng.............................................................................................................3
2.1.2. Các nhiệm vụ điển hình........................................................................................3
2.1.3. Các phương pháp.................................................................................................4
2.2. Các khái niệm cơ bản..................................................................................................5
2.3. Thư viện OpenCV.......................................................................................................7
2.3.1. Sử dụng thư viện..................................................................................................8
2.3.2. Các kiểu dữ liệu cơ bản........................................................................................8
2.3.3. Các hàm thao tác với giao diện..........................................................................12
2.3.4. Các hàm vẽ hình cơ bản.....................................................................................19
2.3.5. Các hàm xử lý ảnh.............................................................................................20
2.3.6. Các hàm khác.....................................................................................................23
2.4. Lý thuyết xử lý ảnh và các hàm hỗ trợ bởi OpenCV.................................................26
2.4.1. Smoothing image (Làm trơn hình ảnh)..............................................................26
2.4.2. Edges (cạnh) và Edges detection (phát hiện edges)............................................27
2.4.3. Contours (đường viền) và Find contours (tìm contours)....................................31
2.4.4. Các giải thuật tìm Keypoints và Keypoint descriptors.......................................34
2.4.5. Các giải thuật Feature matching (so khớp đặc trưng).........................................38
2.5. Các loại Biển báo giao thông đường bộ Việt Nam....................................................41
CHƯƠNG 3: NỘI DUNG VÀ KẾT QUẢ NGHIÊN CỨU..................................................43
3.1. Phân tích và thiết kế..................................................................................................43
3.1.1. Đặc trưng của biển báo......................................................................................43
3.1.2. Quy trình phát hiện và nhận dạng biển báo........................................................43
iii
3.1.3. Yếu tố ảnh hưởng đến màu sắc..........................................................................44
3.1.4. Phát hiện biển báo..............................................................................................45
3.1.5. Nhận dạng biển báo............................................................................................45
3.2. Cài đặt....................................................................................................................... 46
3.2.1. Đọc tập biển báo mẫu.........................................................................................46
3.2.2. Áp dụng ngưỡng để phát hiện biên của biển báo................................................46
3.2.3. Loại bỏ biển báo giả...........................................................................................47
3.2.4. Loại bỏ kết quả so khớp không chính xác..........................................................47
3.3. Kết quả...................................................................................................................... 48
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN............................................................................51
TÀI LIỆU THAM KHẢO....................................................................................................53
iv
DANH MỤC HÌNH
Hình 2.1: Độ phân giải của ảnh..............................................................................................5
Hình 2.2: Binary image..........................................................................................................6
Hình 2.3: Grayscale image.....................................................................................................6
Hình 2.4: Color image............................................................................................................6
Hình 2.5: Dãy màu thể hiện ảnh 8-bit = 256 sắc thái (shades)................................................7
Hình 2.6: Kết quả của các hàm vẽ........................................................................................20
Hình 2.7: Kernel cho giải thuật mean filter (bên trái) và structure element với origin nằm ở
trung tâm (bên phải).............................................................................................................26
Hình 2.8: Edges detect object...............................................................................................30
Hình 2.9: Hình ảnh dùng để tìm contours, có các vùng A, B, C,... màu trắng trên nền đen. .31
Hình 2.10: Kết của của việc tìm contours, được thể hiện ở 2 dạng: exterior (đường đứt nét)
và hole (đường chấm)...........................................................................................................31
Hình 2.11: Minh hoạ cách lưu trữ / thể hiện của hệ thống contours tree...............................33
Hình 2.12: Walk sign dectection...........................................................................................34
Hình 2.13: Một số biển báo cấm...........................................................................................42
Hình 2.14: Một số biển báo nguy hiểm.................................................................................42
Hình 2.15: Một số biển báo hiệu lệnh...................................................................................42
Hình 2.16: Một số biển báo chỉ dẩn......................................................................................42
Hình 3.1: Một số biển báo có hình thù cá biệt......................................................................43
Hình 3.2: Quy trình phát hiện và nhận dạng biển báo...........................................................44
Hình 3.3: Không gian màu HSV...........................................................................................44
Hình 3.4: Giá trị Hue của OpenCV.......................................................................................45
Hình 3.5: Quy trình phát hiện biển báo.................................................................................45
Hình 3.6: Quy trình nhận dạng biển báo...............................................................................46
Hình 3.7: Kết quả nhận dạng biển báo nguy hiểm có xe đạp chạy ngang.............................48
Hình 3.8: Kết quả nhận dạng biển báo nguy hiểm đá núi hay lỡ..........................................48
Hình 3.9: Kết quả nhận dạng biển báo phía trước có vạch qua đường..................................49
Hình 3.10: Kết quả nhận dạng biển báo cấm chạy quá 60km/h............................................49
v
DANH MỤC CÁC CHỮ VIẾT TẮT
Chữ viết tắt
Nguyên nghĩa
OpenCV
Open Source Computer Vision Library
BGR
Blue Green Red color space
HSV
Hue Saturation Value color space
2D, 3D
2-, 3-Dimensional
SURF
Speeded Up Robust Features
SIFT
Scale Invariant Feature Transform
ORB
Oriented FAST and Rotated BRIEF
vi
TÓM TẮT
Biển báo giao thông điều khiển người tham gia giao thông, giúp họ nhận biết được các nguy
hiêm có thể thể xãy ra hay các lệnh buộc phải thi hành hoặc các hướng dẫn; nhận dạng được
biển báo giúp người lái xe được an toàn hơn.
Trong đề tài này, tôi đề xuất phương pháp phát hiện biển báo bằng cách áp dụng ngưỡng
dựa trên màu sắc trên không gian màu HSV để xác định viền của biển báo, sau đó sử dụng
Canny edges và tìm đường biên của biển báo và nhận dạng biển báo bằng phương pháp so
khớp đặc trưng là các điểm quan trọng l của ảnh được trích xuất bằng giải thuật ORB
(Oriented FAST and Rotated BRIEF) với tập ảnh biển báo mẫu đã được trích xuất các đặc
trưng tương tự. Các vùng biển báo sau khi phát hiện được xử lý để loại bỏ các vùng biển
báo sai và sau đó được điều chỉnh kích thước phù hợp với kích thước của tập biển báo mẫu,
để cho độ sai lệch không quá cao để cho tăng độ chính xác. Với phương pháp đơn giản này
sẽ giúp cho việc xử lý mất ít thời gian hơn phù hợp với ứng dụng thời gian thực hơn.
Để giả lập môi trường thực tế, tôi đã quay một video trên các đoạn đường có độ chiếu sáng
vào trời có mây âm u với tốc độ thử nghiệm là 40 km/h và ghép lại với nhau để thử nghiệm
hệ thống; ngoài ra tôi còn giả lập bằng cách sử dụng một camera mô phỏng như camera trên
xe hơi hoặc điện thoại và chuẩn bị các biển báo trên giấy mô phỏng các biển báo trên đường
với độ chiếu sáng trong phòng.
Tập biển báo mẫu tôi đã chọn 32 biển báo thường gặp nhất bao gồm biển báo cấm, biển báo
nguy hiểm và biển báo hướng dẫn và với hơn 10 biển báo thử nghiệm. Kết quả xử lý và
nhận dạng khá nhanh đáp ứng được yêu cầu của một hệ thống thời gian thực.
Từ khoá: Nhận dạng biển báo giao thông; Phát hiện biển báo giao thông; Hệ thống hỗ trợ
lái xe; Lập trình xử lý ảnh; Phát hiện viền bằng Canny edges; Thư viện thị giác máy tính
OpenCV; Trích xuất đặc trưng của ảnh; So khớp đặc trưng của ảnh; Phát hiện đối tượng
bằng màu sắc; Giải thuật so khớp ORB, SIFT, SURF.
vii
ABSTRACT
Traffic signs control a driver when drive on road, its help them recognize the dangers maybe
occuring, forced to execute commands or instructions; identify right and quickly traffic
signs help drivers safer.
In this thesis, I propose a method to detect signs by apply color threshold based on HSV
color space to determine border signs, then use Canny edges detector and find contours to
detect region of signs on image (aka candidates), after that recognition signs by method
feature matching ORB (Oriented FAST and Rotated BRIEF), in this method I extract all
keypoints, compute all their descriptors on candidates; also extract and compute on all
traffic signs template and then match candidates with all templates, choose the best match is
traffic sign recognised. Signs have detected must apply post-processing to remove noise and
resize to fit with size of template signs, aims to increase accurate. With this simple method
can helps decrease time to process, good for real-time application.
To simulate the real environment, I was capture a video on roads with illumination cloudy
weather with test speed is 40 km/h and I was create all one video to test system. Beside that,
I also has other simulate the real environment by using a camera as camera on a cars or
mobile devices and some sign has print on paper as signs on road with lighting in the room.
In template signs collection, I have chosed 32 most common signs include warn, prohibition
and guide signs; and over 10 signs to test system. Results processed and identify rapidly
meet the requirements of a real-time application.
Keyword: Traffic Sign Detection; Traffic Sign Recognition; Image Processing
Programming; Canny edges detector; OpenCV library; Feature Maching; Keypoint
Descriptor; Color Detection / Segmentation; Driver Assistance System; Feature matching
with ORB, SIFT, SURF.
viii
CHƯƠNG 1: TỔNG QUAN
1.1. Đặt vấn đề
Hiện nay trên các tuyến đường bộ ở Việt Nam hầu hết đều có đặt các biển báo giao thông,
nhằm thông tin cho người lái xe biết những điều được phép, điều không được phép, các
nguy hiểm có thể xãy ra, các hiệu lệnh phải thi hành hay các hướng dẫn giúp cho người
tham gia giao thông lái xe được an toàn hơn.
Nhưng khi tham gia giao thông người lái xe cần tập trung lái xe để tránh gặp tai nạn giao
thông hoặc khi gặp sự cố người lái xe có thể đối phó kịp thời, do đó việc cứ liên tục quan sát
các biển báo giao thông đặt bên đường có thể khiến cho người lái xe không thể đối phó kịp
thời các sự cố trên đường nếu gặp phải. Ví dụ như khi người lái xe chuẩn bị tới một đoạn
đường bị hư hỏng có nhiều hố sâu (hay còn gọi là ổ gà), đồng thời ở gần đó có đặt một biển
báo “được phép chạy với tốc độ tối đa là 40 km/h”, vì phải quan sát biển báo nên có thể
người lái xe không thấy được các ổ gà, do đó có khẳ năng sẽ gặp tai nạn.
Hoặc có thể vì một lý do nào đó người lái xe không quan sát thấy được biển báo đặt bên
đường. Ví dụ như trên tuyến đường lúc đang lưu thông có quá nhiều xe nên có thể biển báo
bị che khuất tại thời điểm mà khoảng cách từ mắt người lái xe đến vị trí đặt biển báo. Hoặc
có thể là do thị lực của người lái xe không được tốt nên không thể quan sát, nhận biết được
biển báo ở khoảng cách xa,...
Nhận thấy việc quan sát và nhận dạng biển báo để tuân thủ theo các quy định lái xe cần
được thực hiện tự động hoá và thông báo cho người lái xe khi cần thiết. Từ đó, đề tài
“Nghiên cứu thư viện OpenCV – Ứng dụng trong việc nhận dạng biển báo giao thông”
được đề xuất nghiên cứu để áp dụng vào thực tế, nếu thành công sẽ giúp cho người lái xe
(xe gắn máy, xe ô tô) được an toàn hơn khi đi trên đường.
1.2. Một số nghiên cứu
Trên thế giới có nhiều nhà nghiên cứu vấn đề này:
•
“Construction of Cascaded Traffic Sign Detector Using Generative Learning”,
Keisuke Doman và Daisuke Deguchi và Tomokazu Takahashi và Yoshito Mekada và
Ichiro Ide và Hiroshi Murase (2006), Janan
•
“Color Detection and Segmentation for Road and Traffic Signs”, Hasan Fleyeh
(2004), Scotland
•
“Road Signs Detection and Reconstruction using Gielis Curves”, Valentine Vega và
Désiré Sidibé và Yohan Fougerolle (2012), Italy
•
“Traffic sign detection and identification using SURF algorithm and GPGPU”,
1
Dajun Ding và Jihwan Yoon và Chanho Lee (2012), Korea
Nhưng các nghiên cứu thường được áp dụng trong phạm vi biển báo của một số quốc gia, vì
đặt trưng biển báo của các quốc gia là khác nhau.
1.3. Phạm vi của đề tài
Xây dựng một hệ thống thông tin nhận dạng biển báo giao thông từ một đoạn video thực tế
được quay trên các đoạn đường có đặt các biển báo giao thông.
Khi gặp được một biển báo, nhận dạng biển báo trong video là biển báo gì và thông báo ra
màn hình hiển thị (hoặc thông báo bằng hệ thống âm thanh hoặc cả hai).
Trong phạm vi nghiên cứu, hệ thống sẽ nhận dạng các loại biển báo cấm, biển báo nguy
hiểm và biển báo chỉ dẩn phổ biến, thường gặp được đặt trên các tuyến đường ở Việt Nam.
1.4. Phương pháp tiếp cận
Việc phát hiện và nhận dạng biển báo trong video có thể được đơn giản hoá bằng việc phát
hiện và nhận dạng biển báo trong một hình ảnh, vì bản chất của video là sự kết hợp của
nhiều hình ảnh lại với nhau.
Để phát hiện và nhận dạng được biển báo thì cần phải phân tích, xử lý và trích xuất các
thông tin cần thiết trong hình ảnh để phát hiện được có “sự xuất hiện” của biển báo, sau đó
mới tiến hành nhận dạng biển báo đó từ tập dữ liệu chứa các thông tin về biển báo.
Do các biển báo giao thông là đối tượng biết trước, không đổi – là tập tất cả các biển báo có
được vẽ bằng các phần mềm. Do đó, tôi đề xuất sử dụng phương pháp:
•
Phát hiện vùng biển báo bằng dựa trên các đặc trưng của từng loại biển báo
•
Nhận dạng biển báo dựa trên giải thuật so khớp bằng cách tìm các điểm đặc trưng
(keypoints) và trích xuất các điểm lân cận điểm đặc trưng (descriptors)
Các vấn đề phân tích, xử lý và trích xuất đặc trưng trong hình ảnh là một vấn đề của Thị
giác máy tính (Computer visison). Và để không phải tốn nhiều thời gian tìm hiểu và cài đặt
các giải thuật đó thì tôi đề xuất sử dụng thư viện mã nguồn mở OpenCV được hỗ trợ đa nền
tảng (cross-platform) và đa ngôn ngữ (multi-language) như C/C++, Python, Java, Malab,...
Để giải quyết được bài toán đặt ra, cần phải:
2
•
Nghiên cứu các kiến thức về Thị giác máy tính, Xử lý ảnh
•
Cài đặt và tìm hiểu thư viện hàm được cung cấp bởi OpenCV
•
Thu thập các mẫu biển báo giao thông chuẩn ở Việt Nam
•
Tìm hiểu đặc trưng của các loại biển báo giao thông ở Việt Nam
•
Các yếu tố ảnh hưởng đến việc phát hiện và nhận dạng
•
Tìm hiểu các giải thuật so khớp và tìm giải thuật phù hợp nhất
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
2.1. Thị giác máy tính (Computer vision)
Thị giác máy tính là một lĩnh vực gồm các phương pháp thu nhận, phân tích, xử lý và nhận
dạng hình ảnh và dữ liệu đa chiều từ thực tế để cho ra thông tin số (numerical) hoặc biểu
tượng (symbolic) dùng cho các mục đích nhất định.
Ý tưởng được dựa trên thị giác của con người về khả năng nhận dạng và hiểu một hình ảnh.
Để làm được điều đó, thị giác máy tính áp dụng các mô hình xây dựng dựa trên các ngành lý
thuyết học, vật lý, thống kê và hình học.
2.1.1. Ứng dụng
Trong các ứng dụng thị giác máy tính, thường được lập trình để giải quyết một vấn đề cụ
thể, nhưng trên cơ bản các phương pháp đều đều dựa trên sự học (learning) trở nên ngày
càng phổ biến. Ví dụ các ứng dụng thị giác máy tính phục vụ cho:
•
Điều khiển tiến trình (Controlling processes) như rô bốt công nghiệp
•
Điều hướng (Navigation) như xe tự động hay rô bốt di động
•
Phát hiện sự kiện (Detecting events) như đếm số lượng xe trên đường để phát hiện
trình trạng ùn tắc giao thông
•
Mô hình hoá đối tượng hoặc môi trường (Modeling objects or environments) như
phân tích hình ảnh y học hoặc mô hình địa chấn
•
Sự kiểm tra tự động (Automation inspection) như kiể m tra chất lượng sản phẩm
trong các nhà máy, xí nghiệp
2.1.2. Các nhiệm vụ điển hình
Recognition
Sự nhận dạng (recognition) là xự xác định trong tập dữ liệu hình ảnh có chứa đối tượng
(object), đặt trưng (feature) đang xem xét hay không. Recognition là một vấn đề kinh điển
của thị giác máy tính, xử lý ảnh (image processing). Các vấn đề nhận dạng như:
•
Object recognition (hay còn gọi là object classification) – Tìm và nhận dạng các đối
tượng trong hình ảnh hoặc video.
•
Identification (Xác định duy nhất) – Từng thể hiện của đối tượng được nhận dạng
như là một đối tượng duy nhất trong tập hợp đối tượng. Ví dụ: nhận dạng khuôn mặt,
nhận dạng dấu vân tay (fingerprint) hay nhận dạng chữ viết tay.
•
Dectection (Phát hiện) – Phát hiện một đối tượng quan tâm. Ví dụ: phát hiện các tế
bào lạ trong ảnh y học hay phát hiện xe cộ đi qua hệ thống thu phí tự động.
3
Motion analysis
Phân tích chuyển động trên một chuỗi hình ảnh là một xử lý để có được vận tốc ước lượng
của mỗi điểm trên chuỗi hình ảnh hoặc cảnh 3 chiều.
Scene reconstruction
Mục đích xây dựng một mô hình 3 chiều từ một hoặc nhiều hình ảnh của một quang cảnh
hoặc video.
Image restoration
Mục đích của phục hồi hình ảnh là loại bỏ các thành phần gây nhiễu. Phương pháp đơn giản
nhất là có thể dùng các bộ lọc (filter) như median filter, Gaussian filter hay các bộ lọc cơ
bản khác.
2.1.3. Các phương pháp
Image acquisition
Thu nhận hình ảnh từ một vài thiết bị như máy chụp hình, máy chụp x-quang, ra đa, kính
hiển vi hiện đại, máy quét,... Tuỳ vào từng thiết bị mà kết quả có thể tạo ra ảnh 2 chiều, 3
chiều hoặc một chuỗi các hình ảnh.
Pre-processing
Tiền xử lý là bước làm trước khi áp dụng các phương pháp của thị giác máy tính lên các
hình ảnh để trích xuất ra một phần cụ thể của thông tin và cũng nhằm đảm bảo nó đáp ứng
một số giả định của phương pháp. Ví dụ như:
•
Lấy mẫu lại để đảm bảo sự chính xác của hệ thống toạ độ.
•
Giảm nhiễu để đảm bảo không bị sai lệnh thông gây ra bởi cảm biến.
•
Tăng cường độ tương phản để đảm bảo các thông tin thích hợp được phát hiện.
Feature extraction
Trích xuất các đặc trưng cơ bản như:
•
Đường (line), viền (egde), đỉnh (ridge).
•
Góc (coner), đốm màu (blob), điểm (point).
•
Cấu trúc (texture), hình thù (shape), chuyển động (motion).
Detection/Segmentation
Quá trình xử lý ảnh để đưa ra một quyết định cần tạo ra dữ liệu cho bước xử lý kế tiếp, như:
4
•
Lựa chọn một tập hợp điểm quan tâm.
•
Tách một hoặc nhiều khu vực nhỏ trên ảnh chứa một đối tượng quan tâm.
High-level processing
Tại bước xử lý nâng cao, dữ liệu đầu vào thường là tập các điểm hoặc một vùng ảnh quan
tâm được tạo ra từ bước xử lý detection/segmentation. Ví dụ như:
•
Xác thực dữ liệu có đáp ứng mô hình và giả định của ứng dụng hay không
•
Nhận dạng hình ảnh – Phân loại các đối tượng phát hiện được thành các loại
•
Đăng ký hình ảnh – So sánh và kết hợp 2 cái nhìn khác nhau của cùng một đối tượng
Decision making
Đưa ra quyết định cho ứng dụng. Ví dụ như:
•
Đạt hoặc không đạt (pass/fail) cho ứng dụng kiểm tra tự động
•
Khớp hoặc không khớp (match/no-match) cho ứng dụng nhận dạng
•
Đưa ra cảnh báo trong các ứng dụng thuộc y học, quân đội, bảo mật và nhận dạng
2.2. Các khái niệm cơ bản
Pixel
Điểm ảnh là đơn vị nhỏ nhất trong hình ảnh kỹ thuật số, mỗi điểm ảnh trên ảnh là một hình
chữ nhật, mỗi điểm ảnh có một giá trị thể hiện cho màu hoặc cường độ sáng ở điểm ảnh đó.
Resolution
Độ phân giải là tổng số điểm ảnh trong một hình ảnh. Nó thường được biểu diễn như một
ma trận 2 chiều m x n, trong đó m là chiều rộng (width/cols) và n là chiều cao (height/rows)
của hình ảnh. Đôi khi độ phân giải còn được biểu diễn bằng tích số của chiều rộng nhân với
chiều cao của hình ảnh.
Độ phân giải ảnh càng cao (càng lớn) thì mức độ chi tiết càng cao, đồng thời thời gian và
hiệu xuất để xử lý cũng tăng làm giảm hiệu suất của hệ thống cần xử lý.
100x100
H
70x70
H
50x50
H
30x30
H
Hình 2.1: Độ phân giải của ảnh
Aspect ratio
Tỷ lệ hình ảnh là tỷ số giữa chiều rộng và chiều cao của hình ảnh. Ví dụ, một ảnh có độ
phân giải là 1600x900 có tỷ lệ là 16:9.
Các tỷ lệ ảnh phổ biển trên màn hình tivi và máy vi tính: 4x3, 16:9, 16:10, 5:4.
5
Binary image
Ảnh nhị phân là hình ảnh mà giá trị của mỗi pixel chỉ có thể là 0 đại diện cho màu đen và 1
(hoặc 255) đại diện cho màu trắng.
Hình 2.2: Binary image
Grayscale image
Ảnh màu xám là hình ảnh mà giá trị của mỗi pixel mang thông tin về cường độ/sắc thái
(intensity/shade) của màu xám.
Cường độ thông tin được lưu trữ bởi kiểu dữ liệu số nguyên 8-bit, do đó có 2 8 = 256 giá trị
khác nhau trải dài từ màu đen đến màu trắng, và thường được gọi là ảnh trắng đen.
Hình 2.3: Grayscale image
Color image
Ảnh màu là hình ảnh mà giá trị của mỗi pixel là sự kết hợp của 3 màu chính gồm xanh lam,
xanh lục, và đỏ. Từ 3 màu chính, có thể kết hợp lại với nhau để tạo ra được hầu hết tất cả
các màu trong tự nhiên.
Một ảnh màu 24-bit có thể tạo ra được 224 = 16 777 216 màu khác nhau (mắt của con người
có thể phân biệt được khoảng 350 000 màu khác nhau). Tuy nhiên trong việc tính toán thì
hình ảnh màu thường không cần thiết và do đó, ảnh màu 24-bit thường được chuyển về ảnh
8-bit để tăng tốc độ tính toán.
Hình 2.4: Color image
6
Depth
Chiều sâu thể hiện số lượng sắc thái (shade) của một màu sắc cụ thể được sử dụng trong sự
tạo thành của một hình ảnh. Khái niệm này được áp dụng trong cả ảnh xám lẫn ảnh màu. Ví
dụ, một hình ảnh 8-bit có 28 = 256 sắc thái trải dài từ đen tới trắng.
Chiều sâu càng lớn sẽ cho số lượng lớn shades để biểu diễn/tạo nên một hình ảnh. Ví dụ:
•
1-bit: 21 = 2 shades (binary image)
•
8-bit: 28 = 256 shades (grayscale image)
•
16-bit: 216 = 65,536 shades (color image)
•
24-bit: 224 = 16,777,216 shades (true color image)
255
0
Hình 2.5: Dãy màu thể hiện ảnh 8-bit = 256 sắc thái (shades)
2.3. Thư viện OpenCV
OpenCV là thư viện cài đặt hàng ngàn giải thuật Thị giác máy tính (Computer Vision) và
Máy học (Machine Learning) được phát hành với giấy phép mã nguồn mở BSD. Thư viện
được viết bằng ngôn ngữ C và C++ và có thể chuyển (porting) để sử dụng như ngôn ngữ
Java, Python, MATLAB,...
Do OpenCV được viết bằng C và C++ nên hỗ trợ đa nền tảng (cross platform) như máy tính
(Windows, Linux, Android, MacOS, FreeBSD, OpenBSD) và di động (Android, Maemo,
iOS) và trên các hệ thống nhúng (Embeded System).
Hiện tại, thư viện có hơn 2500 giải thuật được cài đặt tối ưu. Các giải thuật giải thuật này
dùng để phát hiện và nhận dạng khuôn mặt, đối tượng xác định, phân loại hành động của
con người trong video, theo dõi đối tượng trong camera, trích xuất mô hình 3D của đối
tượng,... OpenCV có một cộng đồng lớn với hơn 47 ngàn người và đạt hơn 7 triệu lượt tải.
Thông tin thêm:
•
Trang chủ:
•
Tài liệu:
OpenCV được chia theo cấu trúc module:
•
core: gồm các kiểu dữ liệu và các hàm cơ bản để sử dụng ở các module khác
•
imgproc: bao gồm các giải thuật phân tích, xử lý ảnh như
◦ Lọc ảnh tuyến tính (linear) và phi tuyến (non-linear).
◦ Chuyển đổi hình học (geomatrical image transformation).
◦ Biểu đồ tần số (histograms).
7
•
highgui: gồm các hàm về giao diện, sử dụng để đọc, ghi, hiển thị hình ảnh và video;
các hàm lắng nghe sự kiện từ chuột và bàn phím,…
•
video: gồm các giải thuật phân tích, xử lý video như
◦ Ước lượng chuyển động (motion estimation)
◦ Trích xuất nền sau (background subtraction)
◦ Theo dõi đối tượng (object tracking)
•
features2d: gồm các hàm dò tìm đặt trưng nổi bật (salient feature detectors), mô tả
(descriptors) và so khớp (descriptor matchers).
•
objdetect: gồm các giải thuật phát hiện đối tượng và các tập dữ liệu để phát hiện một
số đối tượng như khuôn mặt, mắt, miệng, con người, xe hơi,…
•
ml: gồm các giải thuật máy học như mô hình thống kê, hồi quy, phân loại, gom cụm.
Ngoài ra, còn rất nhiều module khác như flann, gpu, photo, stitching, nonfree, contrib,
legacy, ocl, superres, viz. Trong tài liệu này sẽ giới thiệu một số kiểu dữ liệu, hàm, giải thuật
trong các module theo ngôn ngữ C/C++ có sử dụng trong chương trình.
2.3.1. Sử dụng thư viện
Tất cả các lớp (classes) và hàm (functions) của OpenCV được đặt trong cv namespace, vì
thế để sử dụng các functions cần phải ghi rõ cv:: trước class và function hoặc sử dụng
using namespace.
#include "opencv2/opencv.hpp"
int main(int argc, char const* argv[]) {
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
return 0;
}
hoặc
#include "opencv2/opencv.hpp"
using namespace cv;
int main(int argc, char const* argv[]) {
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
return 0;
}
Khi có sự sung đột giữa các class và function của OpenCV với thư viện chuẩn hoặc thư viện
khác, khi đó buộc phải ghi rõ cv::.
2.3.2. Các kiểu dữ liệu cơ bản
Point_
Lớp mẫu (Template class) cho một điểm 2 chiều trong toạ độ Oxy, chứa toạ độ x và y.
8
template<typename _Tp> class Point_ {
public:
//! various constructors
Point_();
Point_(_Tp _x, _Tp _y);
_Tp x, y; //< the point coordinates
};
Do Point_ là tempate, nên OpenCV đặt bí danh (alias) để cho tiện trong việc sử dụng:
typedef
typedef
typedef
typedef
Point_<int> Point2i;
Point2i Point;
Point_<float> Point2f;
Point_<double> Point2d;
Ví dụ 2.1 : Tính khoảng cách giữa 2 điểm trong không gian 2 chiều
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
double dis;
template<typename _T> inline _T sqr(_T const &num) {
return num * num;
}
int main(int argc, char const* argv[]) {
// First way to use
Point pt1(-2, 1);
// Second way to use
Point pt2;
pt2.x = 1; pt2.y = 5;
dis = sqrt(sqr((pt2.x - pt1.x)) + sqr((pt2.y - pt1.y)));
cout << "Distance between 2 points: " << dis << endl;
return 0;
}
Rect_
Template class cho hình chữ nhật 2 chiều, chứa thông tin về toạ độ ( x, y) của điểm ở trên,
bên trái (top – left) và kích thước (width và height) của hình chữ nhật.
template<typename _Tp> class Rect_ {
public:
Rect_();
Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height);
Rect_(const Point_<_Tp> &org, const Size_<_Tp> &sz);
Rect_(const Point_<_Tp> &pt1, const Point_<_Tp> &pt2);
//! the top-left corner
Point_<_Tp> tl() const;
9
//! the bottom-right corner
Point_<_Tp> br() const;
//! size (width, height) of the rectangle
Size_<_Tp> size() const;
//! area (width*height) of the rectangle
_Tp area() const;
//! checks whether the rectangle contains the point
bool contains(const Point_<_Tp> &pt) const;
//< the top-left corner, as well as width and height of the rectangle
_Tp x, y, width, height;
};
Bí danh:
typedef Rect_<int> Rect;
Scalar_
Template class đại diện cho một vector có 4 phần tử.
template<typename _Tp> class Scalar_ : public Vec<_Tp, 4> {
public:
//! various constructors
Scalar_();
Scalar_(_Tp v0, _Tp v1, _Tp v2 = 0, _Tp v3 = 0);
Scalar_(_Tp v0);
//! returns a scalar with all elements set to v0
static Scalar_<_Tp> all(_Tp v0);
// returns true iff v1 == v2 == v3 == 0
bool isReal() const;
};
Các bí danh:
typedef Scalar_<double> Scalar;
Ví dụ 2.2 : Tạo một hằng số chứa thông tin của màu hồng
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
#define PINK_COLOR Scalar(203, 192, 255)
int main(int argc, char const* argv[]) {
cout << "Value 3 channels of Pink color:" << endl;
cout << " - Blue: " << PINK_COLOR.val[0] << endl;
cout << " - Green: " << PINK_COLOR.val[1] << endl;
cout << " - Red: " << PINK_COLOR.val[2] << endl;
return 0;
}
10
Mat
Class thể hiện một ma trận nhiều chiều của một hoặc nhiều kênh; có thể lưu trữ thông tin
cho hình ảnh, biểu đồ tần số, ma trận phức tạp,...
class CV_EXPORTS Mat {
public:
Mat();
//! constructs 2D matrix of the specified size and type (CV_8UC1, CV_64FC3,
CV_32SC(12) etc.)
Mat(int rows, int cols, int type);
//! constucts 2D matrix and fills it with the specified value _s.
Mat(int rows, int cols, int type, const Scalar &s);
//! creates a matrix header for a part of the bigger matrix
Mat(const Mat &m, const Rect &roi);
//! allocates new matrix data unless the matrix already has specified size and
type previous data is unreferenced if needed.
void create(int rows, int cols, int type);
void create(Size size, int type);
int type() const;
int depth() const;
int channels() const;
//! returns true if matrix data is NULL
bool empty() const;
//! the number of rows and columns
int rows, cols;
};
Trong đó,
•
rows
– Số dòng của ma trận
•
cols
– Số cột của ma trận
•
type
– Kiểu ma trận – được biểu thị bởi CV_<depth><U|S|F>C<channel(s)>
◦
depth
và <U|S|F> dựa vào kiểu nguyên thuỷ (primitive type) gồm:
▪ 8-bit unsigned integer (uchar): CV_8U
▪ 8-bit signed integer (schar): CV_8S
▪ 16-bit unsigned integer (ushort): CV_16U
▪ 16-bit signed integer (short): CV_16S
▪ 32-bit signed integer (int): CV_32S
▪ 32-bit floating-point number (float): CV_32F
▪ 64-bit floating-point number (double): CV_64F
◦
channels(s)
– Số kênh của ma trận
▪ Nếu số kênh từ 1 đến 4 có thể sử dụng các hằng số CV_8UC1, … CV_64FC4
11
▪ Nếu nhiều hơn 4 có thể sử dụng các macros:
CV_8UC(n),... CV_64C(n)
hoặc
CV_MAKETYPE(CV_8U, n),... CV_MAKETYPE(CV_64F, n)
•
data
– Dữ liệu của ma trận
Ví dụ 2.3 : Một số cách tạo đối tượng Mat, trong ví dụ tạo một hình ảnh 3 kênh, có kích
thước 500x500 pixels và một vùng nhỏ (Region of Interest – RoI) trong một hình ảnh lớn.
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main(int argc, char const* argv[]) {
Mat image(500, 500, CV_8UC3);
Rect roi(0, 0, 50, 40);
Mat roi(image, roi);
return 0;
}
2.3.3. Các hàm thao tác với giao diện
OpenCV có thể được sử dụng trong các thư viện giao diện (User Interface framework) như
Qt, WinForms, Cocoa,... hoặc không cần giao diện, nhưng đôi khi khi cần hiển thị nhanh kết
quả, OpenCV cài đặt module highgui để phục vụ điều đó:
•
Tạo và điều khiển cửa sổ để hiển thị hình ảnh
•
Thêm thanh theo dõi (trackbar) vào cửa sổ, hay xử lý sự kiện từ chuột và bàn phím
•
Đọc và ghi hình ảnh
•
Đọc video từ camera hoặc file và ghi video
namedWindow
Tạo một cửa sổ để hiển thị như hình ảnh, biểu đồ tần số.
void namedWindow(const string& winname, int flags = WINDOW_AUTOSIZE)
Trong đó,
•
winname
•
flags
– Tên của cửa sổ, được sử dụng như là định danh để nhận biết cho cửa sổ.
– Cờ chỉ định loại cửa sổ:
◦
WINDOW_NORMAL:
người dùng có thể thay đổi được kích thước cửa sổ
◦
WINDOW_AUTOSIZE:
người dùng không thể thay đổi được kích thước cửa sổ, nội
dung hiển thị sẽ được vừa khớp (fit) với cửa sổ
◦
WINDOW_OPENGL:
nếu được được chỉ định, sẽ tạo cửa sổ với OpenGL hỗ trợ
Tạo một cửa sổ để hiển thị hình ảnh và đặt thanh trackbar, nếu tên cửa sổ tạo mới trùng với
12
tên đã có sẳn thì hàm sẽ không làm gì hết.
destroyWindow
Đóng một cửa sổ chỉ định.
void destroyWindow(const string& winname)
Trong đó,
•
winname
– Tên cửa sổ cần đóng được tạo bởi namedWindow
imread
Đọc hình ảnh từ tập tin.
Mat imread(const string& filename, int flags=1)
Trong đó,
•
filename
•
flags
– Tên tập tin cần đọc.
– Cờ chỉ định kiểu màu của hình ảnh được đọc
◦
IMREAD_GRAYSCALE:
◦
IMREAD_COLOR:
(giá trị = 0) đọc ảnh và chuyển ảnh sang ảnh màu xám
(giá trị = 1) đọc và chuyển ảnh sang ảnh 3 kênh màu (thứ tự được
mã hoá là BGR, tương úng với Blue Green Red)
◦
IMREAD_UNCHANGED:
(giá trị =
-1)
trả về hình ảnh được đọc bao gồm cả kênh alpha
(qui định độ trong suốt của hình ảnh – nếu có)
Hàm đọc tập tin hình ảnh (dựa trên phần thông tin header, không dựa vào định dạng) được
chỉ định và trả về kiểu Mat, nếu không thể đọc được hình ảnh (có thể do tập tin không tồn
tại, không có quyền truy cập,...) hàm sẽ trả về ma trận rổng (Mat::data == NULL).
imshow
Hiển thị một hình ảnh trên một cửa sổ chỉ định.
void imshow(const string& winname, InputArray mat);
Trong đó,
•
winname
•
mat
– Tên cửa sổ để hiển thị
– Hình ảnh được hiển thị
Nếu cửa sổ được tạo với cờ WINDOW_AUTOSIZE, hình ảnh được hiển thị với kích thước gốc.
Ngược lại, hình ảnh sẽ được co giản để khớp với kích thước cửa sổ.
waitKey
Đợi cho đến khi nhấn phím bất kỳ.
int waitKey(int delay = 0)
13