BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÀ RỊA VŨNG TÀU

KHOA CÔNG NGHỆ KỸ THUẬT – NÔNG NGHIỆP CÔNG NGHỆ CAO

ĐỒ ÁN TỐT NGHIỆP

Đề tài:

THIẾT KẾ MẠCH CHỐNG TRỘM

Họ và tên GVHD : ThS. Phan Thanh Hoàng Anh

Họ và tên SVTH

: Dương Chí Hùng

Mã Số Sinh Viên

: 16031192

Chuyên Ngành

: Điện Công Nghiệp Và Dân Dụng

Lớp

: DH16DC

Vũng Tàu, tháng 05 năm 2020

MỤC LỤC

CHƯƠNG 1.GIỚI THIỆU VỀ ĐỀ TÀI LUẬN VĂN

1

1.1LỜI MỞ ĐẦU

1

1.2GIỚI THIỆU VỀ XỬ LÝ ẢNH

3

1.2.1Một số khái niệm cơ bản

3

1.2.2Các hình thái của ảnh

4

1.3HỆ THỐNG NHẬN DẠNG KHUÔN MẶT

5

1.3.1Bài toán nhận dạng khuôn mặt

5

1.3.2Những tác động trong việc nhận dạng

5

1.3.3Xây dựng hệ thống nhận dạng

6

CHƯƠNG 2.LÝ THUYẾT CƠ SỞ CỦA BÀI TOÁN

9

2.1LÝ THUYẾT PHÁT HIỆN KHUÔN MẶT NGƯỜI BẰNG ĐẶC TRƯNG HAAR WAVELET-LIKE

9

2.1.1Tiếp cận Haar wavelet-like

9

2.1.2Trích xuất đặc trưng Haar wavelet-like

11

2.2NHẬN DẠNG KHUÔN MẶT NGƯỜI SỬ DỤNG LBPH FACE RECOGNIZER

11

2.2.1Nhận dạng bằng thuật toán PCA

12

2.2.2Nhận dạng bằng thuật toán LDA

13

2.2.3Ứng dụng của thuật toán PCA trong bài toán

13

2.2.4Tính toán và tìm EigenFaces

15

2.2.5Bài toán nhận dạng khuôn mặt bằng các EigenFaces

17

CHƯƠNG 3.SƠ LƯỢC VỀ CÁC LINH KIỆN TRONG ĐỀ TÀI

18

3.1GIỚI THIỆU MẠCH ARDUINO NANO

18

3.1.1Cổng kết nối với Arduino Nano

20

3.1.2Lập trình cho Arduino Nano

20

3.2ĐỘNG CƠ RC SERVO

22

3.3MODULE LM2596

23

3.4BÀN PHÍM

25

CHƯƠNG 4.XÂY DỰNG MÔ HÌNH VÀ PHẦN CỨNG

26

4.1KẾT NỐI VỚI THIẾT BỊ NGOẠI VI

26

4.1.1Arduino NANO

26

4.2LÀM MẠCH

28

4.3MÔ HÌNH THỰC TẾ

29

CHƯƠNG 5.TẠO CHƯƠNG TRÌNH NHẬN DẠNG

31

5.1XÂY DỰNG CHƯƠNG TRÌNH PHÁT HIỆN KHUÔN MẶT

32

CHƯƠNG 6.KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN

40

6.1KẾT LUẬN

40

6.1.1Kết luận 1

40

6.1.2Kết luận 2

40

6.1.3Kết luận 3

40

6.2HƯỚNG PHÁT TRIỂN

40

TÀI LIỆU THAM KHẢO

41

LỜI CẢM ƠN

Tôi xin chân thành cảm ơn ThS. PHAN THANH HOÀNG ANH vì trong

thời gian thực hiện luận văn này, thầy đã hết sức tận tâm giúp đỡ cho tôi lúc tôi

không hiểu vấn đề trong lúc thực hiện luận văn này. Tôi cũng xin cảm ơn gia đình

và bạn bè đã giúp đỡ tôi khi tôi gặp khó khăn.

Tôi xin chân thành cảm ơn!

Vũng Tàu, ngày 28 tháng 05 năm 2020

Sinh viên

DƯƠNG CHÍ HÙNG

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

CHƯƠNG 1. TỔNG QUAN

1.1 Lời mở đầu

Trong thời đại đất nước ngày càng phát triển về mọi mặt, thì cũng nảy sinh

nhiều vấn đề về an ninh và cũng được toàn thế giới rất quan tâm. Theo đó các

bài toán về nhận dạng cũng được quan tâm rất nhiều. Và vấn đề nhận dạng các

bộ phận cơ thể của con người cũng đã có rất nhiều phương pháp đưa ra và có độ

chính xác cao.

Một số bài toán nhận dạng đang rất được quan tâm và phát triển phổ biến ở

toàn thế giới như:

 Nhận dạng bằng vân tay

 Nhận dạng bằng vân mắt

 Nhận dạng bằng bàn tay

 Sử dụng thẻ để lưu giữ thông tin cá nhân …

Và các phương án nhận dạng này cũng đã được áp dụng sau một thời gian

dài phát triển và có được sự chính xác cao. Nhưng các phương pháp này vẫn

còn gặp nhiều hạn chế như sau:

 Đòi hỏi sự tiếp xúc trực tiếp giữa người và hệ thống.

 Với các hệ thống sử dụng thẻ thì yêu cầu phải có thẻ, nếu mất thẻ thì sẽ

không nhận dạng được.

Hiện nay, với sự phát triển về xử lý ảnh thì bài toán đang được quan tâm

nghiên cứu là nhận dạng khuôn mặt (Face Recognition). Khuôn mặt của mỗi

người chúng ta đóng vai trò cực kỳ quan trọng. Với mỗi khuôn mặt chúng ta có

thể xác định được giới tính, chủng tộc, tuổi tác, trạng thái cảm xúc và đặc biệt là

có thể xác định mối quan hệ giữa mỗi người (bạn bè, ba mẹ, anh chị em …). Vì

vậy bài toán nhận dạng khuôn mặt được đặt ra có thể giải quyết được nhiều vấn

đề như điểm danh, quản lý nhân viên … và đặc biệt sẽ mang lại thêm nhiều giải

pháp kiểm soát an ninh phù hợp với từng môi trường sử dụng.

6

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Và thực tế thì công nghệ nhận dạng khuôn mặt cũng đang được ứng dụng và

phát triển bởi các công ty lớn trên thế giới như Apple, Samsung, Google. Ví dụ

điển hình như trên những chiếc điện thoại thông minh mới nhất của hãng điện

thoại Samsung là S8 hay Iphone X của hãng Apple đều có khả năng sử dụng

khuôn mặt của chủ nhân để mở khóa màn hình.

Với bài toán nhận diện khuôn mặt thì có rất nhiều bài toán nhỏ khác nhau

như:

 Nhận dạng dựa trên các đặc trưng của các phần tử trên khuôn mặt

(Feature based face recognition).

 Nhận dạng dựa trên xét tổng thể khuôn mặt (Appearance based face

recognition).

 Nhận dạng 2D và 3D

Với phương pháp nhận dạng dựa trên các đặc trưng khuôn mặt sử dụng việc

xác định các đặc trưng hình học trên các chi tiết của khuôn mặt (vị trí, diện tích,

hình dạng mắt, mũi, miệng …) và mối quan hệ giữa chúng (khoảng cách của

hai mắt, khoảng cách của hai lông mày…). Ưu điểm của phương pháp này là nó

gần với cách mà con người sử dụng để nhận biết khuôn mặt và cho kết quả tốt

trong các trường hợp ảnh hưởng tác động từ bên ngoài. Nhược điểm là thuật

toán phức tạp do việc xác định mối quan hệ giữa các khuôn mặt và các ảnh kích

thước nhỏ thì các đặc tính sẽ khó phân biệt do đó khó tính toán được các đặc

trưng trên khuôn mặt.

Còn với phương pháp nhận dạng dựa trên toàn diện khuôn mặt, có nghĩa

chúng ta sẽ không đi xét từng thành phần đặc trưng trên khuôn mặt mà sẽ xem

khuôn mặt là một chiều không gian cụ thể và tìm đặc điểm đặc trưng và những

đặc điểm chính trên không gian đó. Hai phương pháp thường được sử dụng

trong hướng tiếp cận này là:

 PCA (Principle Components Analysis) là phương pháp trích xuất đặc

trưng nhằm giảm số chiều của ảnh tuy đơn giản nhưng mang lại hiểu quả khá

tốt. Hệ thống ổng định và có thể thích nghi cao đối với dữ liệu đầu vào thay đổi

nhiều.

