LỜI MỞ ĐẦU
Hiện nay, cùng với sự phát triển của xã hội, vấn đề an ninh bảo mật đang
được yêu cầu khắt khe tại mọi quốc gia trên thế giới. Các hệ thống nhận dạng con
người được ra đời với độ tin cậy ngày càng cao. Một trong các bài toán nhận dạng
con người rất được quan tâm hiện nay là nhận dạng khuôn mặt. Vì nhận dạng khuôn
mặt là cách mà con người sử dụng để phân biệt nhau. Bên cạnh đó, ngày nay việc
thu thập, xử lý thông tin qua ảnh để nhận biết đối tượng đang được quan tâm và ứng
dụng rộng rãi. Với phương pháp này, chúng ta có thể thu nhận được nhiều thông tin
từ đối tượng mà không cần tác động nhiều đến đối tượng nghiên cứu. Sự phát triển
của khoa học máy tính tạo môi trường thuận lợi cho bài toán nhận dạng khuôn mặt
người từ ảnh số. Các hệ thống nhận dạng offline đã ra đời và có độ tin cậy cao, tuy
nhiên các hệ thống nhận dạng online lại chưa đáp ứng được nhiều.
Bài toán nhận dạng khuôn mặt người là một bài toán hấp dẫn, không giới hạn
giải pháp sử dụng, vận dụng linh hoạt kiến thức trong nhiều lĩnh vực, đã thách thức
nhiều người nghiên cứu vì tính ứng dụng to lớn trong thực tế. Đây là một chủ đề có
thể nói còn tương đối mới với những ứng dụng mang tính công nghệ cao như: robot,
các thiết bị camera,các hệ thống bảo mật, nhận dạng, đã và đang được các hãng,
công ty áp dụng vào nhằm nâng cao các tính năng sản phẩm của mình trong quá
trình cạnh tranh trên thị trường hiện nay 
Với mong muốn tiếp cận các công nghệ mới, đồng thời bổ sung kiến thức về
khoa học kỹ thuật hiện đại, cũng như tổng kết lại những kỹ năng, kiến thức trong
suốt quá trình học tập tại trường, chúng em xin chọn đề tài “ Dò tìm và cắt ảnh
mặt người dùng PCA”. Đây có thể là một bài toán nhỏ, nhưng nó cũng giúp chúng
em có một cái nhìn khái quát về bài toán, tạo cơ sở tiền đề cho sự tìm tòi và phát
triển các hướng cao hơn trong sự nghiên cứu các công nghệ mới .
Bài luận này được trình bày bao gồm có 5 chương:
ã Chương 1: Giới thiệu Matlab và khái quát về ảnh.
ã Chương 2: Các phương pháp xác định khuôn mặt.
ã Chương 3: Phân tích thành phần chính PCA.
ã Chương 4: Chương trình mô phỏng.
ã Chương 5: Kết luận.
Nội dung của đề tài:
- Tìm hiểu phương pháp nhận diện ảnh.
- Nghiên cứu PCA.
- Dò tìm ảnh mặt người có không gian (1=>4).
- Cắt ảnh mặt và lưu vào 1 file.
- Xử lý ảnh động qua webcam.
Trong bài luận này chúng em xin đề cập tới vấn đề dò tìm và nhận dạng mặt
người qua một ảnh tĩnh cho trước, đồng thời mở rộng hơn là xử lý ảnh thu được qua
một thiết bị thu ảnh, ví dụ như: camera, webcam, 
MỤC LỤC
Trang
Chương 1: GIỚI THIỆU MATLAB VÀ KHÁI QUÁT VỀ ẢNH
 1
1.1 Giới thiệu chung về phần mềm Matlab . .2
1.1.1 Khái niệm về Matlab . .2
1.1.2 Tổng quan về cấu trúc dữ liệu Matlab, các ứng dụng . 2
1.1.2.1 Dữ liệu . .3
1.1.2.2 Ứng dụng . 3
1.1.2.3 Toolbox là một công cụ quan trọng trong Matlab . 3
1.1.3 Hệ thống Matlab . 3
1.1.4 Làm quen với Matlab . .4
1.1.5 Các cửa sổ làm việc của Matlab . 5
1.2 Giới thiệu khái quát về ảnh số . .7
1.2.1 Các khái niệm cơ bản về ảnh . .7
1.2.2 Các cách phân loại ảnh . .8
1.3 Xử lý ảnh với Matlab . 9
1.3.1 Xử lý ảnh . .9
1.3.2 Các giai đoạn xử lý ảnh . .10
1.3.3 Xử lý ảnh với Matlab . 11
1.3.3.1 Các kiểu ảnh trong Matlab . .11
1.3.3.2 Các hàm xử lý ảnh cơ bản trong Matlab . .13
1.3.3.3 Biến đổi không gian ảnh . .20
Chương 2: CÁC PHƯƠNG PHÁP XÁC ĐỊNH KHUÔN MẶT
 .36
2.1 Định nghĩa bài toán xác định khuôn mặt người . .37
2.2 Ứng dụng của phương pháp xác định khuôn mặt . .37
2.3 Phương pháp xác định khuôn mặt . .39
2.3.1 Hướng tiếp cận dựa trên tri thức . .40
2.3.2 Hướng tiếp cận dựa trên đặc trưng không thay đổi . .41
2.3.2.1 Các đặc trưng khuôn mặt . 42
2.3.2.2 Kết cấu . .45
2.3.2.3 Sắc màu của da . .45
2.3.2.4 Đa đặc trưng . .45
2.3.3 Hướng tiếp cận dựa trên so khớp mẫu . .45
2.3.4 Hướng tiếp cận dựa trên diện mạo . 46
2.4 Khó khăn và thử thách trong bài toán xác định khuôn mặt người . 47
Chương 3: PHÂN TÍCH THÀNH PHẦN CHÍNH PCA
(PRINCIPAL COMPONENT ANALYSIS)
 .48
3.1 Sơ lược về phân tích thành phần chính PCA . .49
3.2 Thuật toán PCA và ứng dụng trong nhận dạng khuôn mặt người . 50
3.2.1 Thuật toán . .50
3.2.2 Phân tích thành phần chính PCA . .50
3.2.3 Hình ảnh minh họa . 53
3.3 Ứng dụng Eigenfaces trong việc nhận dạng mặt người . .56
3.3.1 Tính toán Eigenfaces . 59
3.3.2 Dùng Eigenfaces để phân loại ảnh mặt người . .61
3.3.3 Ứng dụng Eigenfaces để phát hiện gương mặt . 62
3.3.3.1 Xem xét lại không gian mặt . .63
3.3.3.2 Nhận dạng theo thời gian thực . .64
3.4 Nhận xét . .65
3.4.1 Ưu điểm của phương pháp PCA . .65
3.4.2 Nhược điểm của PCA . .65
Chương 4: CHƯƠNG TRÌNH MÔ PHỎNG
 .67
4.1 Chương trình mô phỏng . .68
4.1.1 Cơ sở dữ liệu ảnh . 68
41.1.1 Tập ảnh huấn luyện . 68
4.1.1.2 Tập ảnh mẫu . .69
4.1.2 Các bước thực hiện chương trình . .70
4.1.3 Lưu đồ giải thuật . .72
4.1.3.1 Lưu đồ giải thuật chính . 72
4.1.3.2 Lưu đồ giải thuật chi tiết . .72
4.1.4 Kết quả mô phỏng . .77
4.1.5 Tốc độ thực hiện . .80
4.2 Nhận xét kết quả đạt được . .81
Chương 5: KẾT LUẬN . 85
5.1 Kết luận . .85
5.2 Hướng phát triển đề tài . 85
PHỤ LỤC .
TÀI LIỆU THAM KHẢO .
                
              
                                            
                                
            
 
            
                 115 trang
115 trang | 
Chia sẻ: lvcdongnoi | Lượt xem: 3324 | Lượt tải: 1 
              
            Bạn đang xem trước 20 trang tài liệu Đề tài Dò tìm và cắt ảnh mặt người dùng PCA, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
 nhất của tập vector. Tuy nhiên, chiều 
phân bố lớn nhất không phải lúc nào cũng mang lại hiệu quả tốt nhất cho bài 
toán nhận dạng. Đây là nhược điểm cơ bản của PCA. 
• PCA rất nhạy với nhiễu. 
Có rất nhiều thuật toán nhận dạng mặt người dựa trên những chi tiết của khuôn 
mặt như đôi mắt, lông mày, cấu trúc của khuôn mặt, hay màu da… Khác hoàn toàn với 
những thuật toán trên, PCA nhận dạng dựa trên những nét tổng thể của khuôn mặt. Còn 
hơn một thuật toán, PCA đã cung cấp một cơ sở rất rõ ràng cho việc mô tả đặc trưng 
của khuôn mặt, để từ đó có thể phát triển những thuật toán nhận dạng khác. Vì vậy có 
thể PCA không là thuật toán tốt nhất, nhưng là thuật toán phổ biến nhất được áp dụng 
trong bài toán nhận diện mặt người. 
Chương 4: Chương trình mô phỏng 67 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
Chương 4 
CHƯƠNG TRÌNH 
MÔ PHỎNG 
4.1 Chương trình mô phỏng 
4.2 Nhận xét kết quả đạt được 
Chương 4: Chương trình mô phỏng 68 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
Chương 4 
CHƯƠNG TRÌNH MÔ PHỎNG 
4.1 Chương trình mô phỏng 
4.1.1 Cơ sở dữ liệu ảnh 
 Cơ sở dữ liệu ảnh bao gồm có 3 tập ảnh: ảnh face, ảnh nface, ảnh mẫu. Trong đó 
