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 |
Chia sẻ: lvcdongnoi | Lượt xem: 3010 | 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