7

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

 LDA (Linear Discriminant Analysis) là phương pháp nhận diện dựa trên

một phép chiếu tuyến tính từ không gian hình ảnh vào một chiều không gian

thấp hơn bằng cách tối đa giữa các lớp tán xạ và giảm nhiều phân tán trong lớp.

Và trong bài toán này để nhận dạng không thể không nhắc tới thư viện

OpenCV (Open Source Computer Vision Library). Một thư viện mã nguồn mở

hàng đầu cho thị giác máy tính (computer vision), xử lý ảnh và máy học, và các

tính năng tăng tắc GPU trong hoạt động thời gian thực. Được giới thiệu vào

tháng 01 năm 1999 và được cho ra mắt phiên bản đầu tiên vào năm 2006. Thư

viện OpenCV chứa hàng ngàn thuật toán tối ưu hóa và hơn 500 hàm được viết

bằng ngôn ngữ C/C++ tương thích với nhiều hệ điều hành như Windows,

Android, Linux, … Các thuật toán có khả năng dùng để sử dụng để nhận dạng

khuôn mặt, xe hơi tự lái, phát hiện khuôn mặt, di chuyển theo khuôn mặt khi

phát hiện theo thời gian thực.

Nhưng với hệ thống nhận dạng khuôn mặt này đều được thiết kế và sử dụng

trên các máy tính có cấu hình cao và rất tốn kém. Vì thế nếu thiết kế một hệ

thống nhận dạng thì một chiếc máy tính như vậy quá tốn kém. Nhưng hiện nay

với sự phát triển của hệ thống nhúng (Embedded system) một hệ thống tích hợp

cả phần cứng và phần mềm phục vụ các bài toán chuyên dụng trong nhiều lĩnh

vực công nghiệp, tự động hóa điều khiển và truyền tin.

Và chính vì thế trong đề tài luận văn này tôi muốn ứng dụng ARDUINO.

Một bo mạch điện tử nhỏ để thực hiện đề tài luận văn “Thiết kế mạch chống

trộm”.

1.2 Giới thiệu về xử lý ảnh

1.1.1 Một số khái niệm cơ bản

Xử lý ảnh là một trong những mảng quan trọng nhất trong vấn đề kỹ thuật thị

giác máy tính và bước đầu cho nhiều nghiên cứu phát triển trong lĩnh vực nhận

dạng. Nhiệm vụ cơ bản của quá trình xử lý ảnh là nâng cao chất lượng hình ảnh

và xử lý số liệu để cung cấp cho các quá trình nhận dạng.

8

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

 Quy trình bắt đầu từ thu nhận ảnh nguồn (từ thiết bị thu nhận ảnh dạng số

hoặc tương tự) gửi đến máy tính. Và dữ liệu ảnh sẽ được lưu trừ ở định dạng

phù hợp trong qua trình xử lý.

 Quy trình xử lý nhận dạng ảnh được xem là quá trình thao tác ảnh đầu

vào nhằm đạt kết quả mong muốn. Kết quả đầu ra của một quá trình xử lý ảnh

có thể là một hình ảnh đã được xử lý hoặc một kết luận.

Ảnh Qua Xử Lý

Ảnh Xử Lý

Kết Luận

Hình 1.1 Quá trình xử lý ảnh

 Ảnh có thể được coi là một tập hợp các điểm ảnh và mỗi điểm ảnh được

xem như là đặc trưng cường độ sáng hay một dấu hiệu nào đó tại một vị trí nào

đó của đối tượng trong không gian và nó có thể xem như một hàm n biến. Vì

vậy, ảnh trong xử lý ảnh có thể xem như ảnh n chiều.

1.1.2 Các hình thái của ảnh

 Chuyển ảnh màu thành ảnh xám: Đơn vị tế bào của ảnh số là pixel. Tùy

theo mỗi định dạng là ảnh màu hay ảnh xám mà từng pixel có thông số khác

nhau. Đối với ảnh màu từng pixel sẽ mang thông tin của ba màu cơ bản tạo ra

bản màu là Đỏ, Xanh lá, Xanh biển. Trong mỗi một pixel của ảnh màu thì ba

màu cơ bản được bố trí sát nhau và có cường độ sáng khác nhau.

 Lược đồ xám của ảnh (Histogram) có các mức xám trong khoảng [0,L-1]

là một hàm rời rạc p(rk) = nk/n. Trong đó nk là số pixel có mức xám thứ rk, n là

tổng số pixel trong ảnh và k=0,1,2…L-1. Do đó P(rk) cho một xác suất xảy ra

mức xám rk. Vẽ hàm này với tất cả các giá trị của k sẽ biểu diễn khái quát sự

xuất hiện các mức xám của một ảnh. Và chúng ta có thể thể hiện lược đồ mức

9

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

xám của ảnh thông qua tần suất xuất hiện mỗi mức xam qua hệ tọa độ vuông

góc xOy. Trong đó, trục hoành biểu diễn số mức xám từ 0 đến N (số bit của ảnh

xám). Trục tung biểu diễn số pixel của mỗi mức xám.

1.3 Hệ thống nhận dạng khuôn mặt

1.1.3 Bài toán nhận dạng khuôn mặt

Bài toán về hệ thống nhận dạng mặt người là một hệ thống nhận vào là một

hình ảnh hoặc một chuỗi các ảnh (video). Qua đó xử lý và tính toán để xác định

được vị trí khuôn mặt người trong ảnh (nếu có) và xác định người nào trong số

những người đã được đào tạo hoặc trả về kết quả là người lạ.

Hình 1.2 Hệ thống nhận dạng khuôn mặt

1.1.4 Những tác động trong việc nhận dạng

 Điều kiện chụp ảnh: Ảnh được chụp khi có các điều kiện khác nhau có

thể gây ảnh hưởng đến chất lượng ảnh như : ánh sáng, chất lượng camera,…

 Sự che khuất: Khuôn mặt có thể đã bị che khuất bỡi các vật thể khác hoặc

camera bị dính bẩn,…

 Tư thế chụp, góc chụp: Ảnh chụp khuôn mặt có thể bị thay đổi do góc

chụp giữa camera và khuôn mặt. Khuôn mặt đang nhìn thẳng nhưng góc chụp

của máy ảnh lại lệch so với hướng nhìn hoặc nhiều trường hợp khác do đó tạo

nhiều khó khăn rất lớn cho bài toán nhận diện khuôn mặt.

10

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

 Thiếu một số thành phần khuôn mặt: Các đặc trưng như râu, mắt kính, …

có thể xuất hiện hoặc không.

 Sự biểu cảm của khuôn mặt: Biểu cảm của con người có thể làm ảnh

hưởng đáng kể lên các thông số của khuôn mặt…

 Nền ảnh: Nền ảnh phức tạp là một trong những khó khăn nhất trong bài

toán nhận diện, vì khuôn mặt người sẽ dễ bị nhầm lẫn với khung cảnh phía sau

và sẽ ảnh hưởng đến quá trình phân tích.

 Màu da: Màu sắc của da mặt quá tối hoặc quá sáng cũng có thể gây khó

khăn trong việc nhận dạng.

 Tuổi tác: Nhận dạng khuôn mặt theo thời gian cũng là một vấn đề cần

tính toán trong vấn đề nhận dạng.

1.1.5 Xây dựng hệ thống nhận dạng

Một hệ thống nhận dạng khuôn mặt có thể được xây dựng qua rất nhiều quá

trình khác nhau và phức tạp, nhưng bài toán này cũng có thể khái quát chung

thành bốn bước sau:

1. Phát hiện khuôn mặt (Face Detection)

2. Phân đoạn khuôn mặt (Face Alignment)

3. Trích xuất đặc trưng (Feature Extration)

4. Nhận dạng (Recognition)

11

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Hình 1.3 Quá trình nhận dạng khuôn mặt

 Phát hiện khuôn mặt: Là dò tìm, xác định vị trí của khuôn mặt xuất hiện

trong frame video.

 Phân đoạn khuôn mặt: là tạo một khung vuông để xác định vị trí mắt,

mũi, miệng và các bộ phận khác để chuyển kết quả cho bước trích xuất khuôn

mặt.

 Trích xuất đặc trưng: Bằng một phương pháp trích xuất chọn đặc điểm

nào đó (Haar-like, Local Binary Pattern – LBP,…) sẽ được dùng để trích xuất

đặc trưng thông tin về khuôn mặt xuất hiện trên camera. Xuất ra kết quả mỗi

ảnh dưới dạng vector đặc trưng.

 Phân lớp khuôn mặt: Sử dụng vector đặc trưng như một đầu vào cho mô

hình đã được huấn luyện trước. Xuất ra kết quả danh tính của khuôn mặt.