2 tập là ảnh face và ảnh nface được dùng trong chương trình dò tìm và cắt ảnh mặt 
người, còn chương trình nhận dạng mặt người dùng 2 tập ảnh là ảnh face và ảnh mẫu. 
4.1.1.1 Tập ảnh huấn luyện 
a) Ảnh face 
Tập ảnh face bao gồm những tập ảnh khuôn mặt người, dùng trong thuật toán 
PCA, để xác định các thành phần đặc trưng của khuôn mặt người, dùng để dò tìm, xác 
định khuôn mặt người và nhận dạng mặt người. 
Hình 4.1 Tập ảnh Face 
Chương 4: Chương trình mô phỏng 69 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
b) Ảnh nface 
Tập ảnh nface bao gồm những tập ảnh không phải là khuôn mặt người, dùng 
trong thuật toán PCA, để xác định các thành phần đặc trưng không phải là của khuôn 
mặt người, đó là không gian ảnh môi trường bên ngoài: cây cối, không gian ngoại 
cảnh, … giúp cho việc dò tìm khuôn mặt người chính xác hơn, bằng cách loại bỏ các 
điểm đánh dấu không phải khuôn mặt người, từ đó chúng ta sẽ đễ dàng dò tìm khuôn 
mặt người trong một bức ảnh cần xác định. 
Hình 4.2 Tập ảnh nface 
4.1.1.2 Tập ảnh mẫu 
Tập ảnh mẫu bao gồm các ảnh đưa vào tập ảnh cơ sở dữ liệu, khi ta dò tìm và 
cắt ảnh khuôn mặt, từ đó sẽ xác định các thành phần đặc trưng, dò tìm trong ảnh cơ sở 
dữ liệu, xác định tọa độ khoảng cách sai lệch giữa các thông số điểm ảnh, tìm ra những 
ảnh tương đồng, gần với ảnh được xác định, từ đó truy xuất ra thông tin dữ liệu của ảnh 
cần nhận dạng. 
Chương 4: Chương trình mô phỏng 70 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
Hình 4.3 Tập ảnh mẫu 
4.1.2 Các bước thực hiện chương trình 
Khi chạy chương trình “Dò tìm và cắt ảnh mặt người dùng PCA” ta thao tác 
theo trình tự các bước sau: 
Bước 1: Đưa ảnh vào để xử lý 
Ở bước này chúng ta có hai cách để chọn ảnh nguồn để xử lý là từ một nguồn có 
sẵn và từ một nguồn đưa ảnh trực tiếp ở ngoài vào thông qua webcam. 
- Cách thứ nhất: Đưa ảnh vào từ một nguồn có sẵn. Ta chọn nút chọn ảnh để 
tìm nguồn ảnh gốc đưa ảnh vào xử lý cụ thể là tập ảnh trong thư mục ảnh test. Sau khi 
chọn ảnh cần kiểm tra ta chọn nút open để chọn ảnh đã chọn. 
- Cách thứ hai: Đưa ảnh trực tiếp thu từ ngoài vào nhờ thiết bị thu hình đó là 
webcam. Ta nhấn nút camera để mở chương trình chạy webcam, sau khi đã điều chỉnh 
khoảng cách và kích thước ảnh đầu vào hợp lý ta nhấn vào nút chụp ảnh để đưa ảnh 
chụp vào xử lý các công đoạn tiếp theo. 
Bước 2: Dò tìm ảnh mặt người. 
Để thực hiện bước này ta cần điều kiện là phải có ảnh kiểm tra mới chạy được 
chương trình dò tìm ảnh mặt người. Khi đã có đủ điều kiện ta nhấn nút nhận dạng thì 
chương trình sẽ bắt đầu thực hiện: lấy ảnh chọn làm ảnh ban đầu đưa vào chương trình 
Chương 4: Chương trình mô phỏng 71 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
nhận dạng ảnh tìm và xác định vị trí của những khuôn mặt có trong tấm ảnh. Đây là 
đoạn chương trình chính của bài toán, đoạn chương trình sử dụng thuật toán PCA và là 
giai đoạn chiếm thời gian nhiều nhất của bài toán “Dò tìm và cắt ảnh mặt người dùng 
PCA”. 
Bước 3: Cắt ảnh mặt người. 
Là quá trình tách những khuôn mặt có trong tấm ảnh đầu vào chia thành những 
tấm ảnh nhỏ riêng lẻ để giúp ta có thể lưu lại từng khuôn mặt một cách dể dàng hay để 
dùng những tấm ảnh đó vào những công việc khác một cách nhanh chóng và chính xác 
hơn. 
Bước 4: Lưu ảnh khuôn mặt. 
Sau tất cả các quá trình thực hiện phương pháp tìm và tách ảnh mặt người thì 
cuối cùng kết quả cũng đạt được dù không chuẩn xác nhưng mục đích cuối cùng là ta 
phải lưu trữ lại những gì mà ta đã làm được, khi ta nhấn vào nút save thì sẽ hiện lên thư 
mục để lưu ảnh và thực hiện thao tác lưu ảnh. 
Bước 5: Nhận dạng khuôn mặt. 
Quá trình nhận dạng khuôn mặt cũng được thực hiện dựa vào thuật toán PCA, 
sau khi cắt ảnh mặt người, từ ảnh đó ta đặt làm ảnh test, ảnh test này sẽ được xử lý 
bằng cách xác định khoảng cách của ảnh test đến ảnh cơ sở dữ liệu. Nếu ảnh test có 
nằm trong cơ sở dữ liệu ảnh, thì ảnh test sẽ được nhận dạng bằng một bức ảnh khác 
nằm trong cơ sở dữ liệu ảnh, còn nếu ảnh test không nằm trong cơ sở dữ liệu ảnh, thì sẽ 
không nhận dạng được. 
Chương 4: Chương trình mô phỏng 72 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
4.1.3 Lưu đồ giải thuật 
4.1.3.1 Lưu đồ giải thuật chính 
Hình 4.4 Lưu đồ giải thuật chính 
4.1.3.2 Lưu đồ giải thuật chi tiết 
a) Lưu đồ giải thuật chọn ảnh 
Chọn ảnh có hai cách: 
• Cách 1: Chọn ảnh tĩnh (ảnh có sẵn). 
• Cách 2: Chọn ảnh động (nhận ảnh từ webcam). 
Chọn ảnh 
Chương trình dò tìm và cắt 
ảnh mặt người 
Chương trình nhận dạng 
ảnh mặt người 
Bắt đầu
Kết thúc
Chương 4: Chương trình mô phỏng 73 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
Hình 4.5 Lưu đồ giải thuật chọn ảnh 
Chọn ảnh động 
Bắt đầu
Chạy chương trình mở 
webcam 
Chọn và chụp ảnh 
Chọn thư mục chứa ảnh 
cần kiểm tra 
Chọn ảnh 
Hiển thị ảnh đã chọn 
Kết thúc 
Chọn ảnh tĩnh 
Chương 4: Chương trình mô phỏng 74 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
b) Lưu đồ giải thuật chương trình dò tìm ảnh mặt người 
Hình 4.6 Lưu đồ giải thuật chương trình dò tìm ảnh mặt người 
S 
Bắt đầu
Kết thúc 
Đánh dấu 
Tập ảnh huấn luyện Face và Nface Ảnh dò tìm 
Dò tìm ảnh mặt người bằng PCA 
Mặt người 
Đóng khung 
Tách mặt 
Lưu 
Đ 
 Không đánh dấu 
Không đóng khung 
Chương 4: Chương trình mô phỏng 75 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
c) Lưu đồ giải thuật chương trình nhận dạng 
Hình 4.7 Lưu đồ giải thuật chương trình nhận dạng 
Thuật toán nhận dạng PCA 
Ảnh mẫu để so sánh nhận dạng 
Ảnh có trong 
tập dữ liệu
Truy xuất thông 
tin ảnh nhận dạng
Hiển thị thông tin 
và ảnh nhận dạng
Chọn ảnh nhận dạng 
Dò tìm thông tin từ file 
Excel “hoso1.xls” 
Có
Không có 
Bắt đầu
Kết thúc
Chương 4: Chương trình mô phỏng 76 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
d) Lưu đồ thuật toán PCA 
Hình 4.8 Lưu đồ giải thuật PCA 
Thuật toán PCA 
Tạo cơ sở dữ liệu 
Chuyển ảnh thành vector 
Tạo ma trận ảnh 
Tính giá trị ảnh trung bình 
Tính các giá trị Eigenface 
Xác định Eigenface của ảnh 
chọn ban đầu 
Bắt đầu 
Kết thúc 
Chương 4: Chương trình mô phỏng 77 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
4.1.4 Kết quả mô phỏng 
a) Giao diện của chương trình 
Hình 4.9 Giao diện chính 
Hình 4.10 Giao diện chương trình 1 (ảnh tĩnh) 
Chương 4: Chương trình mô phỏng 78 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
Hình 4.11 Giao diện chương trình 2 (ảnh động) 
b) Giao diện của kết quả dò tìm và nhận dạng 
Ảnh 1 khuôn mặt: 
Hình 4.12 Giao diện kết quả chương trình 1 (ảnh tĩnh) với 1 khuôn mặt 
Chương 4: Chương trình mô phỏng 79 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
Hình 4.13 Giao diện kết quả chương trình 2 (ảnh động)với 1 khuôn mặt 
Ảnh 2 khuôn mặt: 
Hình 4.14 Giao diện kết quả chương trình 1 (ảnh tĩnh) với 2 khuôn mặt 
Ảnh 4 khuôn mặt: 
Chương 4: Chương trình mô phỏng 80 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
Hình 4.15 Giao diện kết quả chương trình 1 (ảnh tĩnh) với 4 khuôn mặt nữ 
Hình 4.16 Giao diện kết quả chương trình 1 (ảnh tĩnh) với 4 khuôn mặt nam 
4.1.5 Tốc độ thực hiện 
 Tốc độ thực hiện chương trình thể hiện thời gian mà chương trình tính toán 
