Tất cả hình ảnh của mắt sẽ được một camera siêu nhỏ được đặt bên trong mắt kính thu nhận và truyền đến một chương trình xử lý được tích hợp trên máy tính mini Raspberry Pi B+.. Cô
Trang 1Cuộc thi khoa học kỹ thuật cấp Quốc gia dành cho
học sinhtrung học năm
Đơn vị dự thi: Trường THPT chuyên Lê Hồng Phong
Tên đề tài THIẾT BỊ CẢNH BÁO BUỒN NGỦ TỰ ĐỘNG THÔNG QUA TRẠNG THÁI CỦA MẮT DÀNH CHO
NGƯỜI THAM GIA GIAO THÔNG
Lĩnh vực dự thi
KT điện – Cơ khí
Đề tài số: 12 Tác giả
LỜI CẢM ƠN 4
Trang 2MỤC LỤC
Phần 1: TÓM TẮT NỘI DUNG DỰ ÁN 5
Phần 2: GIỚI THIỆU TỔNG QUAN VỀ VẤN ĐỀ NGHIÊN CỨU 6
1 Giới thiệu tổng quan về vấn đề nghiên cứu 6
2 Ý nghĩa nghiên cứu 8
Phần 3: GIẢ THUYẾT KHOA HỌC VÀ MỤC ĐÍCH NGHIÊN CỨU 9
I Giả thuyết khoa học 9
1 Tổng quan về cấu tạo mắt và hiện tượng 9
2 Tổng quan về ngôn ngữ lập trình Python 15
3 Tổng quan về thư viện OpenCV 17
4 Raspberry Pi B+ 20
II Mục đích nghiên cứu 23
Phần 4: PHƯƠNG PHÁP NGHIÊN CỨU 24
I Kế hoạch nghiên cứu 24
II Chi tiết về quá trình nghiên cứu 24
1 Ngôn ngữ lập trình 24
2 Tìm hiểu và chọn lọc câu lệnh của OpenCV 25
3 Nghiên cứu về camera 29
4 Cài đặt và khởi động Raspberry Pi 31
III Tiến hành thử nghiệm 35
Phần 5: KẾT QUẢ VÀ THẢO LUẬN 45
I Kết quả nghiên cứu 45
1 Chương trình 45
2 Mắt kính 54
II Thảo luận 57
Phần 6: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 59
Phần 7: TÀI LIỆU THAM KHẢO 60
Trang 3DANH MỤC HÌNH ẢNH
Hình 1: Cấu tạo mắt thường của con người 12
Hình 2: Cơ trực 13
Hình 3: Tròng đen khi mắt mở 14
Hình 4: Khi nhắm mắt, không có sự xuất hiện của tròng đen 14
Hình 5: Guido van Rossum 15
Hình 6: Khối lệnh trong C++ 16
Hình 7: Khối lệnh trong Python 16
Hình 8: OpenCV 1 dựa trên cấu trúc của IplImage 19
Hình 9: OpenCV 2 dựa trên cấu trúc của cv::Mat 19
Hình 10: Eben Upton 20
Hình 11: Hai Model B và B+ 21
Hình 12: Raspberry Pi B+ 23
Hình 13: Không gian màu BGR 26
Hình 14: Không gian màu CMYK 27
Hình 15: Không gian màu HSV 28
Hình 16: Đường tròn biểu diễn màu sắc 28
Hình 17: Camera Colorvis 29
Hình 18: Đèn hồng ngoại 30
Hình 19: Camera hồng ngoại North 30
Hình 20: Màn hình Raspi – config để thiết lập cho RPi ……… 32
Hình 21: Hệ điều hành Raspbian được cài đặt thành công 33
Hình 22: OpenCV được cài đặt thành công trên nền Raspbian 34
Hình 23: Hình ảnh camera nhận được vào ban đên 35
Hình 24: Đoạn code sử dụng thư viện mp3play 36
Hình 25: Lỗi khi dùng thư viện mp3play 37
Hình 26: Đoạn code khi sử dụng thư viên pymedia 38
Hình 27: Lỗi khi dùng thư viện pymedia 39
Trang 4Hình 28: Dòng lệnh để tập tin py tự động 40
Hình 29: RPi báo lỗi không tự động thực thi tập tin py 41
Hình 30: Tự động thành công trên giao diện LXDE 42
Hình 31: Pin Samsung ARUN 3000mAh 43
Hình 32: Pin Samsung ARUN 6000mAh 44
Hình 33: Hình ảnh lúc mắt mở được camera chụp lại ở không gian màu BGR 45
Hình 34: Hình ảnh sau khi được chuyển từ không gian màu BGR sang HSV 45
Hình 35: Hình ảnh lúc mắt nhắm được camera chụp lại ở không gian màu BGR 46
Hình 36: Hình ảnh sau khi được chuyển từ không gian màu BGR sang HSV 46
Hình 37: Đoạn code cơ bản 47
Hình 38: Đoạn code giúp bỏ qua hiện tượng chớp mắt thông thường 48
Hình 39: Đoạn code giúp không còn hạn chế độ phân giải camera 49
Hình 40 : Đoạn code khắc phục những ảnh hưởng của ánh sáng 49
Hình 41 : Đoạn code truyền tín hiệu đến tai nghe để phát ra âm thanh 50
Hình 42 : Đoạn code dừng chương trình 50
Hình 43 : Hình ảnh sau khi được chuyển từ không gian màu BGR sang HSV 51
Hình 44 : Hình ảnh sau khi được chuyển từ không gian màu BGR sang HSV 51
Hình 45 : Tính diện tích điểm ảnh sau khi chuyển không gian màu 52
Hình 46 : Hình ảnh camera nhận được là mắt nhắm 53
Hình 47 : Play sound để báo hiệu nguy hiểm 53
Hình 48 : Mô hình cơ bản của sản phẩm 55
Hình 49 : Sản phẩm hoàn thiện 56
Hình 50 : Thử nghiệm mô hình sản phẩm trên mặt bạn Thảo Linh 56
Trang 5LỜI CẢM ƠN
- Cảm ơn ba mẹ và gia đình đã ủng hộ và động viên trong suốt quá trình nghiên cứu
- Cảm ơn nhà trường đã tạo điều kiện tham gia sân chơi bổ ích
- Cảm ơn thầy, cô đã tận tình chỉ dẫn và giúp đỡ chúng em trong quá trình nghiên cứu
Trang 6Phần 1: TÓM TẮT NỘI DUNG DỰ ÁN
Thiết bị cảnh báo buồn ngủ tự động thông qua trạng thái của mắt dành cho người tham gia giao thông hoạt động dựa trên sự khác nhau cơ bản giữahai hiện tượng nhắm và mở mắt: khi mở, tròng đen của mắt có diện tích lớn hơn khi mắt có xu hướng nhắm Tất cả hình ảnh của mắt sẽ được một camera siêu nhỏ được đặt bên trong mắt kính thu nhận và truyền đến một chương trình xử lý được tích hợp trên máy tính mini Raspberry Pi B+ Nếu hình ảnh nhận được là mắt nhắm, chương trình sẽ gửi thông tin đến tai nghe và báo hiệu nguy hiểm
Câu hỏi nghiên cứu
Làm thế nào để viết nên một chương trình có thể nhận diện được trạng thái của mắt khi rơi vào hiện tượng buồn ngủ và tự động hóa thiết bị?
Công việc đã thực hiện
Bằng cách sử dụng thư viện OpenCV, thư viện Pygame kết hợp với ngôn ngữ lậptrình Python, chương trình đã được viết để nhận diện trạng thái mắt nhắm – mở và đượccải tiến để bỏ qua hiện tượng chớp mắt thông thường của con người, cũng như khắc phụcmột vài nhược điểm về độ phân giải của camera.Thiết bị được thử nghiệm trên mắt người
và cho kết quả khả quan
Trang 7Phần 2: GIỚI THIỆU TỔNG QUAN VỀ
VẤN ĐỀ NGHIÊN CỨU
1 Giới thiệu tổng quan về vấn đề nghiên cứu
Hiện nay, các tai nạn xảy ra do lái xe trong tình trạng bị mệt mỏi và thiếu ngủkhông phải là hiếm Theo thống kê, tại Đức mỗi năm có khoảng 3.000 tai nạn gây ra dongười tham gia giao thông bị mệt mỏi quá sức Tại Mỹ, theo Cơ quan An toàn giao thôngquốc gia (NHTSA), con số này lớn hơn nhiều: mỗi năm có đến 100,000 tai nạn do mệtmỏi khi lái xe, khiến 1,500 người chết mỗi năm Các nhà khoa học ước tính khoảng 10-20% các tai nạn nghiêm trọng xảy ra là do người lái xe ngủ gật Riêng ở Việt Nam, theo
số liệu thống kê của Cục Cảnh sát Giao thông Đường bộ - Đường sắt, số vụ tai nạn giaothông đặc biệt nghiêm trọng do lái xe ngủ gật chiếm tới khoảng 30% tổng số tai nạn
Khi buồn ngủ, về trạng thái sinh lý, các giác quan và phản xạ của người điều khiển
xe sẽ chậm lại, độ tỉnh táo giảm, rất dễ căng thẳng và khả năng xử lý tình huống cũngkém đi Các hiện tượng thường thấy ở một tài xế bị coi là đang ngủ gật gồm nhắm mắtthay vì chớp mắt, đầu lắc lư về phía trước rồi gật gù về phía sau, ánh mắt thường đờ đẫn
và chỉ tập trung hướng về một điểm cố định,
Nguyên nhân của tình trạng buồn ngủ khi lái xe chủ yếu bởi tài xế thiếu ngủ hoặc
do cơ thể mệt mỏi quá sức Theo anh Trương Quốc Khanh (42 tuổi, ngụ tại quận ThủĐức, tài xế đã bỏ nghề) cho biết anh đã nhiều lần suýt gây tai họa cho người đi đường doquá buồn ngủ, sau những lần đó anh quyết định bỏ nghề Anh Trần Quốc Nam - tài xế xecontainer của doanh nghiệp Q.T (quận 2) - hé lộ nguyên nhân: “Nhiều lúc cầm vô lăngnhưng mắt cứ lim dim, muốn chợp mắt một lát nhưng lại sợ ngủ quên, đến giờ cấm lạikhông vào được thành phố, nên dù rất buồn ngủ cũng cố chạy”
Trang 8Theo nhận định của một cán bộ cảnh sát giao thông công an quận 2, trong thờigian qua các đơn vị chức năng liên tục ra quân kiểm tra xe quá khổ, quá tải nên nhiềudoanh nghiệp vận tải cũng thay đổi phương thức nhằm đối phó với cơ quan chức năngnhư cho tài xế nghỉ ban ngày và tăng cường chạy vào ban đêm Tuy nhiên, các tài xếchạy xe tải, xe container tuổi đời còn rất trẻ, ban ngày có thời gian rảnh rỗi họ thường chútâm vào vui chơi, đến tối chỉ tranh thủ chợp mắt vài tiếng rồi phải chạy xe nên thiếu ngủ
là điều tất yếu
Trước thực trạng đó, có không ít nhà khoa học đã tiến hành các nghiên cứu để tìm
ra cách phòng tránh Một nhóm các nhà nghiên cứu đến từ Đại học Trent (Canada) đã đềxuất một giải pháp là tích hợp hệ thống cảm biến đo nhịp tim ngay trên ghế ngồi nhằmphát hiện ra khi nào người lái xe có dấu hiệu buồn ngủ để đưa ra cảnh báo kịp thời (1).Bên cạnh đó, một số các nghiên cứu khác thì hướng đến việc đọc sóng điện não(2) Nhìnchung, hai công trình (1),(2) sẽ đạt đến độ chính xác cao khi can thiệp trực tiếp vào hoạtđộng của tim và não bộ, nhưng phần nào sẽ ảnh hưởng đến sức khỏe của đối tượng sửdụng khi can thiệp trực tiếp như vậy Với nghiên cứu từ công trình (1), hệ thống cảm biến
đo nhịp tim phải phụ thuộc vào loại xe điều khiển cũng như ghế ngồi Để gắn được vàoghế ngồi, hệ thống cảm biến phải nhỏ, gọn, được cảm biến ngay trong nguyên liệu dệtghế để tránh gây cảm giác khó chịu cho người lái xe Ngoài ra, thiết bị phải liên tục đolường nhịp tim của tài xế trong 4 – 6 giờ liền, điều này sẽ ảnh hưởng xấu đến sức khỏecủa những người bị bệnh về tim và huyết áp Còn về nghiên cứu từ công trình (2), để đảmbảo tính chính xác, phương pháp đọc sóng điện não phải được thực hiện bằng cách cấyđiện cực vào não bộ, tuy nhiên cơ năng của điện cực không thể được duy trì, hơn nữa gâytổn hại đến các tổ chức xung quanh Hay thiết bị được lắp đặt bên ngoài có thể tránh tổnthương cơ thể, tuy nhiên do vật liệu cố định điện cực là các chất silicone, không thể kếthợp một cách chặt chẽ với bộ phận đầu, hơn nữa khoảng cách giữa các điện cực chỉ là1cm, vì thế độ nhạy rất thấp
Trang 9Từ những mặt hạn chế của công trình nghiên cứu (1), (2), chúng tôi đã có ý tưởng
là sử dụng camera mini để ghi lại hình ảnh của mắt và kết hợp với thư viện OpenCV, thưviện Pygame trong ngôn ngữ lập trình Python để phát hiện hiện tượng ngủ gật của ngườilái xe Khác với hai công trình nghiên cứu trên, để nhận biết được hiện tượng ngủ gật,chúng tôi đã dùng một đoạn code khá đơn giản bằng việc xác định điểm ảnh và tính diệntích điểm ảnh đó, kết hợp với một camera thu nhận hình ảnh, một tai nghe báo hiệu nguyhiểm và một máy tính mini Raspberry Pi B+ là trung tâm xử lý dữ liệu
Về bố cục, bản báo cáo bao gồm:
Phần 1: TÓM TẮT NỘI DUNG DỰ ÁN
Phần 2: GIỚI THIỆU VÀ TỔNG QUAN VỀ VẤN ĐỀ NGHIÊN CỨU
Phần 3: GIẢ THUYẾT KHOA HỌC VÀ PHÁT BIỂU MỤC ĐÍCH NGHIÊN CỨU.Phần 4: PHƯƠNG PHÁP NGHIÊN CÚU
Phần 5: SỐ LIỆU, KẾT QUẢ NGHIÊN CỨU VÀ THẢO LUẬN
Phần 6: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN
Phần 7: TÀI LIỆU THAM KHẢO
Đề tài được bắt đầu từ tháng 9/2014, tính đến nay đã nghiên cứu được 5 tháng
Trang 102 Ý nghĩa nghiên cứu
- Nếu nghiên cứu thành công, thiết bị sẽ góp phần làm giảm tai nạn giao thông gây ra
do hiện tượng ngủ gật, do sự mệt mỏi quá sức của người lái xe
- Người điều khiển xe sẽ không cần phải dùng những chất kích thích như cà phê, thuốclá… có hại cho sức khỏe khi sử dụng trong thời gian dài
- Thiết bị nhằm mục đích chủ yếu là phát hiện hiện tượng ngủ gật, do đó, thiết bị có thểứng dụng vào mục đích khác như: phát hiện học sinh ngủ gật trong giờ học, đánh giánăng lực của giáo viên…
Trang 11Phần 3: GIẢ THUYẾT KHOA HỌC VÀ
MỤC ĐÍCH NGHIÊN CỨU
I Giả thuyết khoa học
1 Tổng quan về cấu tạo mắt và hiện tượng của mắt khi rơi vào trạng thái ngủ
Mắt gồm có nhãn cầu, thần kinh mắt và những bộ phận phụ thuộc như mí mắt,lông mi, các cơ mắt, các cân mạc, tuyến lệ và các màng tiếp hợp
Nhãn cầu là phần chính yếu nhất, thường được so sánh với chiếc máy ảnh vìđặc tính chính xác quang học của nó
Nhãn cầu gồm 3 lớp màng có tên gọi là:
Màng ngoài gồm củng mạc và phía trước biến đổi thành giác mạc
Màng giữa là màng bồ đào, thân bè và mạch lạc mạc, chứa nhiều mạch máu, phíatrước dày lên thành cơ mi và mống mắt
Màng trong là võng mạc, chứa các tế bào nhận cảm ánh sáng là tế bào gậy và tếbào nón
Chức năng cơ bản của mắt:
Là hệ quang học, thu chụp lấy hình ảnh
Là hệ thống thu nhận và “mã hoá” thông tin cho đại não
Là một cơ quan chức năng, “phục vụ” cho sự sống con người
Trang 12Hình 1: Cấu tạo mắt thường của con người
Trang 13Trong hốc mắt có các bộ phận điều khiển trạng thái nhắm – mở và di chuyển của mắt:
- Cơ vận động nhãn cầu:có 6 cơ vận nhãn gồm 4 cơ thẳng là cơ thẳng trên, thẳngdưới, thẳng trong, thẳng ngoài và 2 cơ chéo là cơ chéo lớn, cơ chéo bé Cơ thẳng trênđưa mắt lên trên, cơ thẳng dưới đưa mắt xuống dưới, cơ thẳng trong đưa mắt vàotrong, cơ thẳng ngoài đưa mắt ra ngoài Cơ chéo lớn đưa mắt xuống dưới, ra ngoài vàxoáy vào trong, cơ chéo bé đưa mắt lên trên, ra ngoài và xoáy ra ngoài
- Các cơ của mi mắt gồm: cơ nâng mi trên: cơ này xuất phát từ các tổ chức xơ ởđỉnh hốc mắt đi hướng ra phía trước, nằm sát trần ổ mắt, khi gần đến đáy hốc mắt thân
cơ toả rộng ra và tận hết bằng một dải gân rộng trong mi mắt; cơ vòng mi: các thớ cơbao quanh khe mi có nhiệm vụ nhắm kín mắt Cơ có hai phần là phần hốc mắt vàphần mi
Hình 2: Cơ trực
Trang 14Như vậy, dựa vào cấu tạo mắt và cơ chế đóng – mở của mi mắt, chương trìnhcủa chúng tôi được viết để phát hiện hiện tượng ngủ gật, tức khi rơi vào trạng tháibuồn ngủ, cơ mi sụp xuống dẫn đến tròng đèn của mắt sẽ hẹp hơn hoặc không thấy so
tỉnh táo
Hình 3: Tròng đen khi mắt mở(Người chụp: Hồng Hạnh)
Hình 4: Khi nhắm mắt, không có sự xuất hiện của tròng đen
(Người chụp: Hồng Hạnh)
Trang 152 Tổng quan về ngôn ngữ lập trình Python
Python là một ngôn ngữ lập trìnhthông dịch do Guido van Rossum(Hình 5) tạo
ra năm 1990 Python được phát triển tại Viện Nghiên cứu Quốc gia về Toán học vàKhoa học Máy tính Hà Lan bởi Guido van Rossum vào những năn 80-90 của thế kỷtrước Hiện nay Python được duy trì và phát triển bởi nhóm phát triển core của việnnày
Trang 16- Từ khóa: Python tăng cường sử dụng từ khóa tiếng Anh, hạn chế các kí hiệu và cấu
trúc cú pháp so với các ngôn ngữ khác Python là một ngôn ngữ phân biệt kiểu chữHOA, chữ thường
- Khối lệnh:Trong các ngôn ngữ khác, khối lệnh thường được đánh dấu bằng cặp kí
hiệu hoặc từ khóa.Ví dụ, trong C/C++, cặp ngoặc nhọn { } được dùng để bao bọcmột khối lệnh Python, trái lại, có một cách rất đặc biệt để tạo khối lệnh, đó là lùi cáccâu lệnh trong khối vào sâu hơn (về bên phải) so với các câu lệnh của khối lệnh mẹ
chứa nó
Hình 6: Khối lệnh trong C++
Hình 7: Khối lệnh trong Python
Trang 17- Nhờ chức năng thông dịch mà trình thông dịch (Interpreter) của Python có thể xử lýlệnh tại thời điểm chạy chương trình (runtime), ta không cần biên dịch chương trìnhtrước khi thực hiện nó.
- Mặc dù Python được xem là ngôn ngữ lập trình dành cho những ai mới làm quen vớiviệc lập trình trên máy tính, nhưng nó hỗ trợ mạnh cho việc phát triển nhiều loại ứngdụng khác nhau, từ các chương trình xử lý văn bản đơn giản đến các ứng dụng web,đến các chương trình game,… Và đây là điều mà Pascal không làm được
- Một trong những điểm mạnh nhất của Python đến từ thư viện chuẩn của nó: Một thưviện lớn, dễ sử dụng có tính tương thích cao và đặc biệt hoạt động đa nền: UNIX,Windows and Macintosh
- Python hỗ trợ chế độ Interactive, nhờ đó mà ta có thể nhập kết quả từ các đầu cuốikhác nhau vào chương trình Python, nhờ đó mà việc test và debug lỗi code trở nênđơn giản hơn
- Python cho phép người lập trình tích hợp (add-on) các mô-đun cấp thấp, các tool tùychọn vào trình thông dịch của nó Điều này giúp cho việc lập trình trên Python trở nêndễ dàng và hiệu quả hơn
3 Tổng quan về thư viện OpenCV
Thị giác máy là một lĩnh vực đã và đang rất phát triển Khái niệm xử lý ảnh vàthị giác máy – Computer Vision có liên quan tới nhiều ngành học và hướng nghiên cứukhác nhau Từ những năm 1970 khi mà năng lực tính toán của máy tính ngày càng trởnên mạnh mẽ hơn, các máy tính lúc này có thể xử lý được những tập dữ liệu lớn như cáchình ảnh, các đoạn phim thì khái niệm về thị giác máy ngày càng được nhắc đến vànghiên cứu nhiều hơn cho tới ngày nay
Thị giác máy bao gồm lý thuyết và các kỹ thuật liên quan nhằm mục đích tạo ramột hệ thống nhân tạo có thể tiếp nhận thông tin từ các hình ảnh thu được hoặc tập dữliệu đa chiều Ngày nay, ứng dụng của thị giác máy đã trở nên rất rộng lớn và đa dạng, hỗ
Trang 18trợ mọi lĩnh vực từ quân sự ( hệ thống tích hợp quang hồng ngoại có khả năng điều khiểntự động dàn hỏa lực…), an ninh ( hệ thống camera nhận dạng khuôn mặt, vân tay tựđộng…), hàng không vũ trụ ( hệ thống ống kính chụp ảnh viễn thám lắp trên các vệ tinh),cho đến y học (kính hiển vi tự động nhận dạng các tế bào với độ chính xác cao)…
Một trong những công cụ hỗ trợ về thị giác máy cũng như phân tích hình ảnhchuyên nghiệp và mạnh mẽ là OpenCV OpenCV (Open Computer Vision library) là mộtthư viện
mã nguồn mở do Intel phát triển, được giới thiệu năm 1999 và hoàn thiện thành phiênbản 1.0 năm 2006 Thư viện OpenCV gồm khoảng hơn 500 hàm và hơn 2500 các thuậttoán đã được tối ưu về xử lý ảnh, và các vấn đề liên quan tới thị giác máy và tương thíchvới các hệ điều hành Windows, Linux, Mac OS Trước OpenCV không có một công cụchuẩn nào cho lĩnh vực xử lý hình ảnh Các đoạn code đơn lẻ do các nhà nghiên cứu tựviết thường không thống nhất và không ổn định Các bộ công cụ thương mại như Matlab,Simulink, Halcon,v.v… lại có giá cao chỉ thích hợp cho các công ty phát triển các ứngdụng lớn
OpenCV là công cụ hữu ích cho những người bước đầu làm quen với xử lý ảnh số
vì các ưu điểm sau:
- OpenCV là công cụ chuyên dụng: Được Intel phát triển theo hướng tối ưu hóacho các ứng dụng xử lí và phân tích ảnh, với cấu trúc dữ liệu hợp lí
- OpenCV là công cụ mã nguồn mở: Không chỉ là công cụ miễn phí, việc đượcxây dựng trên mã nguồn mở giúp OpenCV trở thành công cụ thích hợpchonghiên cứu và phát triển, với khả năng thay đổi và mở rộng các mô hình,thuật toán
Dự án về OpenCV được khởi động từ những năm 1999, đến năm 2000 nó được
giới thiệu trong một Hội nghị của IEEE về các vấn đề trong thị giác máy và nhận dạng,
tuy nhiên bản OpenCV 1.0 mãi tới tận năm 2006 mới chính thức được công bố và năm
Trang 192008 phiên bản 1.1 (pre-release) mới được ra đời Tháng 10 năm 2009, bản OpenCV thế
hệ thứ hai ra đời (thường gọi là phiên bản 2.x) Cho tới nay, trải qua hơn 6 năm từ lúcphiên bản OpenCV đầu tiên được công bố, đã có lần lượt nhiều phiên bản OpenCV rađời, tuy nhiên có thể chia thư viện này thành hai bản chính dựa trên những đặc điểm khácbiệt lớn nhất của chúng: phiên bản OpenCV thế hệ thứ nhất (hay còn gọi là phiên bảnOpenCV 1.x) và phiên bản OpenCV thứ hai (hay còn gọi là phiên bản OpenCV 2.x):
- OpenCV 1.x là cấu trúc của một ảnh số dựa trên cấu trúc của IplImage, trong khi
thư viện OpenCV 2.xdựa vào cấu trúc của ảnh số, ma trận dựa trên cấu trúc của cv::Mat
Hình 8: OpenCV 1.x dựa trên cấu trúc của IplImage
Hình 9: OpenCV 2.x dựa trên cấu trúc của cv::Mat
- Trong OpenCV 1.x người sử dụng phải hoàn toàn quản lý bộ nhớ của các
đối tượng, nghĩa là khi một đối tượng mới được tạo ra, ta phải luôn chú ý để giải
Trang 20phóng nó khi không còn sử dụng nữa trong khi thư viện OpenCV 2.x việc quản lýbộ nhớ trở nên dễ dàng hơn nhờ các hàm hủy các các lớp đối tượng trong OpenCV2.x đã thực hiện điều này khi một đối tượng không còn được sử dụng nữa.
4 Raspberry Pi B+
Raspberry Pi là một máy tính mini có kích thước chỉ bằng một thẻ tín dụng, đượcphát triển bởi Raspberry Pi Foundation (Anh Quốc) với mục đích thúc đẩy việc giảng dạykhoa học máy tính trong trường học [12] Raspberry Pi (RPi) được sáng lập bởi EbenUpton (Hình 10) - là giám đốc điều hành của Raspberry Pi Foundation, là người chịutrách nhiệm về toàn bộ phần mềm và kiến trúc phần cứng của RPi Vào năm 2008, EbenUpton vào làm việc tại Broadcom với vai trò thiết kế chip Công việc này giúp ông cónhiều điều kiện tốt hơn để phát triển Raspberry Pi Ông đã sử dụng các linh kiện và chipđiện tử có hiệu năng cao (nhưng giá thành rẻ gấp nhiều lần ngoài thị trường) ở chính công
ty ông làm việc để hoàn thiện sản phẩm của mình Ông cùng các cộng tác của mình cũngchọn Linux sẽ là hệ điều hành cho Raspberry Pi bởi đặc điểm đòi hỏi cấu hình PC thấp,
“nguồn mở” và quan trọng nhất là nó có “tính lập trình” cao hơn so với Windows Vớinhững nỗ lực của Eben Upton và đồng nghiệp, đến năm 2011, Raspberry Pi Model B,phiên bản hoàn thiện của Raspberry Pi, đã chính thức được tung ra thị trường
Trang 21Hình 10: Eben Upton
Tính đến thời điểm này, trên thị trường đã có 4 Model RPi, mới nhất là Model RPiB+ được Raspberry Pi Foundation công bố vào ngày 14/7/2014 vừa qua với rất nhiều cảitiến về phần cứng Model B+ chính là phiên bản nâng cấp của Model B trước kia với việctăng thêm 2 cổng USB (tổng thành 4 cổng), số chân GPIO là 40 thay vì 26, tích hợpcổng cổng RCA vào cổng Audio 3.5 đồng thời giảm điện năng tiêu thụ
Hình 11: Hai Model B và B+
(Nguồn: [11])
Chính những cải tiến về cấu hình, đặc biệt là việc nâng cấp cổng USB từ 2 lên 4,chúng tôi đã chọn RPi Model B+ để hoàn thiện đề tài và hướng đến tự động hóa thiết bị.Hiện tại, thiết bị vẫn phải hoạt động phụ thuộc vào laptop, nhưng vì laptop quá to và cồngkềnh nên chúng tôi cần dùng đến máy tính mini RPi, (tuy nhỏ nhưng lại có cấu hình khámạnh không thua gì một laptop) làm trung tâm xử lí dữ liệu và thiết bị sẽ không còn phụthuộc vào laptop.Cấu hình của RPi Model B+ như sau [11]:
Chip: Broadcom BCM2835 SoC
Core architecture: ARM11
CPU: 700 MHz ARM1176JZFS
Trang 22 GPU: Dual Core VideoCore IV® Multimedia Co-Processor Hỗ trợ Open
GL ES 2.0, tăng tốc phần cứng OpenVG, và bộ giải mã
Camera: Connector 15-pin MIPI Camera Serial Interface (CSI-2)
Display: Connector Display Serial Interface (DSI)
Memory Card Slot: MicroSD
Trang 23Hình 12: Raspberry Pi B+
(Người chụp: Hồng Hạnh)
II Mục đích nghiên cứu
- Viết được chương trình nhận diện trạng thái nhắm – mở của mắt
- Thiết bị hoạt động độc lập, ổn định, độ chính xác cao
- Giá thành phù hợp với người dân lao động phổ thông
Trang 24Phần 4: PHƯƠNG PHÁP NGHIÊN CỨU
I Kế hoạch nghiên cứu
- Lựa chọn ngôn ngữ cho phù hợp với dự án
- Tìm hiểu về cấu tạo mắt, về cơ sở lý thuyết để phát hiện hiện tượng ngủ gật thông quatrạng thái của mắt
- Tìm hiểu về các thuật toán xác định điểm ảnh, cũng như các không gian màu
- Sau khi tìm hiểu, viết đoạn mã để nhận diện hai trạng thái nhắm và mở mắt
- Tìm hiểu về các loại camera mini và tích hợp lên mắt kính
- Tìm hiểu Pygame Modules và tiến hành viết đoạn code play sound
- Tìm hiểu về Raspberry Pi và hướng đến tự động hóa thiết bị
II Chi tiết về quá trình nghiên cứu
1 Ngôn ngữ lập trình
Qua quá trình nghiên cứu, chúng tôi đã lựa chọn Python làm ngôn ngữ lập trình đểphát triển phần mềm nhận diện trạng thái nhắm – mở của mắt Chúng tôi chọn Python màkhông phải C++, Pascal hay nhưng ngôn ngữ lập trình khác vì những lí do sau:
Pascal: Đây có lẽ là một ngôn ngữ lập trình rất đỗi quen thuộc, và được
chọn làm ngôn ngữ lập trình để giảng dạy trong trường học Nói đếnPascal, chúng ta không thể chối bỏ rằng đây là một ngôn ngữ rất dễ hiểu,dễ đọc và dễ sử dụng Tuy nhiên, điều đầu tiên mà chúng tôi cần ở ngônngữ lập trình là phải hỗ trợ thư viện OpenCV ( vì OpenCV là một thư việnđồ họa rất phổ biến, chuyên xử lí hình ảnh và những vấn đề liên quan đếnthị giác máy tính), nhưng Pascal lại không đáp ứng được chúng tôi
Trang 25 C++: Đây là một ngôn ngữ lập trình mạnh mẽ, là một dạng ngôn ngữ đa
mẫu hình tự do có kiểu tĩnh và hỗ trợ lập trình thủ tục, dữ liệu trừu trượng,lập trình hướng đối tượng, và lập trình đa hình Sau quá trình nghiên cứu
và học về C++, chúng tôi lại gặp một vài khó khăn trong khi lập trình: cáccâu lệnh trong C++ khó sử dụng, thường không sử dụng từ khóa TiếngAnh, mà đó là từ khóa riêng, có nhiều kí hiệu và cú pháp khá rắc rối
Python: Như đã giới thiệu ở trên, Python là một ngôn ngữ dễ học cho bất
kì ai muốn bắt đầu lập trình với mã nguồn dễ đọc, bố cục trực quan, dễhiểu, và đặc biệt là tăng cường sử dụng từ khóa tiếng Anh, hạn chế các kíhiệu và cấu trúc cú pháp so với các ngôn ngữ khác Ngoài ra, tốc độ thựcthi của Python cực kỳ nhanh và Python có thể tạo ra những chương trìnhchạy từ những script rất nhỏ cho đến những chương trình lớn vô cùngmạnh mẽ
Đó là lí do chúng tôi chọn Python làm ngôn ngữ lập trình để phát triển chươngtrình
2 Tìm hiểu và chọn lọc câu lệnh của OpenCV phù hợp với yêu cầu dự án
a Một vài câu lệnh trong OpenCV
Boundaries: xác định không gian màu BGR, với 2 giá trị: lower và upper
np.array: chuyển đổi các lower limits và upper limits được quy định bởi boundaries
cv2.inRange: phát hiện màu sắc đã được quy định bởi boundaries trong hình ảnh, đồng thời quy định độ phân giải của hình ảnh đó
cv2.bitwise_and: hiển thị các điểm ảnh trắng được quy định trong cv2.inRange
cv2.countNonZero: tính diện tích điểm ảnh trắng
Trang 26b Không gian màu
Chương trình chúng tôi báo hiệu hiện tượng buồn ngủ dựa vào sự thay đổi màusắc, tức dựa vào hai gam màu trắng – đen, do đó khi nghiên cứu về OpenCV, điều đầutiên chúng tôi quan tâm chính là không gian màu
Không gian màu là một mô hình toán học dùng để mô tả các màu sắc trong thực tếđược biểu diễn dưới dạng số học Trên thực tế có rất nhiều không gian màu khác nhau,tuy nhiên có 3 không gian màu cơ bản: BGR, HSV và CMYK:
trong đồ họa máy tính và nhiều thiết bị kĩ thuật số khác Ý tưởng chính củakhông gian màu này là sự kết hợp của 3 màu sắc cơ bản: màu đỏ (R, Red),xanh lơ (G, Green) và xanh lam (B, Blue) để mô tả tất cả các màu sắc khác
Ví dụ: màu đen là sự kết hợp của các kênh màu (R, G, B)với giá trị tươngứng đã được mặc định (0, 0, 0) màu trắng có giá trị (255,255, 255), màu vàng
có giá trị (255, 255, 0), màu tím đậm có giá trị (64, 0, 128)…
Hình 13: Không gian màu BGR
Trang 27 Không gian màu CMYK: là không gian màu được sử dụng phổ
biến trong ngành công nghiệp in ấn.Ý tưởng cơ bản của hệ không gian này là
dùng 4 màu sắc cơ bản để phục vụ cho việc pha trộn mực in: C = Cyan: xanh
lam, M = Magenta: hồng sẫm, Y = Yellow: vàng và K = Black: đen Nguyên
lý này khác với nguyên lý làm việc của hệ màu CMYK khác với BGR: hệ
BGR là sự kết hợp của các thành phần màu, còn hệ CMYK là sự loại bỏ lẫn
nhau của các thành phần màu
Hình 14: Không gian màu CMYK
việc chỉnh sửa ảnh, phân tích ảnh và một phần của lĩnh vực thị giác máy tính
Hệ không gian này dựa vào 3 thông số sau để mô tả màu sắc H = Hue: màu
sắc, S = Saturation: độ đậm đặc, sự bảo hòa, V = value: giá trị cường độ
sáng
Trang 28Hình 15: Không gian màu HSV
Hình 16: Hình tròn biểu diễn màu sắc (HUE)
c Pygame Modules
Pygame là một tập hợp của các mô-đun Python được thiết kế để viết các trò chơi
video Chúng tôi dùng pygame để play sound báo hiệu nguy hiểm Một số câu lệnh dùng
trong đoạn mã:
pygame.init(): khởi tạo các gói trong pygame
pygame.font: tải và vẽ font chữ
pygame.mixer: tải và play sound
pygame.font.Font: tạo ra đối tượng font mới với kích thước nhất định
font.render: hiển thị chữ
text.get_rect: vẽ khung hiển thị
Trang 29 pygame.mixer.Sound: play sound
3 Nghiên cứu về camera
Phải chọn những camera có sẵn đèn Led để đảm bảo camera ghi nhận hình tốt
trong môi trường thiếu ánh sáng Hiện tại dùng webcam Colorvis CVC 2005:
Trang 30Do đèn Led dùng cho camera Colorvis sẽ gây ảnh hưởng đến mắt cho đối tượng khi
sử dụng trong thời gian dài Vì thế, chúng tôi hướng đến dùng đèn hồng ngoại (Hình 18)
thay cho đèn có sẵn trên camera hoặc sử dụng camera hồng ngoại (Hình 19)
Hình 18: Đèn hồng ngoại
Hình 19: Camera hồng ngoại North
Trang 314 Cài đặt và khởi động Raspberry Pi
Cài đặt hệ điều hành Raspian cho Raspberry Pi:
- Raspbian là một hệ điều hành miễn phí dựa trên nền tảng Debian, được tối ưu hóa
cho phần cứng của RPi Wheezy được cài sẵn LXDE, Midori, một vài chương trình dành
cho lập trình viên và nhà phát triển Raspberry Pi có thể cài đặt bởi nhiều hệ điều hành
như: Raspbian Wheezy, Pidora, Openelec, Raspbmc, Risc Os… Tuy nhiên, chúng tôi
chọn Raspbian Wheezy làm hệ điều hành cho RPi, vì nó thích hợp cho người mới học lập
trình và nghiên cứ về RPi
- Cách cài đặt:
Để cài đặt hệ điều hành cho Raspberry Pi, cần phải có thẻ nhớ SD card từ 8GB
trở lên
Tải SD Formatter 4.0 để format thẻ nhớ ở trang web [9]
Tải hệ điều hành từ trang chủ chính thức của RPi [10] Bắt buộc mọi hệ điều
hành của RPi phải được tải ở trang web [10], vì nếu tải ở những trang web khác
RPi sẽ không nhận
Sau khi tải hệ điều hành về máy, giải nén file và copy tất cả vào thẻ nhớ
Cắm bàn phím, chuột (nếu không phải là bàn phím và chuột USB thì có thể
dùng dây USB to PS/2), màn hình (dùng dây HDMI to VGA để hỗ trợ và chúng
tôi dùng màn hình Samsung)
Cắm nguồn vào RPi, nên chọn dây nguồn output 5V-1A
Sauk hi RPi đọc xong thẻ nhớ, sẽ có một cửa sổ xuất hiện với các danh sách hệ
điều hành, chọn 1 hệ điều hành muốn cài Ở đây chúng tôi chọn Raspbian
Trang 32 Chờ RPi cài đặt – quá trình có thể mất hơn 20 phút, tùy theo tốc độ của thẻ nhớ
Hình 20: Màn hình Raspi – config để thiết lập cho RPi trong lần khởi động đầu tiên.
Sau khi cài đặt xong hệ điều hành Raspbian từ thẻ nhớ, chờ RPi khởi động lại và
bắt đầu thực hiện cài đặt một vài cấu hình cho RPi (Hình 20):
màn hình có độ phân giải khác nhau thì Raspberry sẽ tự động căn chỉnh cho phù hợp
có mật khẩu là raspberry, với tên đăng nhập là: pi
Trang 33 Memory _split: bộ nhớ Raspberry Pi được chia sẻ cho CPU và
GPU Một số chương trình đòi hỏi bộ nhớ cho GPU cao hơn, ví dụ
như Game, tuỳ chọn này giúp phân chia lại bộ nhớ cho CPU và
GPU
qua SSH
những lần khởi động sau đó
này, kit cần có kết nối Internet
Hình 21: Hệ điều hành Raspbian được cài đặt thành công trên RPi
Trang 34 Tìm hiểu về cách cài đặt OpenCV cho Python trên nền Raspbian Các câu lệnh để
cài đặt:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get -y install build-essential cmake cmake-curses-gui pkg-config
libpng12-0 libpng12-dev libpng++-dev libpng3 libpnglite-dev zlib1g-dbg
zlib1g zlib1g-dev pngtools libtiff4-dev libtiff4 libtiffxx0c2 libtiff-tools
libeigen3-dev
sudo apt-get -y install libjpeg8 libjpeg8-dev libjpeg8-dbg libjpeg-progs
ffmpeg libavcodec-dev libavcodec53 libavformat53 libavformat-dev
libgstreamer0.10-0-dbg libgstreamer0.10-0 libgstreamer0.10-dev
libxine1-ffmpeg libxine-dev libxine1-bin libunicap2 libunicap2-dev swig libv4l-0
libv4l-dev python-numpy libpython2.6 python-dev python2.6-dev
libgtk2.0-dev
git clone https://github.com/Itseez/opencv.git
sudo apt-get install python-opencv
Hình 22: OpenCV được cài đặt thành công trên nền Raspbian
Trang 35 Sau khi cài đặt xong hệ điều hành cũng như OpenCV cho RPi, chúng tôi sẽ thử
nghiệm đoạn code trên RPi, từ đó sẽ tiếp tục nghiên cứu để cho RPi tự động chạy
đoạn code khi có đủ nguồn điện cung cấp
III Tiến hành thử nghiệm
Thử nghiệm 1: Thử nghiệm đoạn code trong nhiều môi trường khác nhau:
Trong môi trường tiêu chuẩn ( trong phòng): camera không cần phải mở đèn LED,
đoạn code thực thi ổn định, cho kết quả khả quan
Trong môi trường thiếu ánh sáng (vào ban đêm): đoạn code hoàn toàn không thực
thi được, do vào ban đêm không đủ ánh sáng cho camera ghi nhận hình ảnh, dẫn
đến viêc hình ảnh nhận được rất mờ và ảnh hưởng đến quá trình chuyển đổi không
gian màu (Hình 23)
Hình 23: Hình ảnh camera nhận được vào ban đêm