Bên cạnh những bước chính nêu trên, chúng ta còn có thể sử dụng thêm một

số bước như : tiền xử lý, hậu xử lý trong quá trình xử lý ảnh để làm tăng độ

chính xác cho hệ thống. Cụ thể như khi đọc ảnh từ frame video, chúng ta có thể

sử dụng bước tiền xử lý để căn chỉnh hình ảnh và cân chỉnh ánh sáng.

Và dữ liệu cho một hệ thống nhận dạng khuôn mặt được chia làm ba quá

trình như sau:

 Cài đặt huấn luyện hay tập huấn luyện (Training Set): là gồm nhiều ảnh

được dùng để huấn luyện (learning), trong tập này được dùng để sinh ra một

không gian con hoặc thư mục con (projection subspace) và nó là một ma trận.

Phương pháp hay được sử dụng nhất là PCA (Princial Component Analysis),

LDA (Linear Discriminant), WPCA (Whitened PCA), KPCA (Kernal PCA).

Tập đào tạo gồm các ảnh đã biết danh tính được chiếu vào không gian con ở

trong bước training. Bước training nhằm hai mục đích chính là : giảm số chiều

(Dimension reduction) của các vector đặc trưng vì vector này thường có độ dài

12

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

khá lớn (Vài nghìn đến vài trăm nghìn) mà nếu chúng ta để nguyên thì việc tính

toán sẽ sinh ra rất khó khăn, mục đích thứ hai là làm tăng tính phân biệt giữ các

ảnh khác lớp và cũng có thể làm giản tính phân biệt giữa các ảnh thuộc về một

lớp.

 Sau khi chiếu tập huấn luyện vào không gian con, hệ thống sẽ tự lưu lại

kết quả là một ma trận với mỗi một cột của ma trận là một vector tương ứng với

một ảnh (danh tính đã được xác định) để thực hiện nhận dạng. Nhận dạng được

thực hiện với tập probe, sau khi tiền xử lý đã hoàn thành, mỗi một ảnh sẽ được

áp dụng phương pháp trích xuất đặc trưng và được chiếu vào không gian con.

 Tiếp đến việc phân lớp sẽ dựa trên phương pháp K-NN, định danh của

một ảnh cần xác định sẽ được gán định danh của ảnh có khoảng cách gần với nó

nhất.

13

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

CHƯƠNG 2. CƠ SỞ LÝ THUYẾT

1.4 Lý thuyết phát hiện khuôn mặt người bằng đặc trưng Haar wavelet-like

1.1.6 Tiếp cận Haar wavelet-like

Đặc trưng Haar wavelet-like được giới thiệu bởi Michael Jones và Paul Viola

là một trong những đặc trưng ảnh số được sử dụng trong nhận dạng đối tượng,

khuôn mặt. Những đặc trưng trong Haar wavelet-like là một sự lựa chọn phù

hợp cho mục đích phát hiện nhanh chóng và có độ chính xác cao trong thời gian

thực.

Trong hầu hết các bài toán nhận dạng đều làm việc trên cường độ sáng và tối

của ảnh, làm việc trên từng pixel trong ảnh, vì vậy nó đòi hỏi người sử dụng

phải làm việc với mức độ tính toán lớn. Và để giải quyết vấn đề của bài toán

này thì sử dụng những đặc trưng cơ bản của Haar wavelet-like với việc dùng

những hình chữ nhật lân cận tại một địa điểm cụ thể trong tập traning để tìm đối

tượng. Tính năng thường hay sử dụng của đặc trưng này là để dò tìm đối tượng

và là tập hợp của các hình chữ nhật liền kề và xác định vị trí của các hình chữ

nhật liên quan nhằm mục đích bao quanh đối tượng cần tìm.

Đặc trưng Haar wavelet-like cũng là sự kết hợp của hai hay ba hình chữ nhật

“trắng” hoặc “đen”.

Hình 2.1 Đặc trưng Haar wavelet-like cơ bản

Và để áp dụng các đặc trung này vào việc xác định bài toán nhận dạng khuôn

mặt này thì bốn đặc trung cơ bản sẽ được mở rộng ra và chia làm ba tập đặc

trưng như sau :

14

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

 Đặc trưng cạnh (edge features)

Hình 2.2 Đặc trưng cạnh

 Đặc trưng đường (line features)

Hình 2.3 Đặc trưng đường

 Đặc trưng xung quanh tâm (center suround features)

Hình 2.4 Đặc trưng xung quanh tâm

Đặc trưng này cũng phản ánh sự tương phản giữa các mối liên hệ của đối

tượng. Những đối tượng cần xác định và phát hiện có thể được xác định bởi một

bộ đặc trung này thông qua những liên hệ không gian giữa chúng.

15

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Hình 2.5 Quá trình trích xuất đặc trưng Haar wavelet-like

1.1.7 Trích xuất đặc trưng Haar wavelet-like

Đặc trưng Haar-Like sẽ được biễu diễn các mỗi liên hệ giữa các bộ phận

của đối tượng, điều mà chính bản thân từng pixel không diễn đạt được và dựa

trên việc co giản của khung cửa sổ tìm kiếm các đặc trung Haar-Like. Và chúng

ta có thể tính sự chênh lệch giữa tổng các pixel của các vùng trắng và đen bằng

công thức sau:

f(x)=∑vùng đen(pixel)-∑vùng trắng(pixel)

Dựa vào công thức này chúng ta sẽ thấy rằng với tổng các pixel trên ảnh

sẽ cho ta thấy được các giá trị của đặc trưng này. Nhưng vấn đề ở đây là để tính

toán được những giá trị của các đặc trưng này thì đòi hỏi một khối lượng tính

toán rất lớn và dẫn đến không thể đáp ứng được cho các ứng dụng thời gian

thực tế. Do đó Michel Jones và Paul Viola đề xuất ra một khái niệm mới gọi là

“tích phân ảnh” giúp tính toán nhanh cho các đặc trưng cơ bản của Haar-Like.

1.5 Nhận dạng khuôn mặt người sử dụng LBPH Face Recognizer

LBPH Face Recognizer là phương pháp áp dụng trực tiếp các phép phân tích

của các thành phần chính PCA (Principal Component Analysis) và nó được sử

dụng rất nhiều vào quá trình phát hiện và nhận dạng khuôn mặt. Ưu điểm của

phương pháp này là biểu diễn được toàn bộ ảnh và có độ sắc nét tốt và giảm hạn

chế về ánh sáng,…

1.1.8 Nhận dạng bằng thuật toán PCA

Thuật toán PCA (Principal Component Analysis) là một thuật toán để tạo ra

một ảnh mới ban đầu. Và ảnh mới này sẽ có kích thước nhỏ hơn rất nhiều so với

ảnh ban đầu nhưng vẫn mang những đặc trưng cơ bản nhất của một khuôn mặt

người cần nhận dạng. PCA không cần phải quan tâm đến việc phải truy tìm cụ

16

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

thể các đặc điểm trên khuôn mặt như mắt, mũi, miệng ,… PCA sẽ tự có tất cả

những chi tiết đó thể hiện trong ảnh.

Mục tiêu của thuật toán PCA là ảnh mới được tạo phải có kích thước nhỏ

nhất và chứa nhiều nhất các đặc trưng của ảnh khuôn mặt đầu vào. Theo lý

thuyết thì PCA tìm ra một không gian mới chứa những tập hợp véc tơ trong một

không gian cho trước.

Ưu điểm của thuật toán PCA:

 PCA có tính mở và có thể kết hợp được với các phương pháp khác nhau

để mang lại hiểu quả cao

 Khối lượng xử lý, tính toán không nhiều

 Thuật toán thực hiện tốt với các ảnh đầu vào có độ phân giải (pixel) cao

bỡi vì PCA sẽ thu nhỏ ảnh đầu vào thành một ảnh mới có kích thước nhỏ hơn.

 PCA có thể xác định được các đặc tính tiêu biểu cho một khuôn mặt mà

không cần phải xác định các thành phần và mối liên hệ giữa chúng.

Nhược điểm của thuật toán PCA:

 PCA rất dễ bị nhiễu

 Còn phụ thuộc vào ánh sáng

 Ảnh phân bố chưa đều và cũng không phải lúc nào cũng mang lại hiệu

quả nhận dạng tốt

1.1.9 Nhận dạng bằng thuật toán LDA

Và cũng tương tự như PCA, LDA (Linear Discriminants Analysis) cũng là

một phương pháp nhận dạng đang phát triển hiện nay.

17

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Mục đích của thuật toán LDA là tìm ra một không gian mới có thể để tách

rời các nhóm ảnh với nhau. Không gian đó được tạo bởi các vec-tơ không nhất