trong quá trình xử lý, tùy theo giá trị kích thước ảnh đưa vào lớn hay nhỏ mà tốc độ 
Chương 4: Chương trình mô phỏng 81 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
thực hiện nhanh hay chậm. Nếu ảnh đầu vào có kích thước nhỏ, quá trình xử lý của 
chương trình sẽ thực hiện nhanh chóng, nếu ảnh đầu vào có kích thước lớn, quá trình 
xử lý của chương trình sẽ thực hiện chậm, mặc khác tốc độ thực hiện cũng tùy thuộc 
vào tốc độ xử lý của máy tính, vì vậy, yêu cầu cần có một cấu hình thích hợp để thực 
hiện chương trình một cách nhanh chóng, tạo điều kiện thuận lợi cho việc dò tìm và 
nhận dạng khuôn mặt. 
Tốc độ thực hiện là quá trình đo đạc thời gian xử lý chương trình, đó là chương 
trình dò tìm ảnh mặt người và chương trình nhận dạng ảnh mặt người. 
4.2 Nhận xét kết quả đạt được 
 Qua quá trình tìm hiểu và nghiên cứu, chúng em đã xây dựng được một cái nhìn 
khái quát về bài toán nhận dạng, đặc biệt là nhận dạng mặt người. Đồng thời, nắm bắt 
được một số vấn đề về xử lý ảnh: các dạng ảnh, tính chất ảnh, không gian, tọa độ ảnh, 
ma trận ảnh,… và vận dụng nó kết hợp với các công cụ xử lý ảnh trong Matlab (Image 
Processing Toolbox). 
Từ kết quả thu được, ta nhận thấy: ta có thể dò tìm được 1 khuôn mặt, 2 khuôn 
mặt, 3 khuôn mặt và tối đa là 4 khuôn mặt trong 1 bức ảnh, nguyên nhân do sự hạn 
chế về kích thước của khuôn mặt và bức ảnh, và những khuôn mặt này có thể có hoặc 
không có trong tập ảnh huấn luyện, đây chính là ưu điểm của bài toán. Tuy chưa có sự 
chuẩn xác trong quá trình dò tìm và nhận dạng mặt người, nhưng bài toán phần nào đã 
được giải quyết. Trong quá trình thao tác, có thể có những ưu và khuyết điểm, nhưng 
bài luận văn này của chúng em cũng đã hoàn thành tương đối có thể chấp nhận được, 
sau đây là một số ưu điểm và khuyết điểm của bài toán cũng như trong quá trình thực 
hiện luận văn. 
¾ Ưu điểm 
- Ta có thể nhận dạng được một bức ảnh với 1 khuôn mặt, 2 khuôn mặt, 3 khuôn mặt 
và 4 khuôn mặt. 
- Khuôn mặt người được dò tìm và cắt ra rất rõ nét, có thể nhận dạng được. 
Chương 4: Chương trình mô phỏng 82 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
- Đối với thuật toán PCA, đây là một thuật toán được sử dụng trong rất nhiều lĩnh vực, 
đối với lĩnh vực chuyên ngành điện tử, thuật toán được vận dụng trong Matlab với 
nhiều công cụ xử lý, tạo điều kiện thuận lợi cho việc thực hiện đề tài. 
¾ Khuyết điểm 
- Nội dung của bài toán là dò tìm và nhận dạng mặt người, nên sử dụng rất nhiều khuôn 
mặt của nhiều đối tượng với các trạng thái khác nhau, nên khuyết điểm của bài toán 
này là cần một số lượng lớn nguồn tài nguyên của khuôn mặt của nhiều đối tượng, từ 
đó mới có thể tạo ra được một khối lượng cơ sở dữ liệu phong phú. Cho nên có những 
trường hợp chúng ta sẽ không dò tìm được một vài khuôn mặt trong bức ảnh, vì không 
tìm được những nét đặc trưng cơ bản của khuôn mặt. 
- Chương trình được thực hiện nhờ vào hoạt động của máy tính, nên cần có một cấu 
hình cần thiết để xử lý và tính toán, từ đó mới có thể áp dụng trong công nghệ hiện đại, 
điều này ảnh hưởng đến tốc độ thực hiện của chương trình. Ví dụ như nhận dạng khuôn 
mặt người qua một thiết bị quan sát, nếu tốc độ xử lý nhanh ta có thể có một kết quả 
mỹ mãn và hài lòng hơn. 
- Về nội dung của bài toán, việc chọn lọc đưa ảnh vào để xử lý, thì có hai cách: sử 
dụng một ảnh tĩnh có sẵn và sử dụng nguồn dữ liệu đưa vào từ webcam. Đối với 
webcam, hay một thiết bị thu hình nào, thì điều đầu tiên là cần phải có độ phân giải tốt 
để ảnh đưa vào rõ nét, như vậy khả năng xử lý sẽ cao hơn và chính xác hơn. 
- Đồng thời khó khăn về cách xác định khoảng cách và tọa độ khuôn mặt người trong 
quá trình đưa ảnh vào xử lý, cụ thể là kích thước ảnh mặt người so với kích thước của 
ảnh huấn luyện (quá lớn hoặc quá bé). Vì phương pháp nhận dạng PCA là phương 
pháp dò quét ảnh nhận dạng theo khối cho nên vấn đề khoảng cách và kích thước của 
khuôn mặt ảnh đưa vào so với kích thước của tập ảnh huấn luyện (tập ảnh face) là rất 
quan trọng. Cho nên thuật toán thường gặp khó khăn nhiều về vấn đề này. 
- Khó khăn trong việc xử lý dò tìm và nhận dạng, điều kiện ảnh đưa vào xử lý phải phù 
hợp: độ sáng, góc lệch, cảm xúc, biến dạng,… Chính vì điều này, đôi khi có những 
khuôn mặt mà không đủ điều kiện về ánh sáng (ảnh bị tối) hoặc khuôn mặt bị sai khác 
quá nhiều so với ảnh dữ liệu (méo dạng, khuôn mặt nhăn nhó, nhiều cảm xúc,…) 
Chương 4: Chương trình mô phỏng 83 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
Như vậy, dựa vào xác suất thống kê trong quá trình làm việc, có một vài trường 
ảnh không nhận dạng được, với nhiều lí do khách quan. 
Một số trường hợp bị lỗi, không dò tìm được khuôn mặt, do nhiều nguyên nhân 
khác nhau: 
- Ảnh có nhiều điểm đặc trưng khác: râu quai nón… 
Hình 4.17 Ảnh lỗi do quá nhiều chi tiết không phân biệt được 
Chương 4: Chương trình mô phỏng 84 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
- Ảnh không phải là ảnh ảnh thật: tranh vẽ…, làm cho độ sắc nét của ảnh không 
cao.
Hình 4.18 Lỗi do ảnh không được sắc nét 
Chương 5: Kết luận 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
85
Chương 5 
KẾT LUẬN 
5.1 Kết luận 
Trong quá trình thực hiện đồ án tốt nghiệp gặp rất nhiều khó khăn và thử thách, 
đòi hỏi sự cố gắng và tập trung cao độ trong quá trình thực hiện, nhưng chúng em cũng 
đã cố gắng hoàn thành đúng tiến độ làm việc theo yêu cầu đề ra, tuy nhiên bài luận này 
cũng chỉ đạt được một số kết quả tương đối, và còn nhiều sai sót trong vấn đề dò tìm 
cũng như nhận dạng mặt người. 
Kết quả đạt được của chúng em là đã dò tìm và nhận dạng được một số ảnh đã 
có trong cơ sở dữ liệu và một số ảnh nằm ngoài cơ sở dữ liệu, đó là những bức ảnh có 
độ sắc nét và tương phản cao, còn những ảnh không có độ sắc nét cao thì vẫn chưa xử 
lý được, đó chính là khuyết điểm của đề tài cũng như thuật toán PCA. Đối với ảnh 
động, việc xử lý ảnh đưa vào đã gây ra rất nhiều khó khăn, nó không chỉ đòi hỏi sự sắc 
nét của bức ảnh, mà còn yêu cầu về khoảng cách… 
5.2 Hướng phát triển đề tài 
- Nhận diện mặt người qua tập dữ liệu có sẵn từ camera. 
- Nhận diện danh tính của người phạm tội qua ảnh chụp. 
- Có thể kết hợp với nhiều thuật toán khác như: ICA, Neural,… để xử lý một cách 
chính xác hơn. 
- Dò tìm và nhận dạng đối tượng vi phạm kỷ luật từ xa qua một thiết bị quan sát. 
- Bảo mật hệ thống bằng cách nhận dạng khuôn mặt khi một hay nhiều đối tượng muốn 
ra vào một công ty, xí nghiệp, hay một cơ quan nào đó. 
- Quản lý thời gian làm việc của các nhân viên của một xí nghiệp mà chỉ cần một 
camera quan sát. 
Tài Liệu Tham Khảo 
[1]. Ngô Hoàng Khắc Tiến, Trần Xuân Bách, Đồ án tốt nghiệp Dò tìm ảnh mặt 
người dùng PCA, Khoa Công nghệ điện tử, trường Đại học Công Nghiệp TP HCM, 
2009. 
[2]. Lương Mạnh Bá, Nguyễn Thanh Thủy, Nhập Môn Xử lý ảnh số, Nxb Khoa học 
và Kỹ thuật, 2002. 
[3]. Võ Đức Khánh, Hoàng Văn Kiếm. Giáo trình xử lý ảnh số, Nhà xuất bản Đại 
học Quốc gia Thành phố Hồ Chi Minh, 2003. 
[4]. Phạm Thế Bảo, Tổng quan các phương pháp xác định khuôn mặt người, Tạp 
chí bưu chính viễn thông. 
[5]. Ngô Quốc Tạo, Ngô Phương Đông, Nguyễn Thanh Hòa, Phạm Việt Bình 
(2003), Báo cáo “Nhận dạng mặt người trong môi trường độ sáng không đồng 
nhất”, Hội thảo Công nghệ thông tin quốc gia lần thứ VIII, Thái Nguyên, 29-
31/8/2003. 
[6]. Nguyễn Hoài Sơn, Giáo trình Matlab căn bản, Khoa Xây dựng và Cơ học ứng 
dụng, trường ĐHSPKT. 
[7]. Burce A. Draper, Kyungim Baek, Marian Stewart Bartlett, J. Ross Beveridge, 
“Recognizing Faces with PCA and ICA”. 
[8]. Stan Z. Li , Anil K. Jain, “Handbook of Face Recognition”, 2006. 
[9]. IEEE Computer Society, “Automatic face and gesture recognition”, 2004 
[10]. Các Wedsite: 
www. diendandientu. com 
 www. dientuvienthong. net 
