CHƯƠNG I
DẪN NHẬP
1.1 Đặt Vấn Đề:
Có thể nói tất cả những gì mà con người tạo ra đều mang một ý nghĩa thiết thực nào đó, dù lớn hay nhỏ nhưng nó cũng góp phần vào sự phát triển của nhân loại. Xu hướng phát triển sẽ góp phần làm cho xã hội phát triển hơn, những ứng dụng của các đề tài nghiên cứu đều chúng mình điều đó. MatLab cũng không ngoại lệ, với những công cụ dễ sử dụng và gần gủi với con người, góp phần tạo nên nhiều thành quả ứng dụng như: điện tử, sinh học, môi trường Đi theo xu hướng đó, chúng em khảo sát đề tài: HỆ THỐNG BẢO MẬT – với việc sử dụng MatLab làm công cụ để nhận dạng mặt người đồng thời xuất dữ liệu ra cổng COM để tiến hành đóng hoặc mở cửa ra vào.
1.2 Tầm Quan Trọng Của Đề Tài:
- Việc thực hiện đề tài này, chúng em hiểu thêm nhiều điều lý thú về chuyên ngành mà chúng em đang học, và điều đó có thể là một động lực, kiến thức căn bản để làm việc sau khi ra trường.
- Việc làm ra của cải vật chất thì rất khó vì vậy phải biết giữ gìn và biết quý trọng nên với đề tại này có thể thêm một công cụ giúp chúng ta gìn giữ vật chất một cách an toàn.
1.3 Giới Hạn Đề Tài:
- Đề tài hoạt động tương đối vì kỹ năng kết hợp giữa ngôn ngữ lập trình MatLab chúng em còn kém cộng thêm xuất dữ liệu ra cổng COM.
- Do kiến thức của chúng em còn hạng hế nên việc thực hiện đề tài không tránh những sai xót trong tính toán và thi công. Vì vậy mong quý Thấy (Cô) chỉ dẫn và đóng góp ý kiến thêm.
1.4 Mục Đích Nghiên Cứu:
- Sử dụng những kiến thức đã học để ứng dụng trong thực tế.
- Để hiểu sâu hơn những kiến thức đã học, kiểm tra kiến thức lý thuyết với kiểm nghiệm thực tế.
- Đồng thời chúng em cũng trang bị cho mình một hệ thống kiến thức riêng nhằm phục vụ lợi ích cá nhân.
CHƯƠNG 5
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI
5.1 Nhận Xét Chung:
- Với việc thực hiện đề tài “ HỆ THỐNG BẢO MẬT” chúng ta có thể giám sát quang cạnh hay đối tượng cần nghiên cứu. Với việc sử dụng thuật toán PCA sẽ tăng khả năng ổn định nhưng chưa hài hòa.
- Mạch chạy và hoạt động đúng nhưng khả năng chính xác khoảng định 80% do thuật toán không hiệu quả tối đa.
5.2 Khả Năng Ứng Dụng Vào Thực Tế:
- Ta có thể gắn hệ thống của mạch vào vị trí muốn cảnh báo người qua lại, hay muốn xác định người nào có quyền ra vào một nơi. Cũng có thể giám sát ở ngân hàng, cơ quan nhà nước hay nơi quân sự.
- Chi phí tiến hành lặp đặt thấp nên có thể áp dụng rộng rãi trong thực tế.
5.3 Hướng Phát Triển Đề Tài:
- Với đề tài “ HỆ THỐNG BẢO MẬT” ta có thể phát triển nhiều kênh báo động hay bảo mật cho các khu vực. Nghĩa là cùng một lúc ta có thể ngăn chặn được sự xâm phạm từ bên ngoài vào và giám sát được khu vực.
- Ta cũng có thể triển khai mạch này trong nhiều mục đích khác như: dùng trong thiết bị chống trộm, mạch gác cửa tại khu quân sự, chính trị.
- Với đề tài trên ta có thể phát triển để nhận dạng thí sinh vào phòng thi, nhận dạng chứng minh nhân dân .
77 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 3021 | Lượt tải: 3
Bạn đang xem trước 20 trang tài liệu Đồ án Hệ thống bảo mật, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ám mây với đường thẳng được đo bằng quán tính của nó theo đường thẳng đó. Muốn vậy, trong không gian đang xét, cần xác định một tích vô hướng gắn với một ma trận nào đó.
- Vì quán tính là tổng bình phương khoảng cách từ các điểm đến đường thẳng, nên quán tính càng nhỏ thì đường thẳng càng gần đám mây điểm, và ngược lại.
Hình 3.1 Không gian đám mây điểm
- Gọi trục chính thứ nhất là trục mà quán tính nhỏ nhất, tức là đường thẳng qua tâm gần đám mây điểm nhất.
- Tìm tiếp trục chính thứ hai là trục qua tâm trực giao với trục chính thứ nhất, và quán tính của đám mây theo nó nhỏ nhất. Hai trục chính này tạo thành mặt phẳng chính thứ nhất, mặt phẳng mà quán tính của đám mây theo nó nhỏ nhất. Khi đó đám mây điểm thể hiện trên nó rõ nhất so với mọi mặt phẳng khác.
- Tiếp tục, tìm trục chính thứ ba là đường thẳng qua tâm, trực giao với hai trục chính trên vả gần đám mây nhất sau hai trục chính thứ nhất và thứ hai. Với sự có mặt của trục này ta được thêm hai mặt phẳng chính nữa, được tạo nên do trục 1 và trục 3, trục 2 và trục 3.
- Nếu việc tìm các trục chính được tiến hành đến trục chính thứ q (q ≤ p, n) thì ta được một hệ q vector trực giao, tạo thành siêu phẳng (không gian con) q chiều, mà đám mây điểm thể hiện trên nó rõ nhất.
3.2.3 Tìm Các trục chính trong RP.
Mỗi dòng của ma trân quy tâm Xn,p là một vector (điểm cá thể) trong không gian Rp. Tích vô hướng trong gắn với ma trận đơn vị I, tức là có dạng xTy Rp.
- Gọi Δ là đường thẳng qua gốc (gốc trùng với trọng tâm O), đường thẳng
này là giá của vector đơn vị u (u nằm trên Δ), uTu=1.
- Gọi Mi là điểm thứ I của R, tương ứng với vector xi. Hình chiếu trực giao OH, của vector OMi trên Δ có độ dài là:
= (OMi)u = xiu (3.5)
trong đó, tất nhiên, uT=(u1,u2,…up).
- Khi đó rõ ràng rằng tích: Xu= (3.6)
là vector n chiều mà phần tử thứ i (i=) của nó là độ dài hình chiếu của vector xtrên Δ.
Hình 3.2 Vector thành phần trình chiếu trên trục tọa độ
- Theo tiêu chuẩn bình phương nhỏ nhất, ta cần tìm:
- Theo định lý Pythagore:
Vì = const ( tổng bình phương các toạ độ ban đầu), nên việc tìm tương đương với việc tìm tức là max uTXTu.
- Như vậy, để tìm trục chính thức nhất ta tìm u1 sao cho:
uXTXu1 max. (3.7)
với điều kiện: uui = 1. (3.8)
- Ta có:
XTX = M0 = ();j,k=
Là ma trận quán tính, cũng là ma trận phương sai – hiệp phương sai.
3.2.4 Giá trị riêng và vector riêng của XXT:
- Từ phương trình 3.7 và 3.8 ta có phương trình tương đương như sau:
Tìm u1 sao cho:
uM0 u1 - (uu1 – 1) max (3.9)
trong đó là nhân tử Lagrange.
- Muốn vậy, phải có:
[uM0 u1 - (uu1 – 1) ]= 0
- Tức là:
M0u1 - u1 = 0
- Hay (M0 - I)u1 = 0 (3.10)
- Vậy là giá trị riêng và ui là vector riêng của ánh xạ f – cho tương ứng mỗi xi RP (i =) một điểm trên đường thẳng gần các điểm xi nhất. - Nói cách khác tìm trục chính Rp có nghĩa là các giá trị riêng và vector riêng của ma trận quán tính M0.
Hình 3.3 Thành phần chính PCA trên mặt phẳng
Ta giải phương trình:
Ta được các trị riêng: λ1 ≥ λ2 ≥….≥ λp. Chọn giá trị lớn nhất λ1, ta được vector riêng tương ứng u1,||u1||2=1, do đó xác định được Δ1.
Chú ý công thức:
Trong đó N là ký hiệu đám mây điểm – cá thể trong RP.
Kết hợp (3.10) ta được:
Giá trị riêng lớn nhất λ1 của M0 bằng quán tính giải thích N bởi đường thẳng Δ1 gần đám mây điểm N nhất, và u1 là vector riêng của M0 nằm trên Δ1. Đường thẳng Δ1 là trục chính thứ nhất.
Tìm tiếp trục chính thứ hai Δ2, trực giao Δ1, sao cho IN(Δ2) nhỏ nhất.
Muốn vậy ta giải hệ:
Bằng phương pháp nhân tử Lagrange, ta buộc:
[uM0 u1 - (uu1 – 1) - ]= 0
hay:
Nhân trái với u1, ta được:
hay:
Vì M0u1 -u1 = 0, và nên phải có µ = 0.
Do đó (2.3.12) trở thành:
Và λ lại trở thành nghiệm của phương trình bậc p (2.3.8): |M0 - I| = 0
Giá trị riêng lớn thứ hai λ2 cho tương ứng vector riêng u=u2 và do đó cho trục chính thứ hai Δ2.
Để tìm trục chính thứ q, Δq (q≤p, n), ta giải hệ:
Với mọi j=1,2,…..q-1
Kết quả lại có λq là nghiệm của: |M0 - I| = 0
Tương tự ta có:, j=
Chú ý: Thực ra, để tìm các trục chính chỉ cần dựa vào tính chất 1 của ma trận đối xứng (vì ma trận phương sai – hiệp phương sai M0 đối xứng).
Với q trục chính (q<p, n) ta lập được siêu phẳng F của RP, sao cho IN(F) nhỏ nhất. Siêu phẳng này có một cơ sở trực chuẩn là q vector riêng gán với q giá trị riêng lớn nhất λ1≥ λ2 ≥….≥λq của Mo.
3.3 Bài Toán Nhận Dạng Mặt Người Dùng Thuật Toán PCA:
Hơn một thập kỷ qua có rất nhiều công trình nghiên cứu về bài toán xác định khuôn mặt người từ ảnh đen trắng, xám đến ảnh màu như ngày hôm nay. Các nghiên cứu đi từ bài toán đơn giản, mỗi ảnh chỉ có một khuôn mặt người nhìn thẳng vào thiết bị thu hình và đầu ở tư thế thẳng đứng trong ảnh đen trắng. Cho đến ngày hôm nay bài toán mở rộng cho ảnh màu, có nhiều khuôn mặt trong cùng một ảnh, có nhiều tư thế thay đổi trong ảnh. Không những vậy mà còn mở rộng cả phạm vi từ môi trường xung quanh khá đơn giản (trong phòng thí nghiệm) cho đến môi trường xung quanh rất phức tạp (như trong tự nhiên) nhằm đáp ứng nhu cầu thật sự của con người.
3.3.1 Xác định khuôn mặt người:
- T là một ma trận kích thước M*NxP chứa tất cả ảnh trong csdl, mỗi ảnh là một vector cột trong ma trận T.
- Theo thuật toán PCA, đầu tiên ta sẽ tính ra m là trung bình của tất cả các ảnh trong ma trận T, dùng hàm “ mean” của MatLab.
- Sau đó, ta sẽ lấy từng bức ảnh trong T trừ cho ảnh trung bình, ta sẽ được một ma trận A kích thước M*NxP.
- Ta cần tìm Eigenface là những vector riêng của ma trận A*A’, những ma trận A*A’ kích thước M*NxM*N quá lớn, ta sẽ tìm những vector riêng cả ma trận A’*A kích thước PxP. Ta sẽ tìm những vector riêng bằng hàm eig trong MatLab.
- Giả sử v là một vector riêng của ma trận A’*A, khi đó A*v là vector riêng của ma trận A*A’.
- Tập hợp những vector riêng của ma trận A*A’ gọi là Eigenfaces.
- Trả về giá tri:
- m: là ảnh trung bình.
- A: là tập hợp những ảnh - ảnh trung bình.
- E: là những vector riêng của ma trận A*A’.
- P ảnh – P vector: T1,T2….TP.
- Vector ảnh trung bình: m =
- Ai = Ti - m, i= 1….P, A =[A1 A2 …..AP]
- Tìm một cơ sở trực chuẩn:
nếu I = j
nếu I j
= lớn nhất.
Trong đó:
- uk là vector riêng của AAT.
- là trị riêng tương ứng của AAT.
- H là bức ảnh M x N suy ra H là vector M*N chiều. K = H –m.
Trong đó:
- Kf là hình chiếu K.
- C = ETK là tọa độ của Kf
- Size(C) = Q x 1;
- Kf = với ci = C(i,1); ei = E(:,i).
- Ai = A(:,i) là ảnh thứ i trong csdl.
- Ci = ETAi là tọa độ Aif.
- Xác định khuôn mặt giống nhau của cùng một người.
- s= là khoảng cách từ H đến không gian mặt.
- si = là khoảng cách từ H đến bức ảnh Ti.
- So sánh và là hai ngưỡng nào đó.
- s < : H là bức ảnh khuôn mặt.
- si < : Ti và H là ảnh cùng 1 người.
- Như ta thấy nếu bức ảnh là khuôn mặt người thì hình chiếu sẽ khá giống với ảnh gốc, còn khi bức ảnh không phải là khuôn mặt thì hình chiếu sẽ khác ảnh gốc rất nhiều, do đó khoảng cách từ bức ảnh mặt người tới không gian mặt sẽ nhỏ hơn rất nhiều so với khoảng cách từ bức ảnh không phải mặt người tới không gian mặt.
- Cho bảng số liệu với rất nhiều cột và dòng, mỗi cột là một biến, mỗi dòng là một cá thể, trên đó đo đồng thời giá trị các biến. Ta cần biết mối quan hệ giữa các biến, giữa các cá thể qua thể hiện rõ nhất trong một không gian con số chiều ít hơn.
3.3.2 Tìm thành phần chính của một ma trận
Bước 1: Xác định ma trận của ảnh.
Giả sử ta có ma trận T = tương ứng là 3 ảnh. Ta sẽ tính được ảnh trung bình của ma trận này theo hàm m=mean(T,2).
m=
Theo công thức: m = .
Sau đó ta sẽ lấy từng bức ảnh trong T trừ cho ảnh trung bình, ta sẽ được một ma trận A.
A=
Theo công thức: Ai = Ti - m, i= 1….P, A =[A1 A2 …..AP].
Bước 2: Ma trận phương sai – hiệp phương sai.
- Ma trận quán tính:
L = A’.A
= .
= .
Trong đó: A’ là ma trận chuyển vị của ma trận A.
A= thì A’ =
Bước 3: Quá trình tìm vector riêng và trị riêng:
- Phương trình phương sai và hiệp phương sai.
M0 = A’.A= L =
- Tìm trị riêng từ định thức của ma trận:
= 0
Triển khai ma trận này ta sẽ được: Giải phương trình này ta được 3 nghiệm phân biệt là các trị riêng của ma trận:
Để tìm các vecto riêng từ những trị riêng này ta phai giải phương trình sau:
- Ứng với trị riêng ta có phương trình:
- Tức là hệ phương trình:
Nghiệm của hệ phương trình thuần nhất (tức vế phải bằng 0) này là vô định, vì định thức của ma trận hệ số bằng 0 ( |A-(2,1)I|=0).
- Trong hệ 3 phương trình trên, một phương trình là tổ hợp tuyến tính của hai phương trình còn lại, nên chỉ cần giữ lại hai phương trình:
- Từ đó rút ra:
Để đơn giản, giả sử giá trị riêng đó đều thực và khác nhau, chuẩn của các vector riêng x đều bằng 1 (||V||2 = VTV =1).
- Như vậy, vector riêng ứng với giá trị riêng l1 ≈ 5,94 là:
V1T=(k1;-0,803k1;-0,1974k1)
trong đó k1 là số thực bất kỳ.
- Suy ra, vector riêng thứ nhất là:
V1T=(-0,7705; 0,6192; 0,1513).
- Tương tự, với l2 ≈ 0,00243 thì vector riêng tương ứng xấp xỉ:
V2T=(-0,2701;-0,5322;0,8024).
và với l3 ≈1,51 thì vector riêng và:
V3T=(0,5774;0,5774;0,5774).
Dễ dàng thử được rằng: zT1z2 ≈ zT2z3 ≈ zT3z1 ≈ 0, tức là z1, z2 và z3 tạo thành hệ trực giao.
Bước 4: Tìm tọa độ hình chiếu.
- Ta có: Z = A*V
- Tọa độ các cá thể trên trục thứ nhất:
Z11 = A1 . V1 = -0,3333 . (- 0,7705) + 0,6667 . 0,6192 – 0,3333 . 0,1513
= 0,1056
Z21 = A2 .V1 = -2,3333 . (- 0,7705) + 0,6667 . 0,6192 – 1,6667 . 0,1513
= 2,462
Z31 = A1 . V1 = 2,3333 . (- 0,7705) -1,6667 . 0,6192 – 0,6667 . 0,1513
= - 1.6937
Z41 = A1 . V1 = -1,3333 . (- 0,7705) + 2,6667 . 0,6192 – 1,3333 . 0,1513
= 2,4768
Z51 = A1 . V1 = 2,3333 . (- 0,7705) – 1,6667 . 0,6192 – 0,6667 . 0,1513
= - 2,9307
- Tọa độ các cá thể trên trục thứ hai:
A*V2 = =
Hình 3.4 Tọa độ điểm trên cùng không gian
CHƯƠNG 4
GIAO TIẾP VỚI MÁY TINH QUA CỔNG NỐI TIẾP
4.1. TỔng Quan Về Giao Tiếp Máy Tính
- Để có thể tiến hành điều khiển hoặc giám sát các quá trình thực hiện bằng máy tính, trước hết phải có mối liên hệ cần thiết giữa máy tính và thế giới bên ngoài. Cổng giao lưu với thế giới bên ngoài được mở rộng bằng giao diện.Đối với máy tính PC tuân theo chuẩn công nghiệp có thể thực hiện các khả năng ghép nối sau:
- Sử dụng card mở rộng được cắm vào máy tính ( phương pháp này đạt được tốc độ truy nhập lớn nhất nhưng chi phí cao).
- Các giao diện đã được tiêu chuẩn hóa đóng vai trò ghép nối máy tính với các mạch điện bên ngoài.Cách ghép nối qua cổng nối tiếp thường được lựa chọn vì chi phí thấp.
- Ghép nối với một bộ vi xử lý riêng để thực hiện những bài toán khác mà không cần trao đổi dữ liệu với máy tính.
- Các giao diện có trên máy tính PC như giao diện nối tiếp,giao diện song song và cả cổng trò chơi (game port) cho phép sử dụng trực tiếp làm giao diện.
4.2 .Cấu Trúc Cổng Nối Tiếp ( cổng COM):
Cổng nối tiếp có các ưu điểm sau:
- Khoảng cách truyền xa hơn cổng song song.
- Số dây kết nối ít.
- Có thể truyền không dây dùng hồng ngoại.
- Có thể ghép nối với vi điều khiển hay PLC.
- Cho phép nối mạng.
- Có thể tháo lắp thiết bị trong lúc máy tính đang làm việc.
- Có thể cung cấp nguồn cho các mạch điện đơn giản.
Hình 4.1. Cấu trúc cổng nối tiếp( cổng COM)
4.3.Các Chuẩn Giao Tiếp Nối Tiếp
Thường sử dụng nhiều nhất là chuẩn RS-232 và RS-485. Ở đồ án này chỉ sử dụng chuẩn RS-232.
- Chuẩn RS -232: Tín hiệu truyền theo chuẩn RS-232 của EIA (Electronics Industry Associations). Chuẩn RS-232 qui định mức logic 1 ứng với điện áp từ -3V đến -25V, mức logic 0 ứng với điện áp từ 3V đến 25V và có khả năng cung cấp dòng từ 10mA đến 20mA. Ngoài ra, tất cả các ngõ ra đều có đặc tính chống chập mạch.
- Chuẩn RS-232 cho phép truyền tín hiệu với tốc độ đến 20.000 bps nhưng nếu cáp truyền đủ ngắn có thể lên đến 115.200 bps. Chuẩn RS-232 chỉ có thể kết nối nhiều nhất hai thiết bị, với khoảng cách dài nhất (12,7 m đến 25,4 m).
- Chuẩn RS-485: có thể kết nối tối đa là 32 thiết bị, khoảng cách dài hơn tối đa là (1016m đến hơn 1km) gấp 40 lần RS-232. Tốc độ cao 10Mbs/s.
- Các đặc tính kỹ thuật của chuẩn RS-232:
Các tốc độ truyền dữ liệu thông dụng trong cổng nối tiếp là: 1200bps, 4800bps, 9600bps, 19200 bps.
4.4 Định Dạng Dữ Liệu
Sau đây giới thiệu về cách định dạng dùng trong truyền thông nối tiếp.
- Định dạng đồng bộ: Trong truyền đồng bộ, mọi thiết bị dùng một xung đồng hồ được phát ra bởi một thiết bị hoặc từ một nguồn xung ngoài. Xung đồng hồ có thể có một tần số cố định hoặc có thể chốt tại những khoảng thời gian không đều. Mọi bít truyền đi được đồng bộ với đồng hồ.
- Định dạng không đồng bộ: Trong truyền không đồng bộ, liên kết không bao gồm đường xung đồng hồ, bởi vì mỗi điểm đầu cuối của liên kết đã có xung đồng hồ cho riêng từng cái. Mỗi điểm sẽ cần phải đồng ý cùng một tần số của đồng hồ và mọi đồng hồ chỉ khác nhau một vài %. Mỗi byte truyền đi bao gồm bít Start để đồng bộ đồng hồ và một hoặc nhiều bít Stop cho tín hiệu kết thúc việc truyền trong mỗi một từ được truyền đi. Cổng RS-232 trong PC dùng định dạng không đồng bộ để giao tiếp với modems (thiết bị mã hoá, giải mã dữ liệu) và các thiết bị khác. Dù RS-232 có thể truyền dữ liệu đồng bộ nhưng liên kết không đồng bộ vẫn được dùng phổ biến 485 hơn.
- Truyền thông nối tiếp sử dụng hai phương pháp đồng bộ và dị bộ. Phương pháp đồng bộ truyền một khối dữ liệu ( các ký tự) tại cùng thời điểm trong khi đó truyền dị bộ chỉ truyền từng byte một. Có thể viết phần mềm để sử dụng một trong hai phương pháp này.
4.5 MAX 232:
MAX232 thuộc họ IC MAX220 ÷ MAX249 được sản xuất cho truyền thông EIA/TIA – 232E và V.28/V.24, cụ thể là cho những ứng dụng mà không có sẵn điện áp ±12V.
4.5.1 Sơ đồ chân:
Hình 4.2 : Sơ đồ chân của MAX232
4.5.2 Chức năng các chân:
- Chân 1, 2, 3, 4, 5, 6: mắc với 4 tụ bên ngoài để biến đổi điện áp từ 0 ÷ 5V thành điện áp -12V ÷ +12V để phù hợp cho truyền thông theo tiêu chuẩn RS232.
- Chân 7, 8, 9, 10, 11, 12, 13, 14: là các chân vào, ra của 4 bộ khuyếch đại đảo nhằm chuyển từ mức TTL ra chuẩn RS232 và ngược lại.
- Chân 15: nối mass.
- Chân 16: nối nguồn.
Hình 4.3 Sơ đồ khối bên trong MAX232 và các linh kiện mắc bên ngoài theo dạng chuẩn
4.5.3 Nối Ghép 89V51RB2 Với RS232:
- Nội dung chính của phần này là nói về nối ghép 89C51 với các đầu nối RS232 thông qua chip MAX232. Chíp 89C51 có hai chân được dùng chuyên cho truyền và nhận dữ liệu nối tíêp. Hai chân này được gọi là TxD và RxD và là một phần của cổng P3 ( P3.0 và P3.1). Chân 11 của 89C51 là P3.1 được gán cho TxD và chân 10 (P3.0) được dùng cho RxD. Các chân này tương thích với mức logic TTL. Do vậy chúng đòi hỏi một bộ điều khiển đường truyền để chúng tương thích với RS232. Một bộ điều khiển như vậy là chip MAX232.
- Bộ điều khiển đường truyền MAX232: MAX232 chuyển đổi từ các mức điện áp RS232 sẽ về mức điện áp TTL và ngược lại. Một điểm mạnh của chip MAX232 là nó dùng điện áp ngưỡng +5V cùng với điện áp nguồn của 89C51.
P3.1
TxD
P3.0
RxD
Max232
80511
Vcc
2
6
7
8
9
11
10
5
4
112
10
14
13
T1OUT
T1IIN
R1IIN
R1OUT
T2IIN
R2OUT
T2OUT
R2IIN
RS232 side
TTL side
15
16
DB - 9
122
C3
+
C4
+
2
2
5
2
3
+
C1
+
C2
Hình 4.4 a) Sơ đồ bên trong của MAX232
b) Sơ đồ nối ghép của MAX232 với 89C51
CHƯƠNG 5
TỔNG QUAN VỀ VI ĐIỀU KHIỂN
5.1. Tổng Quan Về Vi Điều Khiển:
- Bộ vi điều khiển viết tắt là micro-controller, là mạch tích hợp trên 1 chip có thể lập trình được, dùng để điều khiển hoạt động của một hệ thống.
- Trong các thiết bị điện và điện tử dân dụng , các bộ vi điều khiển điều khiển hoạt động của tivi, máy giặt, lò vi ba…Trong hệ thống sản xuất tự động , bộ vi điều khiển được sử dụng trong Robot, dây chuyền tự động. Các hệ thống càng “thông minh” thì vai trò của hệ thống vi điều khiển càng quan trọng.
5.2 Vi Điều Khiển 89V51RB2
Hình 5. 1: Sơ đồ chân của 89V51RB2
IC 89C51 là IC vi điều khiển có 40 chân, hình dạng IC vi điều khiển 89C51 như hình trên.
MCS-51 là họ vi điều khiển của hãng Intel. Vi mạch tổng quát của MCS-51 là 89C51. Chip 89C51 có một số đặc trưng cơ bản sau:
- Bộ nhớ chương trình bên trong: 4KB (ROM).
- Bộ nhớ dữ liệu bên trong: 128 byte (RAM)
- Bộ nhớ chương trình bên ngoài: 64KB (ROM)
- Bộ nhớ dữ liệu bên ngoài: 64 KB (RAM)
- Có 4 port xuất nhập (I/O port) 8 bit
- 2 bộ định thời 16 bit
- Mạch giao tiếp nối tiếp
- Bộ xử lý bit (thao tác trên các bit riêng lẻ)
- 210 vị trí nhớ được định địa chỉ, mỗi vị trí một bit
- Nhân / chia trong 4 us
5.3 Chức Năng Các Chân Của Chip 89V51RB2:
- Port 0 (P0.0 – P0.7): số chân từ 32-39
Chức năng: Port xuất nhập dữ liệu (P0.0 – P0.7) không sử dụng bộ nhớ ngoài. Mộ chức năng thứ 2 là dùng làm bus địa chỉ byte thấp và bus dữ liệu đa hợp (AD0 – AD7) có sử dụng bộ nhớ ngoài.
Lưu ý: Khi port 0 đóng vai trò là port xuất nhập dữ liệu thì phải sử dụng các điện trở kéo lên bên ngoài.
- Port 1 (P1.0 – P1.7): có số chân từ 1 – 8
Chức năng: xuất nhập dữ liệu (P1.0 – P1.7) sử dụng hoặc không sử dụng bộ nhớ ngoài.
- Port 2 (P2.0 – P2.7) có số chân từ 21 – 28
Chức năng: xuất nhập dữ liệu (P2.0 - P2.7) không sử dụng bộ nhớ ngoài.
Chức năng thứ 2 dùng làm bus địa chỉ byte cao (A8 – A15) có sử dụng bộ nhớ ngoài.
- Port 3 (P3.0 – P3.7) có số chân từ 10 – 17
Chức năng: xuất nhập dữ liệu (P3.0 – P3.7) không sử dụng bộ nhớ ngoài hoặc các chức năng đặc biệt. Chức năng thứ 2 là dùng làm các tín hiệu điều khiển có sử dụng bộ nhớ ngoài hoặc các chức năng đặc biệt.
PHẦN B
SƠ ĐỒ NGUYÊN LÝ
CHƯƠNG TRÌNH MATLAB
CHƯƠNG 1:
SƠ ĐỒ KHỐI - NGUYÊN LÝ HOẠT ĐỘNG PHẦN CỨNG
1.1 Sơ Đồ Khối Giao Tiếp Giữa MatLab Với Vi Điều Khiển:
Khởi Động
Nhận
Dữ Liệu
Phím
RI = 1
A = # 82H
Mở Cửa
Dừng
Đóng Cửa
Phát
Dữ Liệu
Đ
S
S
S
Đ
Đ
1.2 Sơ Đồ Nguyên Lý:
1.3 Nguyên Lý Hoạt Động Phần Cứng:
- Sử dụng một webcam để chụp hình ảnh người và đưa vào máy tính dùng hàm trong MatLab để xử lý nhận dạng, xuất tín hiệu ra cổng Com điểu khiển động cơ đóng mở cửa.
- Ở đây có hai sơ đồ mạch chính. Mạch xử lý và mạch điều khiển động cơ. Mạch xử lý gồm vi xử lý nguồn và cổng nối tiếp RS232. Cổng nối tiếp thực hiện giao tiếp máy tinh với vi xử lý qua IC MAX232.
- Khi khởi động vi xử lý sẽ vào chế độ chuẩn bị sẵn sàng nhận dữ liệu từ máy tính gửi xuống và quét phím để xử lý. Khi có người nhấn nút yêu cầu mở cửa thi vi xử lý sẽ nhận lệnh và xử lý gửi lên máy tính giao tiếp matlab. Matlab sẽ nhận biết có dữ liệu được truyền lên (lúc này matlab đã mở công giao tiếp RS232) và thực hiện xử lý tín hiệu. Chụp ảnh và kiểm tra xem người này có trong cơ sở dữ liệu hay không. Nếu có thì matlab xuất lệnh gửi xuống vi xử lý mở của, còn không có thi matlab xuất lệnh không mở và quay trở lại trạng thái ban đầu.
- Nếu không nhấn nút mở cửa chúng ta vẫn có thể kiểm tra được trên máy tính xem người đó có được phép vào hay không. Và thực hiện truyền dữ liệu xuống vi xử lý cho mở cửa hay không. Sau khi thực hiện xong các lệnh giao tiếp matlab sẽ được đóng cổng giao tiếp lại và khi nào cần truyền hay nhận dữ liệu sẽ được mở ra lại.
- Mạch điều khiển công suất cách ly bởi opto – điều khiển động cơ quay thuận, nghịch dựa vào sự đảo chiều của rơle và kéo dòng của IRF540.
- Opto: điều khiển cách ly.
- IRF540: đóng ngắt và kéo dòng cho động cơ.
- ULN2004: cổng đệm đảo.
- Rơle: chuyển trạng thái động cơ.
- Tụ C9,10: khử nhiễu xung nhọn động cơ tạo nên.
1.4 Các Trạng Thái Hiển Thị:
D1 D2 D3 D4 D5 D6 D7 D8
Đèn báo sẵn sàn nhận dữ liệu.
D1 D2 D3 D4 D5 D6 D7 D8
Đèn báo đã thu dữ liệu xong.
D1 D2 D3 D4 D5 D6 D7 D8
Đèn báo đã nhận lệnh mở cửa và phát dữ liệu.
D1 D2 D3 D4 D5 D6 D7 D8
Đèn báo đã phát dữ liệu xong.
D1 D2 D3 D4 D5 D6 D7 D8
Đèn báo dừng lại.
D1 D2 D3 D4 D5 D6 D7 D8
Đèn báo đã thu dữ liệu xong.
D1 D2 D3 D4 D5 D6 D7 D8
Đèn báo đóng cửa lại.
D1 D2 D3 D4 D5 D6 D7 D8
Đèn báo dữ liệu không đúng.
1.5 Chương Trình Kết Nối Phần Cứng:
***************************************************
;CHƯƠNG TRÌNH ĐIỀU KHIỂN
;***************************************************
;KẾT NỐI: LED -> P1, RXD -> TXD, KEY0 -> INT0 (ACT = 0)
;***************************************************
$MOD51
ORG 00H
MAIN: MOV TMOD,#20H ; TIMER 1: MODE 2 - Tạo Baud cho Serial Port.
MOV TH1,#-26 ; BAUD RATE = 1200
SETB TR1 ; TIMER hoạt động
MOV SCON,#52H ; SERIAL: MODE 1, TI = 1, RI = 0, REN = 1. LCALL RECEI_DATA ; Gọi CTC thu dữ liệu qua Serial Port.
LCALL PHIM ; Gọi CTC quét phím
LCALL HIEN_THI ; Hiển thị và thực thi lệnh.
LCALL MAIN
;***************************************************
PHIM:
MOV R0,#50 ; Biên lặp – chống dội
KEY_NHAN:
JB INT0,EXIT1 ; Cho phím được nhận.
DJNZ R0,KEY_NHAN ; Giảm biến lặp – Chống dội (phím đã nhận).
MOV R0,#50 ; Biến lặp – Chống dội phím.
KEY_NHA:
JNB INT0,$ ; Cho phím được nhận.
DJNZ R0,KEY_NHA
MOV P1,#00H
CALL DELAY
MOV A,#0FH ; Offset của dữ liệu.
LCALL TRANS_DATA ; Gọi CTC thu dữ liệu qua Serial Port.
MOV P1,#0FFH ; Hiện LED nhận lệnh phát dữ liệu xong.
CALL DELAY
EXIT1:
RET
;***************************************************
HIEN_THI:
CJNE A,#82H,EXIT2 ; Kiểm tra dữ liệu.
MOV P1,#0FDH ; Xuất port hiện thị mở cửa.
MOV P0,#02H ; Xuất port thục thi lệnh mở cửa.
MOV R2,#12
N1: CALL DELAY ; Tạo trể một thời gian.
DJNZ R2,N1
MOV P0,#03H ; Xuất port dừng lại một thời gian.
MOV P1,#0FFH ; Xuất port hiện thị dừng lại.
CALL DELAY
CALL DELAY
DONG_CUA:
MOV P1,#0FEH ; Xuất port hiện thị đóng cửa.
MOV P0,#00H ; Xuất port đóng cửa lại.
MOV R2,#14
N2: CALL DELAY ; Tạo trễ một thời gian.
DJNZ R2,N2
MOV A,#0FFH
EXIT2:
MOV P0,#03H ; Xuất port dừng lại.
MOV P1,A ; Xuất port hiện thị dữ liệu thu được.
CALL DELAY
RET
;***************************************************
TRANS_DATA: ; CTC phát dữ liệu.
JNB TI,$ ; Kiểm tra phát xong.
CLR TI ; Xóa TI để chuẩn bị cho lần phát kế tiếp.
MOV SBUF,A ; Phát dữ liệu.
RET
;***************************************************
RECEI_DATA: ; CTC thu dữ liệu.
MOV P1,#0F0H ; Xuất port hiện thị nhận lênh thu dữ liệu.
K1: JNB INT0,EXIT3
JNB RI,K1 ; Kiểm tra thu xong.
CLR RI ; Xóa RI để chuẩn bị cho lần thu kế tiếp.
MOV A,SBUF ; Thu dữ liệu.
MOV P1,#0FH ; Xuất port hiển thị đã thu xong dữ liệu.
EXIT3:
RET
;***************************************************
DELAY:
PUSH 00H
MOV R0,#250
MOV TMOD,#01H
LOOP2:
MOV TH0,#0ECH
MOV TL0,#78H
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
DJNZ R0,LOOP2
POP 00H
RET
;***************************************************
END
CHƯƠNG 2
SƠ ĐỒ KHỐI – NGUYÊN LÝ HOẠT ĐỘNG PHẦN MỀM
2.1 Sơ Đồ Khối Matlab:
Khởi Động
Chụp Ảnh
Kiểm Tra
Huấn Luyện
Giao Tiếp
Tự Động
Nhận
Dữ Liệu
Phát
Dữ Liệu
Thoát
Giao Tiếp
Thoát
Chương
Trình
2.2 Quá Trình Xử Lý Ảnh:
2.2.1 Xử lý video và giao tiếp qua wedcam:
Chụp lại ảnh kiểm tra hiện lên giao diện và lưu ảnh vào đường dẫn thư mục cần lưu.
>> vid=videoinput('winvideo',1);
hinh=getsnapshot(vid);
imwrite(hinh,'E:\nguyen viet huy\baitapmatlab\huy\th\test\1.jpg');
delete(vid);
a=imread('E:\nguyen viet huy\baitap matlab\huy\th\test\1.jpg');
subplot(1,2,1);
imshow(a);
Ảnh chụp cần kiểm tra đưa vào máy tính như sau:
Chụp ảnh huấn luyện và lưu vào đường dẫn.
>>for i=1:15
vid=videoinput('winvideo',1);
preview(vid); pause;
closepreview(vid);
hinh=getsnapshot(vid);
if i==1
imwrite(hinh,'E:\nguyen viet huy\baitap matlab\huy\th\train\1.jpg');
delete(vid);
a=imread('E:\nguyen viet huy\baitap matlab\huy\th\train\1.jpg');
subplot(1,2,1);
imshow(a)
title('1');
pause;
elseif i==2
imwrite(hinh,'E:\nguyen viet huy\baitap matlab\huy\th\train\2.jpg');
delete(vid);
a=imread('E:\nguyen viet huy\baitap matlab\huy\th\train\2.jpg');
subplot(1,2,1);
imshow(a)
title('2');
pause;
elseif i==15
imwrite(hinh,'E:\nguyen viet huy\baitap matlab\huy\th\train\15.jpg');
delete(vid);
a=imread('E:\nguyen viet huy\baitap matlab\huy\th\train\15.jpg');
subplot(1,2,1);
imshow(a)
title('15');
end
end
2.2.2 Tạo cơ sở dữ liệu.
Ban đầu ta sẽ tạo đường dẫn tới thư mục chứa cơ sở dữ liệu “train”. Trong thư mục này giả sử gồm có P bức ảnh. Đầu tiên ta sẽ đọc tất cả các bức ảnh trong thư mục nay. Biến tất cả các ảnh có kích thước M*N thành một vecto cột M*Nx1. Sử dụng hàm “reshape” và sau đó đặt vào ma trận T. ma trận T sẽ có kích thước là M*NxP.
>> trainPath='train';
csdl = dir(trainPath);
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 = [];
for i = 1 : soanh
str = int2str(i);
str = strcat('\',str,'.jpg');
str = strcat(trainPath,str);
img = imread(str);
img = rgb2gray(img);
[dong cot] = size(img);
tam = reshape(img',dong*cot,1);
T = [T tam];
end
2.2.3 Tìm trị riêng và vecto riêng:
Từ ma trận T ta sẽ tính ra ảnh m là trung bình của tất cả các ảnh trong ma trận T bằng cách sử dụng hàm mean. Sau đó ta lấy từng bức ảnh trong ma trận T trừ đi cho ảnh trung bình. Ta sẽ được ma trận A có cung kích thước ma trận T là M*NxP.
>> m = mean(T,2);
soanh = size(T,2);
A = [];
for i = 1 : soanh
temp = double(T(:,i)) - m;
A = [A temp];
end
Ta cần tìm các Eigenface là những vecto riêng của ma trận A*A’ nhưng ma trận này có kích thước quá lớn. M*NxM*N. ta sẽ tìm những vecto riêng của ma trận A’*A có kích thước PxP. Và tìm những vecto riêng bằng hàm eig. Kết quả được lưu vào ma trận V là những vecto riêng và ma trận D chứa những trị riêng. Để tìm được những vecto riêng của ma trận A*A’ bằng cách lấy các vecto riêng nhân với ma trận A gọi la ma trận LeigV. Tập hợp những vecto riêng của na trân A*A’ gọi là Eigenface.
L = A'*A;
[V D] = eig(L);
D1=diag(D);
D1=sort(D1);
s=size(D1);
s=s(1);
D1=D1(s-3);
LeigV = [];
for i = 1 : size(V,2)
if( D(i,i)>D1 )
LeigV = [LeigV V(:,i)];
end
end
E = A* LeigV;
for i=1:3
anh=E(:,i);
% show(anh,'Eigenface');
end
sovector=size(E,2);
for i=1:sovector
dodai=norm(E(:,i));
E(:,i)=E(:,i)/dodai;
End
2.2.4 Kiểm tra ảnh có trong cơ sở dữ liệu.
Hàm này sẽ so sánh bức ảnh kiểm tra với từng bức ảnh trong csdl. Mỗi bức ảnh sẽ có hình chiếu của nó lên một không gian khuôn mặt có cơ số là E, ở đây ta sẽ không tìm những hình chiếu này mà tìm tọa độ của hình chiếu trong không gian khuôn mặt gọi tắt là tọa độ hình chiếu.
Đầu tiên tính tọa độ hình chiếu của bức ảnh kiểm tra, sau đó tính tọa độ hình chiếu của tất cả bức ảnh trong csdl.
>> sovector=size(E,2);
toado = [];
for i = 1 : sovector
tam = E'*A(:,i);
toado = [toado tam];
end
Cuối cùng do khoảng cách giữa tọa độ hình chiếu của những bức ảnh trong csdl với tọa độ hình chiếu của ảnh kiểm tra. Bức ảnh trong csdl có khoảng cách ngắn nhất với ảnh kiểm tra chình là bức ảnh tương ứng với bức ảnh kiểm tra. tam = rgb2gray(TestImage);
[dong cot] = size(tam);
InImage = reshape(tam',dong*cot,1);
dolech = double(InImage)- m;
toadoKT = E'*dolech;
hinhchieuKT=double(InImage)*0;
for i=1:sovector
hinhchieuKT=hinhchieuKT + toadoKT(i,1)*E(:,i);
end
kc=norm(double(InImage)-hinhchieuKT);
str=num2str(kc);
str=strcat('Khoang cach tu anh kiem tra toi khong gian khuon mat : ',str);
disp(str);
khoangcach = [];
for i = 1 : sovector
q = toado(:,i);
tam = ( norm( toadoKT - q ) )^2;
khoangcach = [khoangcach tam];
end
[minKC , vitri] = min(khoangcach);
Tìm tọa độ chiều của mỗi vector cột trong A ( tương ứng với một bức ảnh) bằng cách nhân E’ với các vector cột này.
str=num2str(minKC);
str=strcat('Min khoang cach hai toa do hinh chieu : ',str);
disp(str);
anhtim1 = strcat(int2str(vitri),'.jpg')
anhtim = strcat(trainPath,'\',anhtim1);
anhtim = imread(anhtim);
imshow(TestImage);
title('anh kiem tra');
figure,imshow(anhtim);
title('anh tim duoc trong co so du lieu');
str = strcat('ten buc anh tim duoc : ',anhtim1);
disp(str)
Hàm xuất nhập dữ liệu:
Sau khi kiểm tra sẽ cho ra các kết quả dữ liệu đúng hay không đúng như trong cơ sở dữ liệu. Có nghĩa là đối tượng đó được phép vào hay không. Trong hàm này sẽ thực hiện cài đặt các đặt tính của cổng COM, và xuất nhập dữ liệu ra khỏi cổng Com để cho vi xử lý thực thi lệnh. Xuất trong dữ liệu cổng COM sẽ được đóng lại.
>> com = serial('COM1');
set(com,'baudrate',1200);
com.DataBits =8;
com.Parity = 'none';
com.StopBit = 1;
com.OutputBufferSize=512; % Kích thước đệm xuất 512 byte.
com.InputBufferSize=512; % Kích thước đệm nhận 512 byte.
com.BytesAvailableFcnCount = 1;% ấn định số byte định thu.
com.Terminator = 'LF';% ký tự kết thúc là “ LF”.
com.ReadAsyncMode = 'continuous';% chế độ đọc liên tục
com.BytesAvailableFcnMode = 'Byte';% chọn Mode gây sự kiện là byte.
fopen(com);% Mở cổng COM
>> fclose(com);
delete (com);
clear com;
Nếu dữ liệu đúng.
Nếu dữ liệu không đúng.
Giao diện ban đầu:
2.3 Chương trình kết nối và xử lý bằng MatLab:
function varargout = MAIN(varargin)
% UNTITLED M-file for untitled.fig
% UNTITLED, by itself, creates a new UNTITLED or raises the existing
% singleton*.
% H = UNTITLED returns the handle to a new UNTITLED or the handle to
% the existing singleton*.
% UNTITLED('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in UNTITLED.M with the given input arguments.
% UNTITLED('Property','Value',...) creates a new UNTITLED or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before untitled_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to untitled_OpeningFcn via varargin.
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help untitled
% Last Modified by GUIDE v2.5 14-Oct-2009 07:32:58
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @untitled_OpeningFcn, ...
'gui_OutputFcn', @untitled_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 untitled is made visible.
function untitled_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to untitled (see VARARGIN)
% Choose default command line output for untitled
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes untitled wait for user response (see UIRESUME)
% uiwait(handles.figure1);
global com ketnoi;
ketnoi=0;
% --- Outputs from this function are returned to the command line.
function varargout = untitled_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on button press in CHUP_ANH.
function CHUP_ANH_Callback(hObject, eventdata, handles)
% hObject handle to CHUP_ANH (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Chụp ảnh trực tiếp từ webcam để xử lý nhận dạng.
vid=videoinput('winvideo',1);
hinh=getsnapshot(vid);
imwrite(hinh,'E:\DO AN 2B\CODE CT\test\1.jpg');
% Lưu hình chụp từ webcam thành file ảnh 1.jpg
delete(vid);
a=imread('E:\DO AN 2B\CODE CT\test\1.jpg');
% Đọc file ảnh 1.jpg và xuất ra ma trận.
subplot(1,2,1);
imshow(a)
% --- Executes on button press in HUAN_LUYEN.
function HUAN_LUYEN_Callback(hObject, eventdata, handles)
% hObject handle to HUAN_LUYEN (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% 15 bức ảnh được chụp từ webcam đưa vào csdl để thiết lặp chế độ bảo vệ.
for i=1:15 % Có 15 ảnh trong thư mục huấn luyện (train).
vid=videoinput('winvideo',1);
preview(vid); pause;
closepreview(vid);
hinh=getsnapshot(vid); % Lấy 1 ảnh từ chụp webcam vào xử lý đặt tên 1.jpg.
if i==1
imwrite(hinh,'E:\DO AN 2B\CODE CT\train\1.jpg');
delete(vid);
a=imread('E:\DO AN 2B\CODE CT\train\1.jpg');
subplot(1,2,1);
imshow(a)
title('1');
pause;
elseif i==2
imwrite(hinh,'E:\DO AN 2B\CODE CT\train\2.jpg');
delete(vid);
a=imread('E:\DO AN 2B\CODE CT\train\2.jpg');
subplot(1,2,1);
imshow(a)
title('2');
pause;
elseif i==3
imwrite(hinh,'E:\DO AN 2B\CODE CT\train\3.jpg');
delete(vid);
a=imread('E:\DO AN 2B\CODE CT\train\3.jpg');
subplot(1,2,1);
imshow(a)
title('3');
pause;
elseif i==4
imwrite(hinh,'E:\DO AN 2B\CODE CT\train\4.jpg');
delete(vid);
a=imread('E:\DO AN 2B\CODE CT\train\4.jpg');
subplot(1,2,1);
imshow(a)
title('4');
pause;
elseif i==5
imwrite(hinh,'E:\DO AN 2B\CODE CT\train\5.jpg');
delete(vid);
a=imread('E:\DO AN 2B\CODE CT\train\5.jpg');
subplot(1,2,1);
imshow(a)
title('5');
pause;
elseif i==6
imwrite(hinh,'E:\DO AN 2B\CODE CT\train\6.jpg');
delete(vid);
a=imread('E:\DO AN 2B\CODE CT\train\6.jpg');
subplot(1,2,1);
imshow(a)
title('6');
pause;
elseif i==7
imwrite(hinh,'E:\DO AN 2B\CODE CT\train\7.jpg');
delete(vid);
a=imread('E:\DO AN 2B\CODE CT\train\7.jpg');
subplot(1,2,1);
imshow(a)
title('7');
pause;
elseif i==8
imwrite(hinh,'E:\DO AN 2B\CODE CT\train\8.jpg');
delete(vid);
a=imread('E:\DO AN 2B\CODE CT\train\8.jpg');
subplot(1,2,1);
imshow(a)
title('8');
pause;
elseif i==9
imwrite(hinh, 'E:\DO AN 2B\CODE CT\train\9.jpg');
delete(vid);
a=imread('E:\DO AN 2B\CODE CT\train\9.jpg');
subplot(1,2,1);
imshow(a)
title('9');
pause;
elseif i==10
imwrite(hinh,'E:\DO AN 2B\CODE CT\train\10.jpg');
delete(vid);
a=imread('E:\DO AN 2B\CODE CT\train\10.jpg');
subplot(1,2,1);
imshow(a)
title('10');
pause;
elseif i==11
imwrite(hinh, 'E:\DO AN 2B\CODE CT\train\11.jpg');
delete(vid);
a=imread('E:\DO AN 2B\CODE CT\train\11.jpg');
subplot(1,2,1);
imshow(a)
title('11');
pause;
elseif i==12
imwrite(hinh, 'E:\DO AN 2B\CODE CT\train\12.jpg');
delete(vid);
a=imread('E:\DO AN 2B\CODE CT\train\12.jpg');
subplot(1,2,1);
imshow(a)
title('12');
pause;
elseif i==13
imwrite(hinh, 'E:\DO AN 2B\CODE CT\train\13.jpg');
delete(vid);
a=imread('E:\DO AN 2B\CODE CT\train\13.jpg');
subplot(1,2,1);
imshow(a)
title('13');
pause;
elseif i==14
imwrite(hinh,'E:\DO AN 2B\CODE CT\train\14.jpg');
delete(vid);
a=imread('E:\DO AN 2B\CODE CT\train\14.jpg');
subplot(1,2,1);
imshow(a)
title('14');
pause;
elseif i==15
imwrite(hinh,'E:\DO AN 2B\CODE CT\train\15.jpg');
delete(vid);
a=imread('E:\DO AN 2B\CODE CT\train\15.jpg');
subplot(1,2,1);
imshow(a)
title('15');
end
end
% --- Executes on button press in KIEM_TRA.
function KIEM_TRA_Callback(hObject, eventdata, handles)
% hObject handle to KIEM_TRA (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Lấy ảnh vừa mới chụp được từ function Chụp Ảnh để tiến hành kiểm tra trong thư mục train và nhận dạng đúng đối tượng.
% trainPath là đường dẫn tới thư mục csdl ảnh, giả sử thư mục này có P ảnh.
% Đầu tiên ta sẽ đọc tất cả ảnh trong thư mục csdl ảnh ( thư mực này ngoài những file ảnh còn chứa những file có tên:.,.., thumbs.db.
% Biến tất cả ảnh kích thước MxN thành vector cột M*Nx1, sử dụng hàm reshape của Matlab, sau đó đặt ma trận T, cuối cùng ma trận T sẽ có kích thước M*NxP.
% return T.
global com;
com = serial('COM1');
set(com,'baudrate',1200);
com.DataBits =8;
fopen(com);
TestImage=imread('E:\DO AN 2B\CODE CT\test\1.jpg');
trainPath='train';
csdl = dir(trainPath);
soanh = 0;
for i = 1:size(csdl,1) % Đếm những file là ảnh trong csdl.
If not(strcmp(csdl(i).name,'.')|strcmp(csdl(i).name,'..')|strcmp(csdl(i).name,
'Thumbs.db'))
soanh = soanh + 1; % Số ảnh chứa trong tập csdl.
end
end
% Tạo Ma Trận Từ Những Tấm Ảnh.
T = [];
for i = 1 : soanh
% Trong csdl của ví dụ này thì các file ảnh có tên: 1.jpg , 2.jpg ...
str = int2str(i); % Đổi số nguyên sang chuỗi.
str = strcat('\',str,'.jpg');
str = strcat(trainPath,str); % lấy tên đầy đủ của file ảnh.
img = imread(str);
img = rgb2gray(img);% Chuyển ảnh indexed thành ảnh gray scale.
[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 T
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Sử dụng phương pháp phân tích thành phần chình (PCA) để xác định những nét khác biệt giữa những bức ảnh.
% T là một ma trận kích thước M*NxP chứa tất cả ảnh trong csdl, mỗi ảnh là một vector cột trong ma trận T.
% Theo thuật toán PCA, đầu tiên ta sẽ tính ra m là trung bình của tất cả các ảnh trong ma trận T, dùng hàm “ mean” của MatLab.
% Sau đó ta sẽ lấy từng bức ảnh trong T trừ cho ảnh trung bình, ta sẽ được một ma trận A kích thước M*NxP.
% Ta cần tìm Eigenface là những vector riêng của ma trận A*A’, những ma trận A*A’ kích thước M*NxM*N quá lớn, ta sẽ tìm những vector riêng cả ma trận A’*A kích thước PxP. Ta sẽ tìm những vector riêng bằng hàm eig trong MatLab.
% Giả sử v là một vector riêng của ma trận A’*A, khi đó A*v là vector riêng của ma trận A*A’.
% Tập hợp những vector riêng của ma trận A*A’ gọi là Eigenfaces.
% Trả về 3 giá tri:
m: là ảnh trung bình.
A: là tập hợp những ảnh - ảnh trung bình.
E: là những vector riêng của ma trận A*A’.
% Tính toán ảnh trung bình.
m = mean(T,2); % giá trị trung bình.
soanh = size(T,2);
% Tính độ lệch giữa ảnh kiểm tra với ảnh trung bình
A = [];
for i = 1 : soanh
temp = double(T(:,i)) - m;% T(:,i): vector cột thứ I chính là một bức ảnh.
A = [A temp];
end
% Tìm những trị riêng và những vector riêng của ma trận A’*A, từ đó tìm những vector riêng của ma trận A*A’ là những eigenface.
L = A'*A;
[V D] = eig(L); % Tính trị riêng và vector 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ị triêng D(i,i).
% Nói cách khác D là ma trận chéo của các trị riêng, còn V là ma trận mà các cột là vector riêng.
D1=diag(D); % tạo ma trận chéo từ ma trận D.
D1=sort(D1);
s=size(D1);
s=s(1);
D1=D1(s-14);
LeigV = []; % Tập hợp vector riêng của ma trận L = A’*A.
for i = 1 : size(V,2)
if( D(i,i)>D1 )
LeigV = [LeigV V(:,i)];
end
end
%ta chi lay 14 vector rieng ung voi 10 tri rieng lon nhat
%nhu da noi o tren , sau khi co cac vector rieng cua ma tran A'*A , ta tim
%cac vector rieng cua ma tran A*A' bang cach lay ma tran A nhan voi cac
%vector rieng nay , tap hop cac vector rieng cua ma tran A*A' con duoc goi
%la Eigenface do day la nhung vector rieng va no giong hinh khuon mat .
E = A* LeigV;
% E là một cơ sở gồm những vector trục giao, ta sẽ chuẩn hóa nó để E biến thành một cơ sở trục chuẩn.
sovector=size(E,2); % số vector riêng trong E ( là số cột).
for i=1:sovector
dodai=norm(E(:,i));
E(:,i)=E(:,i)/dodai;
End
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Hàm này sẽ so sánh bức ảnh kiểm tra với từng bức ảnh trong csdl.
% Mỗi bức ảnh sẽ có hình chiếu của nó lên một không gian khuôn mặt có cơ số
là E, ở đây ta sẽ không tìm những hình chiếu này mà tìm tọa độ của hình chiếu trong không gian khuôn mặt gọi tắt là tọa độ hình chiếu.
% Đầu tiên tính tọa độ hình chiếu của bức ảnh kiểm tra, sau đó tính tọa độ hình chiếu của tất cả bức ảnh trong csdl. Cuối cùng do khoảng cách giữa tọa độ hình chiếu của những bức ảnh trong csdl với tọa độ hình chiếu của ảnh kiểm tra. Bức ảnh trong csdl có khoảng cách ngắn nhất với ảnh kiểm tra chình là bức ảnh tương ứng với bức ảnh kiểm tra.
% image là đường dẫn tới bức ảnh cần kiểm tra.
% m là ảnh trung bình của các ảnh trong csdl.
% A là ma trận, mỗi cột là độ lệch giữa một ảnh trong csdl so với ảnh trung bình, còn gọi là vector ảnh trung tâm.
%E là tập hợp những vector riêng của ma trận A*A’
% ảnh tìm là tên của bức ảnh tìm được trong csdl.
% tìm tọa độ chiều của mỗi vector cột trong A ( tương ứng với một bức ảnh) bằng cách nhân E’ với các vector cột này.
toado = []; % tập tọa độ hình chiếu của mỗi bức ảnh trong csdl.
for i = 1 : sovector
tam = E'*A(:,i); % tạo độ hình chiếu của bức ảnh Ai.
toado = [toado tam];
end
tam = rgb2gray(TestImage); % chuyển đổi ảnh RGB thành ảnh trắng đen.
[dong cot] = size(tam);
InImage = reshape(tam',dong*cot,1); % thay đổi kích cỡ
% Tính độ lệch giữa ảnh kiểm tra và ảnh trung bình trong csdl, độ lệch là một vector cột giống như các vector cột trong ma trận A.
dolech = double(InImage)- m;
%Tương tự như khi tìm tọa độ hình chiếu của các vector cột của A, bây giờ ta tìm tọa độ hình chiếu của bức ảnh kiểm tra.
toadoKT = E'*dolech;
hinhchieuKT=double(InImage)*0;
for i=1:sovector
hinhchieuKT=hinhchieuKT + toadoKT(i,1)*E(:,i);
end
kc=norm(double(InImage)-hinhchieuKT); % chỉ tiêu ma trận hoặc vector
str=num2str(kc); % đổi từ số thành chuỗi
str=strcat('Khoang cach tu anh kiem tra toi khong gian khuon mat : ',str);
disp(str); % hiển thị ma trận hoặc văn bản.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Bây giờ ta sẽ tính khoảng cách giữa tọa độ hình chiếu của bức ảnh kiểm tra với tất cả tọa độ hình chiếu của các bức ảnh trong csdl. Tọa độ hình chiếu của ảnh kiểm tra sẽ có khoảng cách ngắn nhất với hình chiếu của bức ảnh tương ứng trong csdl ( Hai bức ảnh cùng khuôn mặt của một người).
% Ta lưu ý là mọi tọa độ hình chiếu là một vector, ta sẽ dùng chuẩn Euclid để tính khoảng cách giữa 2 vector ( 2 tọa độ hình chiếu).
khoangcach = [];
for i = 1 : sovector
q = toado(:,i);
tam = ( norm( toadoKT - q ) )^2;
khoangcach = [khoangcach tam];
end
% lấy ra khoảng cách ngắn nhất và vị trí của bức ảnh tìm được trong csdl, ta lưu ý là những file ảnh trong csdl có tên là: 1.jpg, 2.jpg…
[minKC , vitri] = min(khoangcach);
if minKC < 15000000
str=num2str(minKC);
str=strcat('Min khoang cach hai toa do hinh chieu : ',str);
disp(str);
anhtim1 = strcat(int2str(vitri),'.jpg');
anhtim = strcat(trainPath,'\',anhtim1);
anhtim = imread(anhtim);
subplot(1,2,2)
imshow(anhtim);
title('anh tim duoc trong co so du lieu');
str = strcat('ten buc anh tim duoc : ',anhtim1);
disp(str)
fwrite(com,2,'int8');
fclose(com);
elseif minKC>15000000
str=num2str(minKC);
str=strcat('Min khoang cach hai toa do hinh chieu : ',str);
disp(str);
str=('khong co trong csdl');
subplot(1,2,2);
a=imread('khongco.jpg');
imshow(a);
title('khong co trong csdl');
disp(str)
fwrite(com,254,'int8');
fclose(com);
end
subplot(1,2,1);
a=imread('E:\DO AN 2B\CODE CT\test\1.jpg');
imshow(a);
title('anh kiem tra');
% --- Executes on button press in THOAT.
function THOAT_Callback(hObject, eventdata, handles)
% hObject handle to THOAT (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
quit;
% --- Executes on button press in GIAO_TIEP.
function GIAO_TIEP_Callback(hObject, eventdata, handles)
% hObject handle to GIAO_TIEP (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global com ketnoi;
if ketnoi==0
com = serial('COM1');
set(com,'baudrate',1200);
com.DataBits =8;
com.Parity = 'none';
com.StopBit = 1;
com.OutputBufferSize=512; % Kích thước đệm xuất 512 byte.
com.InputBufferSize=512; % Kích thước đệm nhận 512 byte.
com.BytesAvailableFcnCount = 1;% ấn định số byte định thu.
com.Terminator = 'LF';% ký tự kết thúc là “ LF”.
com.ReadAsyncMode = 'continuous';% chế độ đọc liên tục
com.BytesAvailableFcnMode = 'Byte';% chọn Mode gây sự kiện là byte.
fopen(com);% Mở cổng COM.
ketnoi=1;
end
% --- Executes on button press in THOAT_GT.
function THOAT_GT_Callback(hObject, eventdata, handles)
% hObject handle to THOAT_GT (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global com ketnoi;
if ketnoi==1
ketnoi=0;
fclose(com);
delete (com);
clear com;
end
% --- Executes on button press in TU_DONG.
function TU_DONG_Callback(hObject, eventdata, handles)
% hObject handle to TU_DONG (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global com ketnoi;
n1=0;
while ketnoi==1
while com.BytesAvailable > n1;
n1=com.BytesAvailable+1;
vid=videoinput('winvideo',1);
hinh=getsnapshot(vid);
imwrite(hinh, 'E:\DO AN 2B\CODE CT\test\1.jpg');
delete(vid);
a=imread('E:\DO AN 2B\CODE CT\test\1.jpg');
subplot(1,2,1);
imshow(a);pause(1)
TestImage=imread('E:\DO AN 2B\CODE CT\test\1.jpg');
trainPath='train';
csdl = dir(trainPath);
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 = [];
for i = 1 : soanh
% Trong csdlcua vi du nay thi cac file anh co ten : 1.jpg , 2.jpg ...
str = int2str(i);
str = strcat('\',str,'.jpg');
str = strcat(trainPath,str); % lay ten day du cua file anh
img = imread(str);
img = rgb2gray(img);
[dong cot] = size(img);
tam = reshape(img',dong*cot,1);% bien anh thanh vector
T = [T tam]; % tang dan kich thuoc ma tran T
end
m = mean(T,2);
soanh = size(T,2);
A = [];
for i = 1 : soanh
temp = double(T(:,i)) - m;% T(:,i): vector cot thu i chinh la mot buc anh
A = [A temp];
end
L = A'*A;
[V D] = eig(L);
D1=diag(D);
D1=sort(D1);
s=size(D1);
s=s(1);
D1=D1(s-14);
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
toado = [];
for i = 1 : sovector
tam = E'*A(:,i);
toado = [toado tam];
end
tam = rgb2gray(TestImage);
[dong cot] = size(tam);
InImage = reshape(tam',dong*cot,1);
dolech = double(InImage)- m;
toadoKT = E'*dolech;
hinhchieuKT=double(InImage)*0;
for i=1:sovector
hinhchieuKT=hinhchieuKT + toadoKT(i,1)*E(:,i);
end
kc=norm(double(InImage)-hinhchieuKT);
str=num2str(kc);
str=strcat('Khoang cach tu anh kiem tra toi khong gian khuon mat : ',str);
disp(str);
khoangcach = [];
for i = 1 : sovector
q = toado(:,i);
tam = ( norm( toadoKT - q ) )^2;
khoangcach = [khoangcach tam];
end
[minKC , vitri] = min(khoangcach);
if minKC<15000000
str=num2str(minKC);
str=strcat('Min khoang cach hai toa do hinh chieu : ',str);
disp(str);
anhtim1 = strcat(int2str(vitri),'.jpg');
anhtim = strcat(trainPath,'\',anhtim1);
anhtim = imread(anhtim);
subplot(1,2,2)
imshow(anhtim);
title('anh tim duoc trong co so du lieu');
str = strcat('ten buc anh tim duoc : ',anhtim1);
disp(str)
fwrite(com,2,'int8');
elseif minKC>15000000
str=('khong co trong csdl');
subplot(1,2,2);
a=imread('khongco.jpg');
imshow(a);
title('khong co trong csdl');
disp(str)
fwrite(com,254,'int8');% xuất dữ liệu ra cổng COM.
end
subplot(1,2,1);
a=imread('E:\DO AN 2B\CODE CT\test\1.jpg');
imshow(a);
title('anh kiem tra');
end
end
CHƯƠNG 5
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI
5.1 Nhận Xét Chung:
- Với việc thực hiện đề tài “ HỆ THỐNG BẢO MẬT” chúng ta có thể giám sát quang cạnh hay đối tượng cần nghiên cứu. Với việc sử dụng thuật toán PCA sẽ tăng khả năng ổn định nhưng chưa hài hòa.
- Mạch chạy và hoạt động đúng nhưng khả năng chính xác khoảng định 80% do thuật toán không hiệu quả tối đa.
5.2 Khả Năng Ứng Dụng Vào Thực Tế:
- Ta có thể gắn hệ thống của mạch vào vị trí muốn cảnh báo người qua lại, hay muốn xác định người nào có quyền ra vào một nơi. Cũng có thể giám sát ở ngân hàng, cơ quan nhà nước hay nơi quân sự.
- Chi phí tiến hành lặp đặt thấp nên có thể áp dụng rộng rãi trong thực tế.
5.3 Hướng Phát Triển Đề Tài:
- Với đề tài “ HỆ THỐNG BẢO MẬT” ta có thể phát triển nhiều kênh báo động hay bảo mật cho các khu vực. Nghĩa là cùng một lúc ta có thể ngăn chặn được sự xâm phạm từ bên ngoài vào và giám sát được khu vực.
- Ta cũng có thể triển khai mạch này trong nhiều mục đích khác như: dùng trong thiết bị chống trộm, mạch gác cửa tại khu quân sự, chính trị.
- Với đề tài trên ta có thể phát triển để nhận dạng thí sinh vào phòng thi, nhận dạng chứng minh nhân dân….
CHƯƠNG 6
TÀI LIỆU THAM KHẢO
1. MatLab căn bản _ Nguyễn Hoài Sơn. ĐHSPKT.
2. Xử lý ảnh và Video số _ Nguyễn Kim Sách. NXBKHKT 1997.
3. Image Processing Toolbox cuûa Matlab Version 6.5
4. Xử lý đa chiều _ Phạm Thế Bảo. ĐH BK TP HCM.
5. www.haiphongit.com
6. www.dientuvietnam.com
7. www.ebook.com
8.www.mathworks.com