thiết phải trực giao từng đôi một.

Trong không gian được tạo ra từ LDA các ảnh trong cùng một nhóm sẽ gần

nhau, và các nhóm khác nhau thì sẽ cách xa nhau. LDA khắc phục được nhược

điểm của PCA đó là ảnh lớn nhất thì mang thông tin nhận dạng cao nhất.

Ưu điểm của thuật toán LDA:

 Thuật toán LDA mang hầu hết các ưu điểm của PCA và đồng thời khắc

phục được nhược điểm cơ bản của PCA.

Nhược điểm của thuật toán LDA:

 Thuật toán LDA đòi hỏi một khối lượng tính toán rất lớn. Và hiện nay

vẫn chưa có cách tính nhanh cho phương pháp này.

1.1.10 Ứng dụng của thuật toán PCA trong bài toán

Thuật toán PCA nhận dạng ảnh dựa trên những nét tổng thể của khuôn mặt vì

thế chúng ta có thể áp dụng thuật toán này để thực hiện công việc tìm một

khuôn mặt giống với khuôn mặt được đào tạo trước với một kích thước nhỏ hơn

và những nét đặc trưng chỉ có trên khuôn mặt đó.

Đặc trưng của thuật toán PCA: Mục tiêu của thuật toán này là giảm số

chiều của một tập hợp những vec-tơ sao cho vẫn đảm bảo được tối đa thông tin

quan trọng nhất. Thuật toán này sẽ giữ lại K thuộc tích (Feature extraction) từ N

thuộc tính ban đầu (Feature selection) và K

PCA đó là phép biến đổi tuyến tính T thõa mãn.

Công thức: y= T.x

18

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Hình 2.6 Phương pháp thuật toán PCA

Cách đi tìm T: Gọi  là một vec-tơ trung bình của tất cả các vec-tơ x trong

tập mẫu gồm M ảnh. Và gọi ma trận hiệp phương sai của các phẩn từ x trong tập

mẫu C.

C được tính theo công thức:

Ma trận hiệp phương sai của tập hợp m biến ngẫu nhiên là một ma trận

vuông hạng (m x m), và trong đó các phần từ nằm trên một đường chéo là

phương sai tương ứng của biến và các phần từ còn lại trên ma trận là các

phương sai của từng đôi một hai biến ngẫu nhiên khác nhau trong tập hợp …

Và nếu T là một ma trận m hàng thì mỗi hàng là một vec-tơ riêng của C và

cũng đồng thời m vec-tơ riêng này phải ứng với m giá trị riêng lớn nhất. Và khi

đó T chính là phép biến đổi thỏa mãn giá trị nhỏ nhất. Vì vậy, phương pháp sử

dụng thuật toán PCA quy về việc đi tìm giá trị riêng và vec-tơ riêng của ma trận

hiệp phương sai C và chỉ giữ lại K vec-tơ riêng ứng với K trị riêng lớn nhất để

làm cơ sở cho không gian mới này.

1.1.11 Tính toán và tìm EigenFaces

Ta coi mỗi bức ảnh là một vec-tơ không gian NxP chiều và bây giờ mỗi

khuôn mặt là một vec-tơ thì chúng ta thấy những vec-tơ này không phân bố

ngẫu nhiên trong không gian ảnh mà phân bố theo một quy luật nào đó. Và ta

19

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

cũng có thể nói những vec-tơ này nằm trong một không gian chứa những khuôn

mặt. Và từ những vec-tơ trong tập huấn luyện thì ta sẽ tìm ra những vec-tơ

mang những nét đặc trưng về khuôn mặt.

Các bước để tính toán và tìm EigenFaces:

 Bước 1: Sử dụng các ảnh khuôn mặt I-1, I-2,…,I-n (tập các khuôn mặt

huấn luyện) với khuôn mặt phải chính diện và tất cả ảnh phải cùng kích thước.

Hình 2.7 Ví dụ về một tập huấn luyện

 Bước 2: Biễu diễn mỗi ảnh I-1,I-2,…,I-n thành các vec-tơ T-1,T-2,…,T-n

tương ứng.

 Bước 3: Tính vec-tơ khuôn mặt trung bình  theo công thức:

 Bước 4: Tính sai số giữa vec-tơ ảnh ban đầu và vec-tơ ảnh trung bình

theo công thức :

 Bước 5: Tính ma trận hiệp phương sai C theo công thức:

Và ma trận C có kích thước (NxP)x(NxP). Trong đó:

20

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Ma trận A có kích thước (NxP)xM

 Bước 6: Tính toán các vec-tơ riêng của ma trận vuông C =(1/M).A.Aᵀ

Nhận thấy ma trận trên có kích thước (NxP)x(NxP), và do kích thước ma trận

này quá lớn nên chúng ta không thể tìm vec-tơ riêng và trị riêng tương ứng một

cách trực tiếp. Thay vào đó chúng ta sẽ tìm vec-tơ riêng của ma trận A.Aᵀ có

kích thước MxM.

 Bước 7: Chuẩn hóa các vec-tơ của ma trận C để thu được một cơ sở trực

chuẩn của không gian khuôn mặt. Chỉ giữ lại K vec-tơ riêng trong số M vec-tơ

nói trên (ứng với K giá trị riêng lớn nhất) và tất nhiên K<

 Có cách để xác định K :

Sắp xếp theo thứ tự dãy giảm dần các eigenvalues tìm được. Theo dõi sự

biến thiên của dãy trên và khi không còn biến thiên hoặc gần bằng 0 thì lúc đó

ta đã chọn đủ K.

21

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

1.1.12 Bài toán nhận dạng khuôn mặt bằng các EigenFaces

Ta cho một hình ảnh khuôn mặt A chưa biết là ai (khuôn mặt phải chính diện

và cùng kích thước). Giai đoạn nhận dạng này hoàn toàn giống hệt với giai đoạn

đầu biểu diễn các khuôn mặt trong tập huấn luyện. Các bước thực hiện lần lượt

như sau:

 Bước 1: Chúng ta chuẩn hóa A có công thức :



 Bước 2: Chúng ta biểu diễn thành 

 Bước 3: Tính khoảng cách từ ảnh cần nhận dạng tới các ảnh trong tập

huấn luyện. Tức là đi tìm khuôn mặt có khoảng cách gần nhất với khuôn mặt

cần nhận dạng.

 Bước 4: Nếu khuôn mặt cần xác định đủ gần với khuôn mặt mẫu thì khi

đó ta kết luật đó chính là khuôn mặt của người cần nhận dạng.

22

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

CHƯƠNG 3. SƠ LƯỢC VỀ CÁC LINH KIỆN TRONG ĐỀ TÀI

1.6 Giới thiệu mạch Arduino NANO

Arduino là một board mạch vi xử lý, nhằm xây dựng các ứng dụng tương

tác với nhau hoặc với môi trường được thuận lợi hơn. Phần cứng bao gồm một

board mạch nguồn mở được thiết kế trên nền tảng vi xử lý AVR Atmel 8bit,

hoặc ARM Atmel 32-bit. Những Model hiện tại được trang bị gồm 1 cổng giao

tiếp USB, 6 chân đầu vào analog, 14 chân I/O kỹ thuật số tương thích với nhiều

board mở rộng khác nhau.

Được giới thiệu vào năm 2005, Những nhà thiết kế của Arduino cố gắng

mang đến một phương thức dễ dàng, không tốn kém cho những người yêu thích,

sinh viên và giới chuyên nghiệp để tạo ra những nhiết bị có khả năng tương tác

với môi trường thông qua các cảm biến và các cơ cấu chấp hành. Những ví dụ

phổ biến cho những người yêu thích mới bắt đầu bao gồm các robot đơn giản,

điều khiển nhiệt độ và phát hiện chuyển động.

Arduino NANO là một người anh em cùng với aduino uno R3, nhưng nhỏ

hơn và tiện lợi ngang với arduino UNO R3. Kích thước của arduino NANO là

1.85cm x 4.3cm, tuy nhỏ hơn, lại rẻ hơn nhưng thông số và khả năng ứng dụng

không kém gì với arduino R3.

23

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Hình 3.1 Arduino NANO

Hình 3.2 Sơ đồ chân Arduino NANO

Vi điều khiển ATmega328 (họ 8bit)

Điện áp hoạt động 5V – DC

Tần số hoạt động 16 MHz

Dòng tiêu thụ 30mA

Điện áp vào khuyên dùng 7-12V – DC

Điện áp vào giới hạn 6-20V – DC

Số chân Digital I/O 14 (6 chân PWM)

Số chân Analog 8 (độ phân giải 10bit)