Phụ lục 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
PHỤ LỤC 
************ Chương trình chính*************** 
function varargout = luanvantotnghiep(varargin) 
% LUANVANTOTNGHIEP M-file for luanvantotnghiep.fig 
gui_Singleton = 1; 
gui_State = struct('gui_Name', mfilename, ... 
 'gui_Singleton', gui_Singleton, ... 
 'gui_OpeningFcn', @luanvantotnghiep_OpeningFcn, ... 
 'gui_OutputFcn', @luanvantotnghiep_OutputFcn, ... 
 'gui_LayoutFcn', [] , ... 
 'gui_Callback', []); 
if nargin && ischar(varargin{1}) 
 gui_State.gui_Callback = str2func(varargin{1}); 
end 
if nargout 
 [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); 
else 
 gui_mainfcn(gui_State, varargin{:}); 
end 
% End initialization code - DO NOT EDIT 
 % Executes just before luanvantotnghiep is made visible. 
function luanvantotnghiep_OpeningFcn(hObject, eventdata, handles, varargin) 
handles.output = hObject; 
% Update handles structure 
guidata(hObject, handles); 
function varargout = luanvantotnghiep_OutputFcn(hObject, eventdata, handles) 
varargout{1} = handles.output; 
function THOAT_Callback(hObject, eventdata, handles) 
 close1; 
% --- Executes on button press in pushbutton6. 
function pushbutton6_Callback(hObject, eventdata, handles) 
 chuongtrinh1; 
 delete(handles.figure1); 
 % --- Executes during object creation, after setting all properties. 
function axes1_CreateFcn(hObject, eventdata, handles) 
 imshow('anhnen.jpg'); 
% --- Executes during object creation, after setting all properties. 
function axes3_CreateFcn(hObject, eventdata, handles) 
 imshow('vo.jpg'); 
% --- Executes during object creation, after setting all properties. 
function sxes2_CreateFcn(hObject, eventdata, handles) 
Phụ lục 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
 imshow('logo.bmp'); 
**************************************************** 
**************Chương trình cắt ảnh tĩnh********* 
function varargout = chuongtrinh1(varargin) 
gui_Singleton = 1; 
gui_State = struct('gui_Name', mfilename, ... 
 'gui_Singleton', gui_Singleton, ... 
 'gui_OpeningFcn', @chuongtrinh1_OpeningFcn, ... 
 'gui_OutputFcn', @chuongtrinh1_OutputFcn, ... 
 'gui_LayoutFcn', [] , ... 
 'gui_Callback', []); 
if nargin && ischar(varargin{1}) 
 gui_State.gui_Callback = str2func(varargin{1}); 
end 
if nargout 
 [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); 
else 
 gui_mainfcn(gui_State, varargin{:}); 
end 
% --- Executes just before chuongtrinh1 is made visible. 
function chuongtrinh1_OpeningFcn(hObject, eventdata, handles, varargin) 
handles.output = hObject; 
% Update handles structure 
guidata(hObject, handles); 
% --- Outputs from this function are returned to the command line. 
function varargout = chuongtrinh1_OutputFcn(hObject, eventdata, handles) 
varargout{1} = handles.output; 
% --- Executes on button press in CHONANH. 
function CHONANH_Callback(hObject, eventdata, handles) 
 xoaanh; 
 chonanh; 
% --- Executes on button press in TACHMAT. 
function TACHMAT_Callback(hObject, eventdata, handles) 
 axes(handles.axes4); 
 imshow('anhluu/anh1.jpg'); 
 axes(handles.axes5); 
 imshow('anhluu/anh2.jpg'); 
 axes(handles.axes6); 
 imshow('anhluu/anh3.jpg'); 
 axes(handles.axes7); 
 imshow('anhluu/anh4.jpg'); 
% --- Executes on button press in Timmat. 
function Timmat_Callback(hObject, eventdata, handles) 
 tic % tic là hàm đếm thời gian bắt đầu đếm 
 thuchien; % gọi hàm thuchien.m 
 axes(handles.axes2); 
 imshow('anhluu/anh_kq.jpg'); %hiện ảnh kết quả 
 set(handles.times,'string',toc); %kết thúc đếm thời gian và cho nó hiện 
Phụ lục 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
% --- Executes on button press in NHANDANG. 
function NHANDANG_Callback(hObject, eventdata, handles) 
 tic 
 nhandang; 
 set(handles.times,'string',toc); 
% --- Executes on button press in save1. 
function save1_Callback(hObject, eventdata, handles) 
 s=imread('anhluu/anh1.jpg'); 
 save1; 
% --- Executes on button press in save2. 
function save2_Callback(hObject, eventdata, handles) 
 s=imread('anhluu/anh2.jpg'); 
 save1; 
% --- Executes on button press in save3. 
function save3_Callback(hObject, eventdata, handles) 
 s=imread('anhluu/anh3.jpg'); 
 save1; 
% --- Executes on button press in save4. 
function save4_Callback(hObject, eventdata, handles) 
 s=imread('anhluu/anh4.jpg'); 
 save1; 
% --- Executes on button press in chon1. 
function chon1_Callback(hObject, eventdata, handles) 
if (get(hObject,'Value') == get(hObject,'Max')) 
 photo=imread('anhluu\anh1.jpg'); 
 a = strcat('anhluu/anhtest.jpg'); 
 imwrite(photo,a); 
 set(handles.ten,'string',' '); 
 set(handles.ns,'string',' '); 
 set(handles.mssv,'string',' '); 
 set(handles.lop,'string',' '); 
 set(handles.quequan,'string',' '); 
end 
% --- Executes on button press in chon2. 
function chon2_Callback(hObject, eventdata, handles) 
if (get(hObject,'Value') == get(hObject,'Max')) 
 photo=imread('anhluu\anh2.jpg'); 
 a = strcat('anhluu/anhtest.jpg'); 
 imwrite(photo,a); 
 set(handles.ten,'string',' '); 
 set(handles.ns,'string',' '); 
 set(handles.mssv,'string',' '); 
 set(handles.lop,'string',' '); 
 set(handles.quequan,'string',' '); 
end 
% --- Executes on button press in chon3. 
function chon3_Callback(hObject, eventdata, handles) 
if (get(hObject,'Value') == get(hObject,'Max')) 
 photo=imread('anhluu\anh3.jpg'); 
 a = strcat('anhluu/anhtest.jpg'); 
Phụ lục 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
 imwrite(photo,a); 
 set(handles.ten,'string',' '); 
 set(handles.ns,'string',' '); 
 set(handles.mssv,'string',' '); 
 set(handles.lop,'string',' '); 
 set(handles.quequan,'string',' '); 
end 
% --- Executes on button press in chon4. 
function chon4_Callback(hObject, eventdata, handles) 
if (get(hObject,'Value') == get(hObject,'Max')) 
 photo=imread('anhluu\anh4.jpg'); 
 a = strcat('anhluu/anhtest.jpg'); 
 imwrite(photo,a); 
 set(handles.ten,'string',' '); 
 set(handles.ns,'string',' '); 
 set(handles.mssv,'string',' '); 
 set(handles.lop,'string',' '); 
 set(handles.quequan,'string',' '); 
end 
% --- Executes on button press in back. 
function back_Callback(hObject, eventdata, handles) 
 xoaanh; 
 luanvantotnghiep; 
 delete(handles.figure1); 
% --- Executes on button press in close. 
function close_Callback(hObject, eventdata, handles) 
 xoaanh; 
 luanvantotnghiep; 
 delete(handles.figure1); 