Dòng tối đa trên mỗi chân I/O 40 mA

Dòng ra tối đa (5V) 500 mA

Dòng ra tối đa (3.3V) 50 mA

24

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

32 KB (ATmega328) với 2KB dùng Bộ nhớ flash bởi bootloader

SRAM 2 KB (ATmega328)

EEPROM 1 KB (ATmega328)

Kích thước 1.85cm x 4.3cm

Bảng 3.1 Các thông số của Arduino NANO

1.1.13 Cổng kết nối với Arduino Nano

Khác với Arduino Nano sử dụng cổng USB Type B, Nano lại sử dụng một

cổng nhỏ hơn có tên là mini USB. Vì sử dụng cổng này nên kích thước board (vê chiều cao) cũng giảm đi khá nhiều, ngoài ra bạn có thể lập trình thẳng trực tiếp cho Nano từ máy tính - điều này tạo nhiều điện thuận lợi cho newbie.

1.1.14 Lập trình cho Arduino Nano

Cũng tương tự như bên Arduino Uno R3, Arduino NANO sử dụng chương trình Arduino IDE để lập trình, và ngôn ngữ lập trình cho Arduino cũng tên là Arduino (được xây dựng trên ngôn ngữ C). Tuy nhiên, nếu muốn lập trình cho Arduino Nano, ta cần phải thực hiện một số thao tác trên máy tính. Sau đây, là các bước để có thể lập trình cho Arduino NANO.

1. Đầu tiên, ta cần cài Driver của Arduino NANO và tải về bản Arduino IDE mới nhất cho máy tính, các bước cài đặt hoàn toàn tương tự như Arduino UNO R3, bạn có thể tham khảo tại đây. Sau khi cài đặt, bạn sẽ thấy một thông báo dạng "Cổng COMx đã được cài đặt thành công"

2. Sau đó, ta cài đặt lại loại board và cổng Serial mới như hình sau.

25

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Hình 3.3 Cài đặt board cho lập trình với Arduino NANO

Hình 3.4 Cài đặt lại cổng Serial cho lập trình với Arduino NANO

26

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

1.7 Động cơ RC Servo 9G

Hình 3.5 Động cơ RC Servo MG 996R

RC servo 9G có kích thước nhỏ gọn và là loại hay được sử dụng để làm

các mô hình hoặc cơ cấu kéo không cần lực nặng. Động cơ có tốc độ phản ứng

nhanh, các bánh răng được làm bằng nhựa nên hạn chế nâng tải nặng. Động cơ

tích hợp sẵn Driver điều khiển bên trong nên nó có thể dễ dàng điều khiển góc

quay bằng phương pháp độ rộng xung PWM.

Thông số kỹ thuật :

Điện áp nguồn : 4.8V-6.6V DC 

 Tốc độ : 0.17 sec/60 degress (4.8V không tải) và 0.13sec/60 degress

(6.0V không tải)

 Lực kéo : 1.6kg.cm

Kích thước : 40 x 19 x 43mm 

 Trọng lượng : 55g

 Lực kéo: 3.5kg- cm với 4.8V và 5.5 kg-cm với 6V

27

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Dây màu đỏ nối với nguồn 5V DC, màu nâu là dây nối Mass, màu cam là 

dây điều khiển bằng xung PWM.

Tín hiệu PWM 20ms (50Hz), độ rộng xung điều khiển từ 1-2ms 

Hình 3.6 Chiều quay của Servo

Công thức tính góc quay: dc= góc quay / tín hiệu pwm + 2.5

Dc= 0/20 + 2.5 = 2.5

Dc = 90/20 + 2.5= 7.0

Dc = 180/20 + 2.5= 12

1.8 Module LM2596

Mạch Giảm Áp LM2596​ là module giảm áp có khả năng điều chỉnh được

dòng ra đến 3A. LM2596 là IC nguồn tích hợp đầy đủ bên trong. Tức là khi cấp

nguồn 9v vào module, sau khi giảm áp ta có thể lấp được nguồn 3A < 9v...như

5V hay 3.3V.

Tôi sử dụng mạch này cấp nguồn chuẩn cho các linh kiện khác.

28

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Hình 3.7 Mạch giảm áp LM2596

Thông số kỹ thuật

Module nguồn không sử dụng cách ly

Nguồn đầu vào từ 4V - 35V.

Nguồn đầu ra: 1V - 30V.

Dòng ra Max: 3A

Kích thước mạch: 53mm x 26mm

Đầu vào: INPUT +, INPUT-

Đầu ra: OUTPUT+, OUTPUT-

29

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Hình 3.8 Ngõ vào và ngõ ra của module LM2596

1.9 Bàn phím

Hình 3.9 Bàn phím ma trận

Sử dụng bàn phím ma trận để nhập mật khẩu phòng trường hợp camera

của mạch gặp sự cố.

CHƯƠNG 4.

30

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

XÂY DỰNG MÔ HÌNH VÀ PHẦN CỨNG

1.10 Kết nối với thiết bị ngoại vi

Sơ đồ hệ thống kết nối với thiết bị ngoại vi

Hệ Thống Khối Xử Khối

Khối Động Nhận Lý Trung Nguồn

Cơ Servo Diện Tâm

Khuôn

Mặt

Khối Hiển

Thị Và Báo

Động

Hình 4.1 Sơ đồ kết nối ngoại vi

Chức năng từng khối:

 Khối nguồn: cung cấp nguồn 5V cho khối hiển thị và báo động

nguồn 4.5V DC cho Module Sim 800A; nguồn 9V DC cấp cho

khối xử lý trung tâm board Arduino Uno R3.

 Khối xử lý trung tâm: thu thập dữ liệu từ các thiết bị sau đó

xử lý và điều khiển khối chấp hành và khối hiển thị. Khối này

do Arduino Uno R3 thực hiện.

 Khối hiển thị và báo dộng: sử dụng led và buzzer để báo dộng

khi có chuyển động trong một khu vực nhất định.

 Khối động cơ servo: đóng mở cửa do động cơ servo thực hiện.

1.1.15 Arduino NANO

31

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Hình 4.2 Sơ đồ kết nối từ Arduino NANO đến các linh kiện khác

Chân D11 nối với Servo.

Chân D10 nối với Buzzer.

Chân D6 nối với nút nhấn.

Chân A0, A1, A2, A3, D5, D4, D3, D2 nối với các chân của bàn phím ma

trận.

Chân A4, A5 nối với màn hình LCD.

Hình 4.3 Sơ đồ kết nối giữa Arduino NANO và màn hình LCD

32

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Hình 4.4 Sơ đồ kết nối giữa Arduino NANO và động cơ servo

1.11 Làm mạch

Mạch gồm có 3 phần là: Khối MCU, khối nguồn và khối thiết bị ngoại vi

Mạch được vẽ bởi phần mềm Altium

Hình 4.5 Sơ đồ kết nối của khối MCU

33

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Hình 4.6 Sơ đồ kết nối hệ thống thiết bị ngoại vi

Hình 4.7 Sơ đồ kết nối khối nguồn

1.12 Mô hình thực tế

Mô hình được làm bằng nhựa kết nối với laptop, camera và các thiết bị

ngoại vi.

34

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Hình 4.8 Mô hình thực tế

CHƯƠNG 5.

35

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

TẠO CHƯƠNG TRÌNH NHẬN DẠNG

Begin

Video Capture

Image Pre-Processing

Face Detecition Face Recognition Yes Yes Unlock Door

No No No End?

Yes

End

Hình 5.1 Lưu đồ giải thuật chương trình nhận dạng

Lưu đồ giải thuật trên giúp chúng ta hình dung được nguyên lý hoạt động của

hệ thống cũng như xây dựng được thuật toán tối ưu để phù hợp với hệ thống và

có thể giải quyết được yêu cầu bài toán đặt ra.

36

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Giải thích lưu dồ :

 Khối Begin : là khối có chức năng khởi tạo ban đầu cho chương trình ví

dụ như chèn thêm các thư viện cần thiết, khởi tạo camera, khởi tạo Bluetooth,…

 Khối Image-Pre-Processing : là khối có chức năng tiền xử lý ảnh, ảnh

được đưa vào khối này để chuyển đồi ảnh màu sang ảnh xám vì hệ thống chỉ

làm việc được với ảnh xám, chuẩn hóa ánh sáng để tăng khả năng phát hiện

cũng như nhận dạng hệ thống.

 Khối Face Detection : Hình ảnh sau khi được xử lý xong sẽ được đưa

vào khối này. Và khối này sẽ có chức năng phát hiện khuôn mặt và tách khuôn

mặt khỏi ảnh, có nghĩa là nếu đưa vào khối này một ảnh bất kỳ và nó sẽ phát

hiện được một khuôn mặt chính diện và tách khuôn mặt đó ra đưa khỏi ảnh và

đưa nó vào khối Face Recognition.

 Khối Face Recognition: có chức năng để nhận dạng xem khuôn mặt đó

đã biết hay chưa. Nếu nhận dạng được đúng thì khối này sẽ gửi tín hiệu mở

khóa và kích xung PWM để động cơ Servo hoạt động.

1.13 Xây dựng chương trình phát hiện khuôn mặt

Giao diện chính của hệ thống nhận diện khuôn mặt

37

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Hình 5.2 Giao diện chính của hệ thống nhận diện khuôn mặt

Chạy ứng dụng là project của Visual Studio, ta sẽ có một giao diện như

hình 5.2. Đầu tiên, chọn cổng COM để chọn cổng kết nối với camera

Hình 5.3 Chọn cổng COM kết nối với camera

Sau đó, nhấn “ Open Camera để mở camera”

38

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Hình 5.4 Mở Camera

Sau khi camera đã mở, nhấn “Connect” để kết nối với mô hình, khởi chạy hệ thống chống trộm.

Hình 5.5 Kết nối với mô hình chống trộm

Hoàn tất khởi chạy hệ thống, camera sẽ bắt đầu nhận diện khuôn mặt.

39

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Hình 5.6 Khởi chạy hệ thống chống trộm

Để xác định danh tính người đứng trước camera cho cửa mở, nhập tên hay biệt danh vào ô “Name”.

Hình 5.7 Nhập tên người

Nhấn “Thêm” để lưu tên người vào hệ thống. Từ đó, camera sẽ bắt đầu nhận diện người đã được thêm vào hệ thống với tên được gắn ở góc trái bên trên khung mặt.

40

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Hình 5.8 Nhấn “Thêm” để lưu tên vào hệ thống

Hành động này nhằm mục đích là huấn luyện cho hệ thống, để hệ thống có thể nhận diện khuôn mặt đã được thêm vào.

Hình 5.9 Khuôn mặt đã được thêm vào hệ thống

41

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Ảnh thu được

Phát hiện khuôn mặt từ ảnh thu được

Lưu trữ khuôn mặt thu được về cơ sở dữ liệu

Trích chọn đặc trưng của khuôn mặt bằng phương pháp PCA

Hình 5.10 Lưu đồ giải thuật về hệ thống huấn luyện

Khối ảnh thu được: những ảnh được chọn làm tập mẫu.

Khối phát hiện khuôn mặt từ ảnh thu được: phát hiện khuôn mặt ngƣời ban đầu với không gian RGB.

Khối trích chọc đặc trƣng của khuôn mặt bằng phương pháp PCA: dùng phương pháp PCA để phát hiện khuôn mặt đang đặt trước camera.

Khối lưu trữ khuôn mặt thu được về cơ sở dữ liệu: thiết lập các thống số lên khuôn mặt đã thu được và lưu lại về cơ sở dữ liệu (database).

42

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Ngoài ra, hệ thống còn có thể nhận diện 2 đến 3 khuôn mặt cùng một lúc.

Hình 5.11 Hệ thống nhận diện được 2 khuôn mặt cùng một lúc

Những hình ảnh đã được thêm vào hệ thống sẽ mặt định được lưu vào đường dẫn: bin > Debud > TrainedFaces

Hình 5.12 Đường dẫn tới các ảnh đã được huấn luyện để thêm vào hệ thống

43

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Nhưng nếu có vật gì che chắn khuôn mặt, như khẩu trang thì hệ thống sẽ không phát hiện được khuôn mặt để nhận diện.

Hình 5.13 Hệ thống sẽ không phát hiện được khuôn mặt nếu có vật che như khẩu

trang

Hệ thống còn được trang bị bàn phím để nhập mật khẩu, giả sử có kẻ trộm đột nhập và hệ thống sẽ không mở cho người lạ. Nếu kẻ trộm nhập mật khẩu sai thì camera sẽ chụp một bức ảnh và lưu vào một folder ( ở đây là Picture), tên ảnh sẽ được đặt là ngày, tháng, thời gian mà bức ảnh đã được chụp.

Hình 5.14 Một tấm ảnh được chụp khi nhập sai mật khẩu

44

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

CHƯƠNG 6. KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN

6.1 Kết luận

6.1.1 Kết luận 1

Đã thực hiện thành công đề tài “Thiết kế mạch chống trộm” .

6.1.2 Kết luận 2

Sau khi thử nghiệm đề tài đạt kết quả tốt, thời gian phát hiện nhanh đối với

các ảnh mặt người chụp thẳng, chất lượng ảnh tốt, tuy nhiên với các ảnh chụp

nghiêng hay ảnh có màu sắc quả tối thì đôi khi không phát hiện được khuôn

mặt. Và chương trình cũng còn tùy thuộc vào chất lượng Camera, môi trường

xung quanh,...

6.1.3 Kết luận 3

Vì thời gian và kiến thức còn có hạn. Nên hệ thống còn cần được thực

nghiệm nhiều và cải tiến thêm, tăng thêm các lớp bảo mật cũng như tăng thêm

chất lượng Camera.

6.2 Hướng phát triển

 Quy định ánh sáng tại những nơi sữ dụng hệ thống

 Giải quyết thêm về các trường hợp thường hay xảy ra trên khuôn mặt

người.

 Nâng cấp thêm chất lượng Camera.

 Có thể nâng cấp hệ thống bằng việc gửi dữ liệu lên internet để hệ thống

có thể dễ dàng quản lý từ xa hơn.

 Thiết kế thêm nguôn dự trữ dùng pin mặt trời và ác-quy để khi nguồn

điện chính bị mất đi hệ thống vẫn có thể hoạt động bình thường.

45

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

TÀI LIỆU THAM KHẢO

[1] Ứng dụng xử lý ảnh trong thực tế với thư viện OpenCV C/C++ - Nguyễn Văn

Long

[2] https://www.pyimagesearch.com/

[3] https://opencv.org/

[4] https://www.waveshare.com/wiki/3.5inch_RPi_LCD_(A)

[5] http://arduino.vn/bai-viet/915-huong-dan-su-dung-module-ban-phim-4x4-voi-

arduino

[6] http://arduino.vn/bai-viet/531-dieu-khien-lcd-bang-arduino-uno

[7] http://arduino.vn/bai-viet/5893-khoa-dien-tu-bam-so-su-dung-keypad-4x3

46

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

PHỤ LỤC A

Code nhận dạng khuôn mặt để mở cửa

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Windows.Forms;

using Emgu.CV;

using Emgu.CV.Structure;

using Emgu.CV.CvEnum;

using System.IO;

using System.Diagnostics;

using System.IO;

using System.IO.Ports;

namespace MultiFaceRec