% --- Executes on button press in next. 
function next_Callback(hObject, eventdata, handles) 
 xoaanh; 
 chuongtrinh2; 
 delete(handles.figure1); 
**************************************************** 
**********Chương trình cắt ảnh động**************** 
function varargout = chuongtrinh2(varargin) 
 gui_Singleton = 1; 
gui_State = struct('gui_Name', mfilename, ... 
 'gui_Singleton', gui_Singleton, ... 
 'gui_OpeningFcn', @chuongtrinh2_OpeningFcn, ... 
 'gui_OutputFcn', @chuongtrinh2_OutputFcn, ... 
 'gui_LayoutFcn', [] , ... 
 'gui_Callback', []); 
if nargin && ischar(varargin{1}) 
 gui_State.gui_Callback = str2func(varargin{1}); 
end 
if nargout 
 [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); 
else 
 gui_mainfcn(gui_State, varargin{:}); 
Phụ lục 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
end 
% End initialization code - DO NOT EDIT 
% --- Executes just before chuongtrinh2 is made visible. 
function chuongtrinh2_OpeningFcn(hObject, eventdata, handles, varargin) 
handles.output = hObject; 
 % Update handles structure 
guidata(hObject, handles); 
% --- Outputs from this function are returned to the command line. 
function varargout = chuongtrinh2_OutputFcn(hObject, eventdata, handles) 
 varargout{1} = handles.output; 
% --- Executes on button press in chupanh. 
function chupanh_Callback(hObject, eventdata, handles) 
 xoaanh; 
 global vid photo a 
 photo = getsnapshot(vid); 
 selection = questdlg(['Ban muon chup anh gan hay xa?'],... 
 ['Chuong trinh chup anh!'],... 
 'Gan','Xa','Yes'); 
 if strcmp(selection,'Gan') 
 axes(handles.axes1); 
 photo=imresize(photo,0.5); 
 imshow(photo); 
 a = strcat('anhluu/anh_goc.jpg'); 
 imwrite(photo,a); 
 elseif strcmp(selection,'Xa') 
 axes(handles.axes1); 
 imshow(photo); 
 a = strcat('anhluu/anh_goc.jpg'); 
 imwrite(photo,a); 
 end 
% --- Executes on button press in CAMERA. 
function CAMERA_Callback(hObject, eventdata, handles) 
 global vid 
 info = imaqhwinfo; 
 info = imaqhwinfo('winvideo'); 
 info.DeviceInfo; 
 info.DeviceInfo.SupportedFormats; 
 vid = videoinput('winvideo',1,'YUY2_640x480'); 
 set(vid,'ReturnedColorSpace','RGB'); 
 preview(vid); 
% --- Executes on button press in TACHMAT. 
function TACHMAT_Callback(hObject, eventdata, handles) 
 axes(handles.axes4); 
 imshow('anhluu/anh1.jpg'); 
 axes(handles.axes5); 
 imshow('anhluu/anh2.jpg'); 
 axes(handles.axes6); 
 imshow('anhluu/anh3.jpg'); 
 axes(handles.axes7); 
 imshow('anhluu/anh4.jpg'); 
% --- Executes on button press in Timmat. 
Phụ lục 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
function Timmat_Callback(hObject, eventdata, handles) 
 tic 
 thuchien; 
 axes(handles.axes2); 
 imshow('anhluu/anh_kq.jpg'); 
 set(handles.times,'string',toc); 
% --- Executes on button press in NHANDANG. 
function NHANDANG_Callback(hObject, eventdata, handles) 
 tic 
 nhandang; 
 set(handles.times,'string',toc); 
% --- Executes on button press in save1. 
function save1_Callback(hObject, eventdata, handles) 
 s=imread('anhluu/anh1.jpg'); 
 save1; %thực hiện chương trình để lưu ảnh chọn 
% --- Executes on button press in save2. 
function save2_Callback(hObject, eventdata, handles) 
 s=imread('anhluu/anh2.jpg'); 
 save1; %thực hiện chương trình để lưu ảnh chọn 
% --- Executes on button press in save3. 
function save3_Callback(hObject, eventdata, handles) 
 s=imread('anhluu/anh3.jpg'); 
 save1; %thực hiện chương trình để lưu ảnh chọn 
% --- Executes on button press in save4. 
function save4_Callback(hObject, eventdata, handles) 
 s=imread('anhluu/anh4.jpg'); 
 save1; %thực hiện chương trình để lưu ảnh chọn 
% --- Executes on button press in chon1. 
function chon1_Callback(hObject, eventdata, handles) 
if (get(hObject,'Value') == get(hObject,'Max')) % nếu đánh dấu nó mang “Max” 
 photo=imread('anhluu\anh1.jpg'); % chọn ảnh thực hiện cho chương trình nhận dạng 
 a = strcat('anhluu/anhtest.jpg'); % con nếu không thì thôi không là gì hết 
 imwrite(photo,a); 
 set(handles.ten,'string',' '); set(handles.ns,'string',' '); 
 set(handles.mssv,'string',' '); set(handles.lop,'string',' '); 
 set(handles.quequan,'string',' '); 
end 
% --- Executes on button press in chon2. 
function chon2_Callback(hObject, eventdata, handles) 
if (get(hObject,'Value') == get(hObject,'Max')) % nếu đánh dấu nó mang “Max” 
 photo=imread('anhluu\anh2.jpg'); % chọn ảnh thực hiện cho chương trình nhận dạng 
 a = strcat('anhluu/anhtest.jpg'); % còn nếu không thì thôi không là gì hết 
 imwrite(photo,a); 
 set(handles.ten,'string',' '); set(handles.ns,'string',' '); 
 set(handles.mssv,'string',' '); set(handles.lop,'string',' '); 
 set(handles.quequan,'string',' '); 
end 
% --- Executes on button press in chon3. 
function chon3_Callback(hObject, eventdata, handles) 
if (get(hObject,'Value') == get(hObject,'Max')) % nếu đánh dấu nó mang “Max” 
Phụ lục 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
 photo=imread('anhluu\anh3.jpg'); % chọn ảnh thực hiện cho chương trình nhận dạng 
 a = strcat('anhluu/anhtest.jpg'); % con nếu không thì thôi không là gì hết 
 imwrite(photo,a); 
 set(handles.ten,'string',' '); set(handles.ns,'string',' '); 
 set(handles.mssv,'string',' '); set(handles.lop,'string',' '); 
 set(handles.quequan,'string',' '); 
end 
% --- Executes on button press in chon4. 
function chon4_Callback(hObject, eventdata, handles) 
if (get(hObject,'Value') == get(hObject,'Max')) % nếu đánh dấu nó mang “Max” 
 photo=imread('anhluu\anh4.jpg'); % chọn ảnh thực hiện cho chương trình nhận dạng 
 a = strcat('anhluu/anhtest.jpg'); % còn nếu không thì thôi không là gì hết 
 imwrite(photo,a); 
 set(handles.ten,'string',' '); set(handles.ns,'string',' '); 
 set(handles.mssv,'string',' '); set(handles.lop,'string',' '); 
 set(handles.quequan,'string',' '); 
end 
% --- Executes on button press in back. 
function back_Callback(hObject, eventdata, handles) 
 xoaanh; % thực hiện xóa những tấm ảnh cũ trước khi thực 
 chuongtrinh1; %hiện chương trình xử lý ảnh mới 
 delete(handles.figure1); 
% --- Executes on button press in close. 
function close_Callback(hObject, eventdata, handles) 
 xoaanh; % thực hiện xóa những tấm ảnh cũ trước khi thực 
 luanvantotnghiep; %hiện chương trình xử lý ảnh mới 
 delete(handles.figure1); 
********* Đoạn code thực hiện chương trình dò tìm và cắt ảnh************* 
face='face'; 
nface='nface'; 
%********************** TAO MATRAN CSDL************ 
[T1,T2] = taoCSDL(face,nface); 
%******************* TAO EF ************ 
[m1,m2,E1,E2] = taoEF(T1,T2); 
%******************LOAD ANH DE XU LY********** 
im1=imread('anhluu/anh_goc.jpg'); 
im= imresize(im1,0.2); % nén ảnh lại chỉ còn 20% 
im =rgb2gray(im); % chuyển về ảnh xám chỉ mang giá trị 0 và 1 
%***************** XAC DINH ************** 
[dong cot] = size(im); 
anh1=im*255; % nhận toàn bộ ảnh với gí trị 255 
anh2=im*255; 
for i=1:1:dong 
for j=1:1:cot 
 tam=subim(im,i,j); 
 tam1=tam-m1; % m1 là giá trị trung bình của ảnh face 
 tam2=tam-m2; % m2 là giá trị trung bình của ảnh nace 
 sochieu1=size(E1,2); 
 sochieu2=size(E2,2); 
Phụ lục 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
 hinhchieu1=tam*0; 
 hinhchieu2=hinhchieu1; 
 for k=1:sochieu1 
 toado=(E1(:,k))'*tam1; 
 hinhchieu1=hinhchieu1+toado*E1(:,k); 
 end 
 for k=1:sochieu2 
 toado=(E2(:,k))'*tam2; 
 hinhchieu2=hinhchieu2+toado*E2(:,k); 
 end 
 kc1=norm(tam1-hinhchieu1)/20; 
 kc2=norm(tam2-hinhchieu2)/20; 
 anh1(i,j)=kc1; 
 anh2(i,j)=kc2; 
end 
end 
b=strcat('anhluu/anh_face.jpg'); 
imwrite(anh1,b); 
%******************* DANH DAU ANH *********** 
%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
xacdinh(im1,im1,anh1,anh2); 
anh1=im1; 
anh=im1; 
face=anh1; 
nface=anh2; 
******* Đoạn code tạo cơ sở dữ liệu cho chương trình dò tìm ảnh mặt********** 
function [T1,T2] = taoCSDL(face,nface) 
csdl1 = dir(face); 
csdl2=dir(nface); 
soanh1 = 0; 
soanh2=0; 
 % đếm tất cả các file ảnh có trong thư mục face và nface 
for i = 1:size(csdl1,1) 
 if not(strcmp(csdl1(i).name,'.')|strcmp(csdl1(i).name,'..')|strcmp(csdl1(i).name,'Thumbs.db')) 
 soanh1 = soanh1 + 1; 
 end 
end 
for i = 1:size(csdl2,1) 
 if not(strcmp(csdl2(i).name,'.')|strcmp(csdl2(i).name,'..')|strcmp(csdl2(i).name,'Thumbs.db')) 
 soanh2 = soanh2 + 1 ; 
 end 
end 
T1 = []; % Tạo ma trận ảnh T1 chứa tập ảnh face 
for i = 1 : soanh1 
 str = int2str(i); % hàm strcat nhằm liên kết các giá trị thành chuỗi 
 str = strcat('\',str,'.png'); % tiện cho quá trình truy xuất hay lưu lại giá trị mới 
 str = strcat(face,str); 
 img = imread(str); 
 try 
 img = rgb2gray(img); % chuyển tất cả về ảnh xám 0 1 
 catch 
Phụ lục 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
 end 
 [dong cot] = size(img); % mỗi tấm ảnh huấn luyện có kích thước 18*27 
 tam = reshape(img',dong*cot,1); % biến 1 ảnh thành 1 vecto có 1cột và 18*27 hàng 
 T1 = [T1 tam]; % tăng dần kích thước ma trận T1 
End 
 % kết thúc ma trận T1 có kích thước 18*27x P với P là số cột của ma trận củng chính là số ảnh 
trong thư mục ảnh %huấn luyện face 18*27=486 chính là số dòng của ma trận ảnh T1 và tương tự ma trận 
T2 cũng vậy 
T2 = []; % Bước này làm tương tự như tạo ma trận T1 
for i = 1 : soanh2 % nhưng đối với ma trận ảnh nface 
 str = int2str(i); 
 str = strcat('\',str,'.png'); 
 str = strcat(nface,str); 
 img = imread(str); 
 try 
 img = rgb2gray(img); 
 catch 
 end 
 [dong cot] = size(img); %dong 27 cot 18 
 tam = reshape(img',dong*cot,1); 
 T2 = [T2 tam]; 
end 
*********Đoạn code tạo enginface ************** 
function [m1,m2,E1,E2] = taoEF(T1,T2) 
m1 = mean(T1,2); % Tính toán giá trị ảnh trung bình 
soanh1 = size(T1,2); 
m2 = mean(T2,2); 
soanh2=size(T2,2); 
%Tính độ lệch giửa các bước ảnh huấn luyện với giá trị ảnh trung bình sau đó trừ đi giá trị trung bình của 
ảnh trung bình và lưu các sai khác đó lại làm một ma trận ảnh mới ma trận đó là ma trận vecto riêng của ảnh 
huấn luyện, nhân ma trận vector riêng với ma trận nghịch đảo của nó và dùng hàm “eig” để tìm các vector 
riêng cho tập ảnh huấn luyện 
A1 = []; 
for i = 1 : soanh1 
 temp = double(T1(:,i)) - m1; % T(:,i): vector cột thứ i chính là một bức ảnh 
 A1 = [A1 temp]; 
end 
A2 = []; 
for i = 1 : soanh2 
 temp = double(T2(:,i)) - m2; 
 A2 = [A2 temp]; 
end 
L1 = A1'*A1; 
[V1 D1] = eig(L1); %tìm vector riêng và trị riêng 
L2 = A2'*A2; 
[V2 D2] = eig(L2); 
%V chứa ma trận những vecto riêng, còn D chứa những trị riêng của các vector riêng đó, vector riêng V(:,i) 
ứng với trị riêng là D(i,i) 
D=diag(D1); 
D=sort(D); % sắp sếp theo chiều tăng dần 
s=size(D); 
s=s(1); 
D=D(s-20); % chỉ giữ lại 20 trị riêng lớn nhất 
LeigV1 = []; % và 20 vector riêng lớn nhất của tập ảnh huấn luyện 
for i = 1 : size(V1,2) 
 if( D1(i,i)>D ) 
 LeigV1 = [LeigV1 V1(:,i)]; % tạo một ma trận mới chỉ gồm 20 vecto riêng 
 End %tại các vị trí của chính nó còn các vị trí khác 
Phụ lục 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
End %đều cho giá trị bằng 0 
D=diag(D2); 
D=sort(D); 
s=size(D);s=s(1); 
D=D(s-30); 
LeigV2 = []; 
for i = 1 : size(V2,2) 
 if( D2(i,i)>D ) 
 LeigV2 = [LeigV2 V2(:,i)]; 
 end 
end 
E1 = A1 * LeigV1; 
E2 = A2 * LeigV2; 
sovector=size(E1,2); 
for i=1:sovector 
 dodai=norm(E1(:,i)); 
 E1(:,i)=E1(:,i)/dodai; 
end 
sovector=size(E2,2); % sovector chính là số cột của ma trận 
for i=1:sovector 
 dodai=norm(E2(:,i)); % “norm” la tính giá trị bình phương trung bình 
 E2(:,i)=E2(:,i)/dodai; 
End 
****** doan code xac dinh va cat anh khuon mat******** 
function xacdinh(anh1,anh,face,nface) 
[dong,cot]=size(face); % vì phương pháp PCA là phương pháp xử lý ảnh theo khối 
for i=15:1:dong-13; % do vậy khi xử lý ảnh ta thường cắt ảnh lớn ra thành từng 
 for j=8:1:cot-8; % tấm ảnh con để xử lý mà tấm ảnh xử lý phải có kích thước 
 s1=0.001; % bằng kích thước tấm ảnh trong tập ảnh huấn luyện 
 s2=0.001; % do vậy khi xử lý ta phải tính giá trị từ tâm của tấm ảnh 
 for i1=i-13:i+13 % để quét cho nên khi truy xuất ra hình Eigenface thường 
 for j1=j-7:j+7 % mất đi các đường viền xung quanh là vậy 
 if abs(i1-i)<3 && abs(j1-j)<2 
 s1=s1+double(face(i1,j1)); 
 else 
 s2=s2+double(face(i1,j1)); 
 end 
 end 
 end 
 if s2/s1>21.8 && (nface(i,j)+nface(i-1,j)+nface(i+1,j))>89 && face(i,j)<31 && face(i-1,j)<31 && 
face(i+1,j)<31 && face(i-2,j)<31 && face(i+2,j)<31 
 kq(i,j)=255; % gán tại điểm ảnh phù hợp với các thông số 
 else % của khuôn mặt là 255 và các vị trí khác 
 kq(i,j)=0; % mang giá trị bằng 0 
 end 
 end 
end 
%----------------------------- 
d=strcat('anhluu/anh_danhdau.jpg'); 
imwrite(kq,d); 
 I=kq; 
anhkq=anh; 
anhkq1=anh1; 
 [d,c]=size(I); % d là số dòng còn c là số cột của ma trận ảnh I 
i1=1; i2=1; i3=1; i4=1; j1=1; j2=1; j3=1; j4=1; % khi tính toán ở hàm này thì i là cột và j là dòng 
if d>50 
Phụ lục 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
 d1=d*2/3; 
else 
 d1=d-5; 
end 
for i=1:c-5 % trong thuật toán này ta dùng vòng lặp for để 
 for j=1:d1 % tìm giá trị tại đó là 255 sau đó lưu nó lại 
 if I(j,i)>200 && i>10 % để tiện bề cho tính toán tách mặt sau này 
 i1=i; % vòng lặp for có một khuyết điểm là nó 
 j1=j; % chỉ dừng lại tại điểm cuối cho nên vấn đề 
 end % tìm kiếm được nhiều khuôn mặt gặp nhiều 
 end % khó khăn vòng lệnh lặp lại nhiều lẩn 
end % tốn kém thời gian khi chạy chương trình 
if i1-30>0 
 for i=1:i1-30 
 for j=1:d*2/3 
 if I(j,i)==255 && i>10 
 i2=i; 
 j2=j; 
 end 
 end 
 end 
end 
if i2-30>0 
 for i=1:i2-30 
 for j=1:d/2 
 if I(j,i)==255 && i>10 
 i3=i; 
 j3=j; 
 end 
 end 
 end 
end 
if i3-30>0 
 for i=1:i3-20 
 for j=1:d/2 
 if I(j,i)==255 && i>10 
 i4=i; 
 j4=j; 
 end 
 end 
 end 
end 
[d,c]=size(anhkq); 
if j1>1 &&i1>1 
 [j12,i12]=do(I,j1,i1); % gọi đến chương trình dò tìm tâm ảnh khuôn mặt 
 i1=i12-16; 
 j1=j12-20; 
 if i1<1 % điều kiện này nhằm tránh lỗi khi cắt ảnh 
 i1=1; % mà cắt ảnh lấn ra ngoài khung ảnh 
 end 
 if j1<1 
 j1=1; 
 end 
 i1=i1*5; j1=j1*5; i11=i1+149; j11=j1+199; 
 if i11>c 
Phụ lục 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
 i11=c; 
 end 
 if j11>d 
 j11=d; 
 end 
 anh1=imcrop(anhkq1,[i1 j1 i11-i1 j11-j1]); 
 a1=strcat('anhluu/anh1.jpg'); imwrite(anh1,a1); 
 for c1=i1:i11 
 anhkq(j1,c1)=255; anhkq(j11,c1)=255; anhkq(j1-1,c1)=255; anhkq(j11-1,c1)=255; 
 anhkq(j1-2,c1)=255; anhkq(j11-2,c1)=255; anhkq(j1-3,c1)=255; anhkq(j11-3,c1)=255; 
 end 
 for d1=j1:j11 
 anhkq(d1,i1)=255; anhkq(d1,i11)=255; anhkq(d1,i1-1)=255; anhkq(d1,i11-1)=255; 
 anhkq(d1,i1-2)=255; anhkq(d1,i11-2)=255; anhkq(d1,i1-3)=255; anhkq(d1,i11-3)=255; 
 end 
end 
if j2>1 &&i2>1 
 [j22,i22]=do(I,j2,i2); i2=i22-16; j2=j22-20; 
 if i2<1 
 i2=1; 
 end 
 if j2<1 
 j2=1; 
 end 
 i2=i2*5; j2=j2*5; i21=i2+149; j21=j2+199; 
 if i21>c 
 i21=c; 
 end 
 if j21>d 
 j21=d; 
 end 
 anh1=imcrop(anhkq1,[i2 j2 i21-i2 j21-j2]); 
 a1=strcat('anhluu/anh2.jpg'); imwrite(anh1,a1); 
 for c1=i2:i21 
 anhkq(j2,c1)=255; anhkq(j21,c1)=255; anhkq(j2-1,c1)=255; anhkq(j21-1,c1)=255; 
 anhkq(j2-2,c1)=255; anhkq(j21-2,c1)=255; anhkq(j2-3,c1)=255; anhkq(j21-3,c1)=255; 
 end 
 for d1=j2:j21 
 anhkq(d1,i2)=255; anhkq(d1,i21)=255; anhkq(d1,i2-1)=255; anhkq(d1,i21-1)=255; 
 anhkq(d1,i2-2)=255; anhkq(d1,i21-2)=255; anhkq(d1,i2-3)=255; anhkq(d1,i21-3)=255; 
 end 
end 
if j3>1 &&i3>1 
 [j32,i32]=do(I,j3,i3); i3=i32-16; j3=j32-20; 
 if i3<1 
 i3=1; 
 end 
 if j3<1 
 j3=1; 
 end 
 i3=i3*5; j3=j3*5; i31=i3+149; j31=j3+199; 
 if i31>c 
 i31=c; 
 end 
 if j31>d 
 j31=d; 
 end 
Phụ lục 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
 anh1=imcrop(anhkq1,[i3 j3 i31-i3 j31-j3]); 
 a1=strcat('anhluu/anh3.jpg'); 
 imwrite(anh1,a1); 
 for c1=i3:i31 
 anhkq(j3,c1)=255; anhkq(j31,c1)=255; anhkq(j3-1,c1)=255; anhkq(j31-1,c1)=255; 
 anhkq(j3-2,c1)=255; anhkq(j31-2,c1)=255; anhkq(j3-3,c1)=255; anhkq(j31-3,c1)=255; 
 end 
 for d1=j3:j31 
 anhkq(d1,i3)=255; anhkq(d1,i31)=255; anhkq(d1,i3-1)=255; anhkq(d1,i31-1)=255; 
 anhkq(d1,i3-2)=255; anhkq(d1,i31-2)=255; anhkq(d1,i3-3)=255; anhkq(d1,i31-3)=255; 
 end 
end 
if j4>1 &&i4>1 
 [j42,i42]=do(I,j4,i4); i4=i42-16; j4=j42-20; 
 if i4<1 
 i4=1; 
 end 
 if j4<1 
 j4=1; 
 end 
 i4=i4*5; j4=j4*5; i41=i4+149; j41=j4+199; 
 if i41>c 
 i41=c; 
 end 
 if j41>d 
 j41=d; 
 end 
 anh1=imcrop(anhkq1,[i4 j4 i41-i4 j41-j4]); 
 a1=strcat('anhluu/anh4.jpg'); imwrite(anh1,a1); 
 for c1=i4:i41 
 anhkq(j4,c1)=255; anhkq(j41,c1)=255; anhkq(j4-1,c1)=255; anhkq(j41-1,c1)=255; 
 anhkq(j4-2,c1)=255; anhkq(j41-2,c1)=255; anhkq(j4-3,c1)=255; anhkq(j41-3,c1)=255; 
 end 
 for d1=j4:j41 
 anhkq(d1,i4)=255; anhkq(d1,i41)=255; anhkq(d1,i4-1)=255; anhkq(d1,i41-1)=255; 
 anhkq(d1,i4-2)=255; anhkq(d1,i41-2)=255; anhkq(d1,i4-3)=255; anhkq(d1,i41-3)=255; 
 end 
end 
 e=strcat('anhluu/anh_kq.jpg'); 
 imwrite(anhkq,e); 
****Đoạn code xác định vị trí trung tâm khuôn mặt******* 
function [a1,b1]= do(anh,a,b) 
% b la gia tri cot a la gia tri dong 
mini=b; minj=a; maxj=a; 
[d,c]=size(anh); b1=b-20; a1=a-15; a2=a+15; 
if b1<1 
 b1=1; 
end 
 if a1<1 
 a1=1; 
end 
 if a2>d 
 a2=d; 
end 
 for i1=b1:b 
 for j1=a1:a2 
 if anh(j1,i1)>200 
Phụ lục 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
 if i1<mini 
 mini=i1; 
 end 
 if j1<minj 
 minj=j1; 
 end 
 if j1>maxj 
 maxj=j1; 
 end 
 end 
 end 
end 
a1=round((minj+maxj)/2); b1=round((mini+b)/2); 
******Đoạn code nhận dạng Enginface*********** 
function kq=subim(anh,y,x) 
 [dong,cot]=size(anh); % hàm này có hai mục đích 
d=27;c=18; % thứ 1: xóa bỏ các ảnh lỗi 
i1=y-13;i2=y+13; % thứ hai biến đổi ảnh thành vector và làm tròn số 
if i1<1 % trong thuật toán PCA xử lý ảnh theo khối do đó khi 
 i1=1; % cắt ảnh thì củng sẽ có những tấm ảnh bị lỗi 
end % nên hàm này sẽ xóa tất cả các ảnh lỗi về giá trị 
if i2>dong % chỉ giữ lại các ảnh có kích thước đúng với ảnh mẫu 
 i2=dong; 
end 
j1=x-8;j2=x+9; 
if j1<1 
 j1=1; 
end 
if j2>cot 
 j2=cot; 
end 
im=anh(i1:i2,j1:j2); 
kt=(i2-i1+1)*(j2-j1+1); 
if kt==486 
im=reshape(im',486,1); 
kq=double(im); 
else 
 im=reshape(im,kt,1); 
 kq=zeros(486,1); 
 for i=1:kt 
 kq(i,1)=im(i,1); 
 end 
kq=double(kq); 
end 
*******Đoạn code nhận dạng và truy xuất thông tin cá nhân ảnh nhận 
dạng******** 
******Đoạn code chương trình chính********** 
anhtest=imread('anhluu/anhtest.jpg'); %đọc ảnh chọn để nhận dạng 
if anhtest==255 % kiểm tra có phải là ảnh trắng hay không 
 axes(handles.axes3); % nếu là ảnh trắng thông tin nhận dạng sẽ là 
 imshow('hoso/0.jpg'); % tấm hình không nhận dạng được 
 set(handles.ten,'string','Khoâng bieát'); % và các thông tin khác đều “không biết” 
 set(handles.ns,'string','Khoâng bieát'); 
 set(handles.mssv,'string','Khoâng bieát'); 
 set(handles.lop,'string','Khoâng bieát'); 
 set(handles.quequan,'string','Khoâng bieát'); 
Phụ lục 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
else % nếu có tấm ảnh nhận dạng thì chương trình sẽ 
 anhtest=imresize(anhtest,[200 150]); % resize ảnh về đúng kích thước của ảnh mẫu 
 mau='anhmau'; %tạo cơ sở dữ liệu ảnh mẫu 
 T = taoCSDL1(mau); % tính giá trị eigenface của tập ảnh mẫu 
 [m, A, E] = taoEF1(T); 
 anhtim = nhandien1(anhtest, m, A, E); %gọi đến chương trình nhandien1 để nhận diện ảnh 
 anhtim1=anhtim+1; 
 % ******* Đọc và truy xuất dữ liệu của tấm ảnh nhận dạng được từ file Excel ************ 
 file = [pwd '\hoso1.xls']; % khởi động chương trình Excel đọc file hoso1.xls 
 range = 'A2:E100'; 
 h = actxserver('Excel.Application'); % chỉ khởi động nhưng không cho hiện lên bản Excel 
 h.Visible = 0; % Visible = 0 là ẩn Visible = 1 là cho nó hiện lên 
 workbook = h.Workbooks.Open( file ); 
 Sheets = h.ActiveWorkBook.Sheets; 
 Sheets.Item(1).Activate; 
 s1=strcat('A',num2str(anhtim1)); % gọi ô nhớ chứa thông tin trong file EXCEL 
 s2=strcat('B',num2str(anhtim1)); 
 s3=strcat('C',num2str(anhtim1)); 
 s4=strcat('D',num2str(anhtim1)); 
 s5=strcat('E',num2str(anhtim1)); 
 h.Range(s1).Select; % Truy xuất thông tin cá nhân của tấm ảnh nhận 
 t1 = h.get('Selection').Value; % dạng trong flie Excel(hoso1. xls) theo đúng tên của 
 h.Range(s2).Select; % bức ảnh mẫu nhận dạng 
 t2 = h.get('Selection').Value; 
 h.Range(s3).Select; 
 t3 = h.get('Selection').Value; 
 h.Range(s4).Select; 
 t4 = h.get('Selection').Value; 
 h.Range(s5).Select; 
 t5 = h.get('Selection').Value; 
 set(handles.ten,'string',t1); %hiện thông tin cá nhân của tấm ảnh nhận dạng 
 set(handles.ns,'string',t2); 
 set(handles.mssv,'string',t3); 
 set(handles.lop,'string',t4); 
 set(handles.quequan,'string',t5); 
 axes(handles.axes3); % Hiện ảnh vừa nhận diện 
 imshow(strcat('hoso\',t3,'.jpg')); 
 workbook.Close(false); % Đóng và thoát chương trình Excel 
 h.Quit; 
 delete(h); 
end 
*******Đoạn code tạo cơ sở dữ liệu của chương trình nhận dạng***** 
function T = taoCSDL1(mau) 
 csdl = dir(mau); 
soanh = 0; 
for i = 1:size(csdl,1) 
 if not(strcmp(csdl(i).name,'.')|strcmp(csdl(i).name,'..')|strcmp(csdl(i).name,'Thumbs.db')) 
 soanh = soanh + 1; 
 end 
end 
T = []; % tạo ma trận ảnh trong thư mục ảnh mẫu 
for i = 1 : soanh 
 str = int2str(i); 
 str = strcat('\',str,'.jpg'); 
 str = strcat(mau,str); % Lấy đầy đủ tên của bức ảnh 
 img = imread(str); 
Phụ lục 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
 img = rgb2gray(img); 
 [dong cot] = size(img); 
 tam = reshape(img',dong*cot,1); % Biến ảnh thành vector 
 T = [T tam]; % Tăng dần kích thước ma trận ảnh T 
end 
*********Đoạn code tính Eigenface trung bình************ 
function [m, A, E] = taoEF1(T) 
 m = mean(T,2); %Tính toán giá trị ảnh trung bình 
soanh = size(T,2); 
%%%%%%%%%%%%%% Tính độ lệch của bức ảnh với gí trị trung bình của ảnh trung bình 
A = []; 
for i = 1 : soanh 
 temp = double(T(:,i)) - m; % T(:,i): vector cột thứ i chính là 1 bức 
 A = [A temp]; 
end 
L = A'*A; % Tính ma trận A*A’ 
[V D] = eig(L); % tim các vector riêng và trị riêng 
%V chứa những vector riêng, còn D chứa những trị riêng trong đó vector riêng V(:,i) ứng với trị riêng D(i,i) 
D1=diag(D); 
D1=sort(D1); 
s=size(D1);s=s(1); 
D1=D1(s-10); 
LeigV = []; 
for i = 1 : size(V,2) 
 if( D(i,i)>D1 ) 
 LeigV = [LeigV V(:,i)]; 
 end 
end 
 E = A * LeigV; 
 sovector=size(E,2); 
for i=1:sovector 
 dodai=norm(E(:,i)); 
 E(:,i)=E(:,i)/dodai; 
end 
*****Đoạn code nhandien1 của chuong trình nhận dạng khuôn mặt************* 
function anhtim = nhandien1(anhtest, m, A, E) 
toado = []; %Tập tọa độ hình chiếu của các bức ảnh trong csdl 
sovector = size(E,2); %số vector riêng trong E là số 
for i = 1 : sovector 
 tam = E'*A(:,i); %tọa đô hình chiếu của bức ảnh Ai 
 toado = [toado tam]; 
end 
tam = rgb2gray(anhtest); % chuyển ảnh màu thành ảnh trắng đen 
[dong cot] = size(tam); 
InImage = reshape(tam',dong*cot,1); 
dolech = double(InImage)-m; 
toadoKT = E'*dolech; 
khoangcach = []; % tính khoảng cách của tấm ảnh so với các ảnh mẫu 
for i = 1 : sovector % xác định khoảng cách ngắn nhất 
 q = toado(:,i); 
 tam = ( norm( toadoKT - q ) )^2; 
 khoangcach = [khoangcach tam]; 
Phụ lục 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
end 
[minKC , vitri] = min(khoangcach); 
if minKC<50000000 
 anhtim=vitri; 
elseif minKC>50000000 
 anhtim =100; 
end 
%%********Đoạn code liên quan*******%% 
******* Đoạn code lưu ảnh********* 
if s==255 % kiểm tra ảnh chọn lưu có phải là ảnh hay không 
 selection = questdlg(['No la anh trang do ban co luu khong?'],... 
 ['Luu ' 'anh da chon!'],... 
 'Yes','No','Yes'); %Đưa ra bản thông báo nếu nó lá ảnh trắng 
 if strcmp(selection,'No') % chọn “No” để quay lại chương trình 
 return; 
 elseif strcmp(selection,'Yes') 
 [filename,pathname]=uiputfile({'*.jpg','JPEG Files(*.jpg)';... 
 '*.bmp','Bitmap Files(*.bmp)';'*.gif','GIF Files(*.gif)';... 
 '*.tif','TIFF Files(*.tif)';... 
 '*.*','all image file'},'Luu anh da chon!','anhkq/'); 
 imwrite(s,[pathname,filename]); 
 end 
else % nếu ảnh lưu không phải là ảnh trắng 
 [filename,pathname]=uiputfile({'*.jpg','JPEG Files(*.jpg)';... 
 '*.bmp','Bitmap Files(*.bmp)';'*.gif','GIF Files(*.gif)';... 
 '*.tif','TIFF Files(*.tif)';... %đặt tên và chọn loại ảnh muốn lưu 
 '*.*','all image file'},'Luu anh da chon!','anhkq/'); %thực hiện lưu ảnh 
 imwrite(s,[pathname,filename]); 
end 
********* Đoạn code chọn ảnh ******* 
[filename,pathname]=uigetfile({'*.jpeg;*.jpg;*.gif;*.tif;*.tiff;*.bmp;*.png',... 
 'all image file';'*.jpg;*.jpeg','JPEG Files(*.jpg,*.jpeg)';... % chọn đường dẫn nơi chứa ảnh test 
 '*.gif','GIF Files(*.gif)';'*.tif;*.tiff','TIFF Files(*.tif,*.tiff)';... 
 '*.bmp','Bitmap Files(*.bmp)';'*.png','PNG Files(*.png)'},'Chon anh kiem tra! ','anhtest/1.png'); 
anhchon=imread([pathname,filename]); % đọc ảnh đã chọn 
axes(handles.axes1); 
imshow(anhchon); % hiện ảnh chọn 
a=strcat('anhluu/anh_goc.jpg'); 
imwrite(anhchon,a); 
**********Đoạn code xóa ảnh ******** 
a=255; % tạo ra ảnh trắng 
 a1=strcat('anhluu/anh_goc.jpg'); imwrite(a,a1); % biến tát cả các ảnh đang hiện thành ảnh trắng 
a1=strcat('anhluu/anh1.jpg'); imwrite(a,a1); 
a1=strcat('anhluu/anh2.jpg'); imwrite(a,a1); 
a1=strcat('anhluu/anh3.jpg'); imwrite(a,a1); 
a1=strcat('anhluu/anh4.jpg'); imwrite(a,a1); 
a1=strcat('anhluu/anh_face.jpg'); imwrite(a,a1); 
a1=strcat('anhluu/anh_kq.jpg'); imwrite(a,a1); 
a1=strcat('anhluu/anhtest.jpg'); imwrite(a,a1); 
 a1=255; 
axes(handles.axes1); imshow(a1); % hiện ảnh trắng lên các ô ảnh 
axes(handles.axes2); imshow(a1); 
axes(handles.axes3); imshow(a1); 
axes(handles.axes4); imshow(a1); 
axes(handles.axes5); imshow(a1); 
Phụ lục 
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu 
 Bùi Ngọc Liêm 
axes(handles.axes6); imshow(a1); 
axes(handles.axes7); imshow(a1); 
 set(handles.ten,'string',' '); % xóa các dòng dữ liệu thông tin nhận dạng 
 set(handles.ns,'string',' '); 
 set(handles.mssv,'string',' '); 
 set(handles.lop,'string',' '); 
 set(handles.quequan,'string',' '); 
******* Đoạn code thoát******** 
selection = questdlg(['Close ' get(handles.figure1,'Name') '?'],... % Đưa ra câu hỏi 
 ['Close ' get(handles.figure1,'Name') '...'],... 
 'Yes','No','Yes'); % tạo bản lựu chọn có hai nút hỏi “Yes”, “No” 
if strcmp(selection,'No') % nếu chọn “No” quay laị chương trình 
 return; 
end % Nếu chọn Yes thoát khỏi chương trình 
delete(handles.figure1) 
            Các file đính kèm theo tài liệu này:
 Dò tìm và cắt ảnh mặt người dùng PCA.pdf Dò tìm và cắt ảnh mặt người dùng PCA.pdf