{

public partial class FrmPrincipal : Form

{

//Declararation of all variables, vectors and haarcascades

Image currentFrame;

Capture grabber;

HaarCascade face;

HaarCascade eye;

MCvFont font = new MCvFont(FONT.CV_FONT_HERSHEY_TRIPLEX,

0.5d, 0.5d);

Image result, TrainedFace = null;

Image gray = null;

List> trainingImages = new List

byte>>();

List labels= new List();

47

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

List NamePersons = new List();

int ContTrain, NumLabels, t;

string name, names = null;

string path_file = Application.StartupPath + "/TrainedFaces/name.txt";

int count_t = 0, check_opendoor = 0;

private string data_recv;

string pic_path = "D://Picture";

public FrmPrincipal()

{

InitializeComponent();

//Load haarcascades for face detection

face = new HaarCascade("haarcascade_frontalface_default.xml");

//eye = new HaarCascade("haarcascade_eye.xml");

try

{

//Load of previus trainned faces and labels for each image

string Labelsinfo = File.ReadAllText(Application.StartupPath +

"/TrainedFaces/TrainedLabels.txt");

string[] Labels = Labelsinfo.Split('%');

NumLabels = Convert.ToInt16(Labels[0]);

ContTrain = NumLabels;

string LoadFaces;

for (int tf = 1; tf < NumLabels+1; tf++)

{

LoadFaces = "face" + tf + ".bmp";

trainingImages.Add(new Image(Application.StartupPath +

"/TrainedFaces/" + LoadFaces));

labels.Add(Labels[tf]);

48

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

}

}

catch(Exception e)

{

//MessageBox.Show(e.ToString());

MessageBox.Show("Nothing in binary database, please add at least a

face(Simply train the prototype with the Add Face Button).", "Triained faces

load", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

}

}

private void FrmPrincipal_Load(object sender, EventArgs e)

{

string[] COM = SerialPort.GetPortNames();

Cb_COM.Items.AddRange(COM);

serialPort1.DataReceived+=new

SerialDataReceivedEventHandler(DataReceive);

Console.WriteLine("App path: "+ Application.StartupPath);

timer1.Start();

if (!Directory.Exists(pic_path)) {

Directory.CreateDirectory(pic_path);

} else

{

Console.WriteLine("Directory is exsite");

}

}

private void bt_connect_Click(object sender, EventArgs e)

{

49

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

if(serialPort1.IsOpen)

{

serialPort1.Close();

bt_connect.Text = "Connect";

bt_connect.ForeColor = Color.Red;

lb_status.Text = "Disconnect";

lb_status.ForeColor = Color.Green;

}

else

{

serialPort1.PortName = Cb_COM.Text;

serialPort1.BaudRate = Convert.ToInt32("9600");

serialPort1.Open();

bt_connect.Text = "Disconnect";

bt_connect.ForeColor = Color.Red;

lb_status.Text = "Connect";

lb_status.ForeColor = Color.Green;

}

}

private void loadfile() {

Console.WriteLine(File.Exists(path_file) ? "File exists." : "File does not

exist.");

}

private void DataReceive(object sender, SerialDataReceivedEventArgs e)

{

data_recv = serialPort1.ReadExisting();

this.Invoke(new EventHandler(ShowData));

}

50

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

private void timer1_Tick(object sender, EventArgs e)

{

DateTime time = DateTime.Now;

lb_timer.Text = time.ToString("dddd_dd_MMMM_yyyy_HH_mm_ss");

}

private void ShowData(object sender, EventArgs e)

{

Console.WriteLine("Data: "+data_recv);

if (data_recv == "O")

{

Console.WriteLine(" opendoor");

check_opendoor = 1;

}

if (data_recv == "C")

{

check_opendoor = 0;

count_t = 0;

Console.WriteLine("Close door: "+ check_opendoor);

}

if(data_recv == "S")

savePicture();

check_opendoor = 1;

}

if(data_recv == "I")

{

check_opendoor = 0;

count_t = 0;

}

51

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

}

void savePicture() {

string file = pic_path +"/"+ lb_timer.Text + ".jpg";

Console.WriteLine("file: "+file);

imageBoxFrameGrabber.Image.Save(file);

}

private void button1_Click(object sender, EventArgs e)

{

//Initialize the capture device

grabber = new Capture();

grabber.QueryFrame();

//Initialize the FrameGraber event

Application.Idle += new EventHandler(FrameGrabber);

button1.Enabled = false;

}

private void button2_Click(object sender, System.EventArgs e)

{

try

{

//Trained face counter

ContTrain = ContTrain + 1;

//Get a gray frame from capture device

gray = grabber.QueryGrayFrame().Resize(320, 240,

Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);

//Face Detector

MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(

face,

Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,

new Size(20, 20));

//Action for each element detected

52

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

foreach (MCvAvgComp f in facesDetected[0])

{

TrainedFace = currentFrame.Copy(f.rect).Convert();

break;

}

//resize face detected image for force to compare the same size with

the

//test image with cubic interpolation type method

TrainedFace = result.Resize(100, 100,

Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);

trainingImages.Add(TrainedFace);

labels.Add(tb_AddName.Text);

//Show face added in gray scale

imageBox1.Image = TrainedFace;

//Write the number of triained faces in a file text for further load

File.WriteAllText(Application.StartupPath +

"/TrainedFaces/TrainedLabels.txt", trainingImages.ToArray().Length.ToString()

+ "%");

//Write the labels of triained faces in a file text for further load

for (int i = 1; i < trainingImages.ToArray().Length + 1; i++)

{

trainingImages.ToArray()[i - 1].Save(Application.StartupPath +

"/TrainedFaces/face" + i + ".bmp");

File.AppendAllText(Application.StartupPath +

"/TrainedFaces/TrainedLabels.txt", labels.ToArray()[i - 1] + "%");

}

MessageBox.Show(tb_AddName.Text + "´s face detected and added

:)", "Training OK", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

catch

53

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

{

MessageBox.Show("Enable the face detection first", "Training Fail",

MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

}

}

void FrameGrabber(object sender, EventArgs e)

{

label3.Text = "0";

//label4.Text = "";

NamePersons.Add("");

//Get the current frame form capture device

currentFrame = grabber.QueryFrame().Resize(320, 240,

Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);

//Convert it to Grayscale

gray = currentFrame.Convert();

//Face Detector

MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(

face,

1.2,

10, Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,

new Size(20, 20));

//Action for each element detected

foreach (MCvAvgComp f in facesDetected[0])

{

t = t + 1;

result = currentFrame.Copy(f.rect).Convert

byte>().Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);

//draw the face detected in the 0th (gray) channel with blue

color

54

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

currentFrame.Draw(f.rect, new Bgr(Color.Red), 2);

if (trainingImages.ToArray().Length != 0)

{

//TermCriteria for face recognition with numbers of trained

images like maxIteration

MCvTermCriteria termCrit = new

MCvTermCriteria(ContTrain, 0.001);

//Eigen face recognizer

EigenObjectRecognizer recognizer = new

EigenObjectRecognizer(

trainingImages.ToArray(),

labels.ToArray(),

3000,

ref termCrit);

name = recognizer.Recognize(result);

//Draw the label for each face detected and recognized

currentFrame.Draw(name, ref font, new Point(f.rect.X - 2,

f.rect.Y - 2), new Bgr(Color.LightGreen));

}

NamePersons[t-1] = name;

NamePersons.Add("");

//Set the number of faces detected on the scene

label3.Text = facesDetected[0].Length.ToString();

if (Convert.ToInt32(label3.Text) != 0) {

count_t++;

Console.WriteLine("Count: "+count_t+"; Check_open: "+

check_opendoor);

if (count_t == 20 && check_opendoor == 0 &&

serialPort1.IsOpen)

{

55

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

serialPort1.WriteLine("*OK#");

count_t = 0;

}

}

/*

//Set the region of interest on the faces

gray.ROI = f.rect;

MCvAvgComp[][] eyesDetected = gray.DetectHaarCascade(

eye,

1.1,

10,

Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,

new Size(20, 20));

gray.ROI = Rectangle.Empty;

foreach (MCvAvgComp ey in eyesDetected[0])

{

Rectangle eyeRect = ey.rect;

eyeRect.Offset(f.rect.X, f.rect.Y);

currentFrame.Draw(eyeRect, new Bgr(Color.Blue), 2);

}

*/

}

t = 0;

//Names concatenation of persons recognized

for (int nnn = 0; nnn < facesDetected[0].Length; nnn++)

{

names = names + NamePersons[nnn] + ", ";

}

//Show the faces procesed and recognized

imageBoxFrameGrabber.Image = currentFrame;

56

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

label4.Text = names;

names = "";

NamePersons.Clear()

}

}

}

57

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

Code hệ thống ngoại vi

#include

#include

#include

#include

#include

#define buzz 10

#define button 6

const byte ROWS = 4; //four rows

const byte COLS = 3; //four columns

char hexaKeys[ROWS][COLS] = {

{'1','2','3'},

{'4','5','6'},

{'7','8','9'},

{'*','0','#'}

};

byte rowPins[ROWS] = {A2, 4, 3, A0}; //connect to the row pinouts of the keypad

byte colPins[COLS] = {A1, A3, 2}; //connect to the column pinouts of the keypad

int addr = 0;

char password[6] = "22222";

char pass_def[6] = "12345";

char mode_changePass[6] = "*#01#";

char mode_resetPass[6] = "*#02#";

char mode_hardReset[6] = "11*#1";

char data_input[6];

char new_pass1[6];

char new_pass2[6];

58

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

unsigned char in_num = 0, index_t = 0,error_pass = 0,error_card = 0;

Keypad keypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS,

COLS);

LiquidCrystal_I2C lcd(0x27, 16, 2);

Servo myservo;

char buffer[6];

unsigned char count_t = 0;

void clear_data_input() //xoa gia tri nhap vao hien tai

{

int i=0;

for(i=0;i< 6; i++)

{

data_input[i]='\0';

}

}

void setup() {

Serial.begin(9600);

pinMode(buzz,OUTPUT);

pinMode(button,INPUT);

lcd.begin();

lcd.backlight();

clear_data_input();

myservo.attach(11);

myservo.write(62);

readEpprom();

}

void loop() {

lcd.setCursor(1, 0);

lcd.print("Nhap Mat Khau");

checkPass();

59

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

check_Facedetection();

check_button();

while(index_t == 1)

{

changePass();

}

while(index_t == 2)

{

resetPass();

}

while(index_t == 3)

{

openDoor();

error_pass = 0;

error_card = 0;

}

while(index_t == 4)

{

error();

error_pass = 0;

error_card = 0;

}

}

unsigned char isBufferdata(char data[]) //Kiem tra buffer da co gia tri chua

{

unsigned char i = 0;

for(i = 0; i < 5 ; i++)

{

if(data[i] == '\0')

{

60

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

return 0;

}

}

return 1;

}

bool compareData(char data1[], char data2[]) //Kiem tra 2 cai buffer co giong nhau

hay khong

{

unsigned char i = 0;

for(i = 0; i< 5; i++)

{

if(data1[i] != data2[i])

{

return false;

}

}

return true;

}

void insertData(char data1[], char data2[]) //Gan buffer 2 cho buffer 1

{

unsigned char i = 0;

for(i = 0; i< 5; i++)

{

data1[i] = data2[i];

}

}

void getData() //Nhan buffer tu ban phim

{

char key = keypad.getKey(); //Doc gia tri ban phim

if(key)

61

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

{

//Serial.println("key != 0");

if(in_num == 0)

{

data_input[0] = key;

lcd.setCursor(5, 1);

lcd.print(data_input[0]);

delay(200);

lcd.setCursor(5, 1);

lcd.print("*");

}

if (in_num == 1) {

data_input[1] = key;

lcd.setCursor(6, 1);

lcd.print(data_input[1]);

delay(200);

lcd.setCursor(6, 1);

lcd.print("*");

}

if (in_num == 2) {

data_input[2] = key;

lcd.setCursor(7, 1);

lcd.print(data_input[2]);

delay(200);

lcd.setCursor(7, 1);

lcd.print("*");

}

if (in_num == 3) {

data_input[3] = key;

lcd.setCursor(8, 1);

62

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

lcd.print(data_input[3]);

delay(200);

lcd.setCursor(8, 1);

lcd.print("*");

}

if (in_num == 4) {

data_input[4] = key;

lcd.setCursor(9, 1);

lcd.print(data_input[4]);

delay(200);

lcd.setCursor(9, 1);

lcd.print("*");

}

if(in_num == 4)

{

//Serial.println(data_input);

in_num = 0;

}

else{

in_num ++;

}

}

}

void checkPass() //kiem tra password

{

getData();

if(isBufferdata(data_input))

{

//Serial.print("Data: ");

//Serial.println(data_input);

63

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

if(compareData(data_input,password)) //Dung pass

{

//Serial.print("Dung pass");

notification(1);

lcd.clear();

clear_data_input();

index_t = 3;

}

else if(compareData(data_input,mode_changePass))

{

//Serial.print("mode_changePass");

lcd.clear();

clear_data_input();

index_t = 1;

}

else if(compareData(data_input,mode_resetPass))

{

//Serial.print("mode_resetPass");

lcd.clear();

clear_data_input();

index_t = 2;

}

else if(compareData(data_input,mode_hardReset))

{

writeEpprom(pass_def);

insertData(password,pass_def);

lcd.clear();

}

else

{

64

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

if(error_pass == 2)

{

notification(3);

clear_data_input();

lcd.clear();

index_t = 4;

}

//Serial.print("Error");

notification(2);

lcd.setCursor(1,1);

lcd.print(" ");

clear_data_input();

error_pass++;

}

}

}

void changePass() //Thay doi pass

{

lcd.setCursor(0,0);

lcd.print("-- Change Pass --");

delay(3000);

lcd.setCursor(0,0);

lcd.print("--- New Pass ---");

while(1)

{

getData();

if(isBufferdata(data_input))

{

insertData(new_pass1,data_input);

//Serial.println(new_pass1);

65

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

clear_data_input();

break;

}

}

lcd.clear();

lcd.setCursor(0,0);

lcd.print("---- AGAIN ----");

while(1)

{

getData();

if(isBufferdata(data_input))

{

insertData(new_pass2,data_input);

//Serial.println(new_pass2);

clear_data_input();

break;

}

}

delay(1000);

if(compareData(new_pass1,new_pass2))

{

lcd.clear();

//Serial.println("Success");

lcd.setCursor(0,0);

lcd.print("--- Success ---");

notification(1);

delay(1000);

writeEpprom(new_pass2);

insertData(password,new_pass2);

lcd.clear();

66

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

index_t = 0;

}

else

{

lcd.clear();

//Serial.println("miss");

lcd.setCursor(0,0);

lcd.print("-- Mismatched --");

notification(3);

delay(1000);

lcd.clear();

index_t = 0;

}

}

void resetPass()

{

unsigned char choise = 0;

//Serial.println("Pass reset");

lcd.setCursor(0,0);

lcd.print("---Reset Pass---");

getData();

if(isBufferdata(data_input))

{

if(compareData(data_input,password))

{

lcd.clear();

clear_data_input();

while(1)

{

lcd.setCursor(0,0);

67

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

lcd.print("---Reset Pass---");

char key = keypad.getKey();

if(choise == 0)

{

lcd.setCursor(0,1);

lcd.print(">");

lcd.setCursor(2,1);

lcd.print("YES");

lcd.setCursor(9,1);

lcd.print(" ");

lcd.setCursor(11,1);

lcd.print("NO");

}

if(choise == 1)

{

lcd.setCursor(0,1);

lcd.print(" ");

lcd.setCursor(2,1);

lcd.print("YES");

lcd.setCursor(9,1);

lcd.print(">");

lcd.setCursor(11,1);

lcd.print("NO") ;

}

if(key == '*')

{

if(choise == 1)

{

choise = 0;

}

68

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

else

{

choise ++;

}

}

if(key == '#' && choise ==0)

{

lcd.clear();

delay(1000);

writeEpprom(pass_def);

insertData(password,pass_def);

lcd.setCursor(0,0);

lcd.print("---Reset ok---");

notification(1);

delay(1000);

lcd.clear();

break;

}

if(key == '#' && choise == 1)

{

lcd.clear();

break;

}

}

index_t = 0;

}

else{

notification(1);

index_t = 0;

lcd.clear();

69

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

}

}

}

void notification(char select)

{

unsigned char i = 0;

if(select == 1)

{

for(i = 0; i< 2; i++)

{

digitalWrite(buzz,HIGH);

delay(100);

digitalWrite(buzz,LOW);

delay(100);

}

}

if(select == 2)

{

for(i = 0; i< 3; i++)

{

digitalWrite(buzz,HIGH);

delay(100);

digitalWrite(buzz,LOW);

delay(100);

}

}

if(select == 3)

{

for(i = 0; i< 4; i++)

{

70

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

digitalWrite(buzz,HIGH);

delay(100);

digitalWrite(buzz,LOW);

delay(100);

}

}

}

void writeEpprom(char data[])

{

unsigned char i = 0;

for(i = 0; i< 5; i++)

{

EEPROM.write(i, data[i]);

}

}

void readEpprom()

{

unsigned char i = 0;

for(i = 0; i< 5; i++)

{

password[i] = EEPROM.read(i);

}

}

void openDoor()

{

//Serial.println("Open The Door");

unsigned char pos;

lcd.setCursor(0,0);

lcd.print("-OPEN THE DOOR-");

delay(1000);

71

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

for (pos = 62; pos < 150; pos ++)

{

myservo.write(pos);

delay(10);

}

delay(5000);

for (pos = 150; pos > 62; pos --)

{

myservo.write(pos);

delay(10);

}

Serial.print("C");

lcd.clear();

index_t = 0;

}

void error()

{

unsigned char minute = 2;

unsigned char i = 59;

char buff[2];

Serial.print('S');

lcd.setCursor(1,0);

lcd.print("Try again for");

while(i>0)

{

if(i == 1 && minute > 0)

{

minute --;

i = 59;

}

72

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

if(i == 1 && minute == 0)

{

break;

}

sprintf(buff,"%.2d",i);

lcd.setCursor(5,1);

lcd.print(minute);

lcd.setCursor(6,1);

lcd.print(":");

lcd.setCursor(7,1);

lcd.print(buff);

i--;

delay(200);

}

index_t = 0;

lcd.clear();

}

void check_Facedetection() {

if(Serial.available()) {

char c = Serial.read();

if(c == '*') {

count_t = 0;

}

if(c != '*' && c != '#') {

buffer[count_t++] = c;

}

if(c == '#') {

if(buffer[0] == 'O' && buffer[1] == 'K') {

Serial.print("O");

notification(1);

73

GVHD: ThS. Phan Thanh Hoàng AnhSVTH: Dương Chí Hùng

index_t = 3;

}

}

}

}

void check_button() {

if(digitalRead(button) == 0) {

notification(1);

delay(2000);

index_t = 3;

}

}

74