XÂY DỰNG hệ THỐNG CAMERA NHẬN DẠNG và bám THEO mặt NGƯỜI

105 180 1
XÂY DỰNG hệ THỐNG CAMERA NHẬN DẠNG và bám THEO mặt NGƯỜI

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ĐẠI HỌC QUỐC GIA TP.HCM TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THƠNG TIN  Nguyễn Ngọc Hồng XÂY DỰNG HỆ THỐNG CAMERA NHẬN DẠNG VÀ BÁM THEO MẶT NGƯỜI LUẬN VĂN THẠC SĨ NGÀNH CÔNG NGHỆ THÔNG TIN Mã số: 60 48 02 01 NGƯỜI HƯỚNG DẪN KHOA HỌC: TS Nguyễn Tất Bảo Thiện TP HỒ CHÍ MINH – NĂM 2017 Lời cam đoan Tôi xin cam đoan luận văn tơi thực hướng dẫn khoa học TS Nguyễn Tất Bảo Thiện, giảng viên Trường Đại học Tôn Đức Thắng Các liệu nghiên cứu mơ hình thí nghiệm luận văn trung thực, tơi lập trình, phân tích, thiết kế Các thơng tin trích dẫn luận văn rõ nguồn gốc Nếu sai, xin chịu hoàn toàn trách nhiệm Tác giả luận văn Nguyễn Ngọc Hoàng Lời cảm ơn Trước tiên, xin cảm ơn thầy Nguyễn Tất Bảo Thiện vì gợi mở, quan tâm, giúp đỡ cho học viên suốt thời gian thực luận văn tốt nghiệp Xin chân thành cảm ơn quan tâm hỗ trợ, tạo điều kiện hết lòng động viên tinh thần lẫn vật chất thành viên gia đình suốt thời gian qua Bên cạnh xin chuyển lời cảm ơn đến bạn Hoàng Ngọc Tý, hỗ trợ học viên thực mạch điều khiển hoạt động tin cậy ổn định để học viên thử nghiệm hoàn chỉnh hệ thống phần cứng tiến độ đặt Ngoài ra, học viên xin gởi lời cám ơn đến tất thầy cô trực tiếp giảng dạy suốt khóa học, người bạn quan tâm, động viên trình học tập nghiên cứu Tp.Hồ Chí Minh, tháng năm 2017 Tác giả luận văn Nguyễn Ngọc Hoàng MỤC LỤC Lời cam đoan Lời cảm ơn Danh mục bảng Danh mục hình vẽ, đồ thị Tóm tắt CHƯƠNG TỔNG QUAN 1.1 Giới thiệu chung: 1.2 Điều khiển camera phát bám theo mặt người: 1.2.1 Phát biểu toán: 1.2.2 Lý thực đề tài: 10 1.2.3 Đối tượng nghiên cứu: Dữ liệu ảnh có khn mặt người nhìn thẳng từ camera 11 1.2.4 Phạm vi nghiên cứu: 11 1.2.5 Tình hình nghiên cứu: 11 1.2.6 Tính khoa học thực tiễn đề tài: 14 1.2.7 Phương pháp nghiên cứu: 15 1.2.8 Các vấn đề khó khăn: 17 1.2.9 Mục tiêu đề tài: 19 1.2.10 Dự kiến lĩnh vực ứng dụng: 19 CHƯƠNG 2.CƠ SỞ LÝ THUYẾT 20 2.1 Phát (dò tìm) khn mặt người 20 2.1.1 Các phương pháp phát (dò tìm) khn mặt người 20 2.1.2 Phương pháp sử dụng luận văn 22 2.2 Điều khiển mờ - fuzzy logic control: 26 2.2.1 Lý thuyết điều khiển mờ (Fuzzy Logic Control): 27 2.2.2 Cấu trúc điều khiển mờ luận văn: 32 2.3 Điều khiển PID: 34 2.3.1 Lý thuyết điều khiển PID [8, tr 666-668; 12, tr 2521]: 34 2.3.2 Phương pháp sử dụng PID luận văn: 36 CHƯƠNG XÂY DỰNG HỆ THỐNG 37 3.1 Ý tưởng xây dựng hệ thống hoạt động 37 3.2 Tiến hành xây dựng thuật toán 37 3.2.1 Thuật tốn phát khn mặt 37 3.2.2 Thuật toán bám theo đối tượng: 37 3.3 Tiến hành xây dựng phần mềm 40 3.3.1 Dùng thuật toán Haar-like dò tìm khn mặt ảnh 41 3.3.2 Chương trình điều khiển bệ xoay mang camera 41 3.3.3 Hoạt động phần mềm 43 3.3.4 Giao diện chương trình phần mềm hệ thống 47 3.4 Tiến hành xây dựng phần cứng phục vụ hệ thống 47 3.4.1 Camera 47 3.4.2 Bệ xoay mang camera 48 3.4.3 Mạch điều khiển motor 52 3.4.4 Chương trình vi xử lý nạp xuống mạch điều khiển 52 3.4.5 Hệ thống hoàn chỉnh sử dụng 56 3.4.6 Một số thông số hệ thống: 58 3.4.7 Một số sản phẩm có chức gần giống thị trường: 59 CHƯƠNG 4.KẾT QUẢ – NHẬN XÉT VÀ PHÂN TÍCH 60 4.1 Kết thử nghiệm 60 4.2 Nhận xét phân tích kết đạt 60 4.2.1 Nhận xét 60 4.2.2 Phân tích kết đạt hướng khắc phục 61 CHƯƠNG 5.KẾT LUẬN 63 5.1 Kết đạt và ý nghĩa 63 5.2 Hướng phát triển 63 TÀI LIỆU THAM KHẢO 65 PHỤ LỤC Hàm OpenCVSharp sử dụng luận văn [15] 68 PHỤ LỤC Lớp xử lý Fuzy Logic Controller [8, tr 669; 12, tr 2519] 69 PHỤ LỤC Chương trình vi xử lý nạp cho ATMega32 [2, 16] 78 Danh mục bảng Bảng 3.1 Bộ luật điều khiển mờ .43 Bảng 3.2 Thông số camera .48 Bảng 3.3 Các thông số mô tơ cần đặt cho chương trình ý nghĩa chúng 54 Bảng 3.4 Chi phí thực hệ thống 58 Danh mục hình vẽ, đồ thị Hình 2.1.a Các đặc trưng cạnh 22 Hình 2.1.b Các đặc trưng đường 22 Hình 2.1.c Các đặc trưng khoanh vùng 23 Hình 2.2 Ảnh chia nhỏ tọa độ (x,y) 23 Hình 2.3 Tổng giá trị pixel nằm vùng A .24 Hình 2.4 Lược đồ AdaBoost 24 Hình 2.5 Thuật toán học AdaBoost 25 Hình 2.6 Dùng chuỗi cascade huấn luyện để phát cửa sổ phù hợp 26 Hình 2.7 Cấu trúc chuỗi cascade song song 26 Hình 2.8 Miền xác định miền tin cậy tập mờ .28 Hình 2.9 Một số dạng hàm thuộc .28 Hình 2.10 Ví dụ liên hệ biến ngôn ngữ biến vật lý .29 Hình 2.11 Giải mờ theo phương pháp cực đại 32 Hình 2.12 Sơ đồ khối cấu trúc điều khiển mờ luận văn 32 Hình 2.13 Sơ đồ khối hệ thống xử lý PID 34 Hình 3.1 Lưu đồ thể trình bám đối tượng hệ thống 39 Hình 3.2 Sơ đồ khối tổ chức phần mềm hệ thống 40 Hình 3.3 Mơ tả hệ thống dò tìm khn mặt 41 Hình 3.4 Mơ tả kỹ thuật điều khiển bệ xoay camera bám đối tượng .42 Hình 3.5 Giao diện chương trình phát bám mặt người 47 Hình 3.6 Mẫu camera sử dụng luận văn 47 Hình 3.7 Hình dáng bệ xoay mang camera trước cải tiến .49 Hình 3.8 Tháo rời bệ xoay trưóc cải tiến 49 Hình 3.9 Hộc bệ xoay trước cải tiến 50 Hình 3.10 Mô tơ công tắc hành trình bệ xoay cũ 50 Hình 3.11 Mơ tơ DC có encoder dùng cho bệ xoay cải tiến 51 Hình 3.12 Bệ xoay sau cải tiến 51 Hình 3.13 Hình dạng tổng thể mạch điểu khiển mô tơ DC .52 Hình 3.14 Sơ đồ khối chương trình điều khiển nạp vào vi xử lý 53 Hình 3.15 Sơ đồ mạch điều khiển motor bệ xoay mang camera .55 Hình 3.16 Sơ đồ mạch in mạch điều khiển 56 Hình 3.17 Sơ đồ khối hệ thống hoàn chỉnh .56 Hình 3.18 Hệ thống hồn chỉnh sử dụng thực tế 57 Hình 3.19 Sơ đồ khối hóa hệ thống 57 Hình 3.20 Camera Dahua SD42212T-HN 59 Hình 3.21 Camera Dahua SD6C220T-HN 59 Hình 4.1 Phát khoanh vùng mặt nhìn thẳng, xoay ±20 độ 60 Tóm tắt Nhiệm vụ luận văn giải toán phát khuôn mặt điều khiển bệ xoay camera bám theo mặt người thời gian thực thuật toán Fuzzy Logic, đồng thời đề xuất phương pháp ổn định tốc độ bệ xoay camera Báo cáo trình bày bước tình huống, khó khăn gặp phải hướng giải trình triển khai nhằm đảm bảo luận văn thực theo yêu cầu, nhiệm vụ đặt Học viên chọn sử dụng thư viện OpenCVSharp ứng dụng đặc trưng Haar-like thuật toán tăng tốc AdaBoost nhằm đẩy nhanh q trình dò tìm khn mặt người giúp tạo tiền đề cho chức điều khiển bám hệ thống Việc điều khiển bệ xoay mang camera bám theo khuôn mặt học viên thực theo hướng sử dụng kỹ thuật điều khiển mờ dựa thông số khoảng cách độ thay đổi khoảng cách đối tượng so với tâm khung ảnh, đồng thời kết hợp giải thuật điều khiển PID vi điều khiển ATMega32 nhằm ổn định tốc độ động có tải Kết kiểm chứng mơ hình bệ xoay học viên cải tiến từ khung loại sản phẩm sẵn có thị trường if(isStoppingX == false) { if(th_speed1 > 0) sbi(PORTD,6); direction of motor else cbi(PORTD,6); // Output1 = abs(th_speed1); if(th_speed1 > 0) Output1 = 2601 - Output1; else OCR1A = Output1; Output1 += 1399; //LEFT //RIGHT } } } void ControlMotorY(void) { if(th_speed2 != 0) { if(isStoppingY == false) { if(th_speed2 > 0) sbi(PORTC,2); direction of motor else cbi(PORTC,2); // Output2 = abs(th_speed2); if(th_speed2 > 0) Output2 = 3101 - Output2; //DOWN else OCR1B = Output2; Output2 += 899; //UP } } } void ControlMotor(void) { ControlMotorX(); ControlMotorY(); } void DecodeSingleCommand(void) { //DX+1Y+55NULL -> i = //DX+17Y+55NULL -> i = //DX+123Y+55NULL -> i = if(command[0]== 'D') { //Handle dual command int speedX, speedY; //Decode speed command to control motor X unsigned char i=3; while(command[i]!='Y') i++; //Stop until meeting 'Y' if(i==4) speedX = assciToNum(command[3]); else if(i==5) speedX = assciToNum(command[3])*10 + assciToNum(command[4]); else if(i==6) speedX = assciToNum(command[3])*100 + assciToNum(command[4])*10 + assciToNum(command[5]); if(command[2]== '-') speedX = -speedX; //Control motor X if((state_M1[0] == 'L') && (speedX < 0)) th_speed1 = 0; else if((state_M1[0] == 'R') && (speedX > 0)) th_speed1 = 0; else { //Check most recent speed is zero or not //if(th_speed1 == 0) //{ ////If motor is stopping, put an initial speed to motor X //if(speedX > 0) PutSpeedMotor1(200); //else if(speedX < 0) PutSpeedMotor1(200); //} if(abs(speedX) > 1) th_speed1 = speedX; r_speed1 = 0; iPart_1 = 0; Output1 = 0; pre_err1 = 0; if(th_speed1 == 0) BrakeMotor1(); } //Decode speed command to control motor Y //DX+1Y+5NULL -> i = 4, j = //DX+17Y+12NULL -> i = 5, j = //DX+123Y+545NULL -> i = 6, j= unsigned char j=0; unsigned char startY = i; //Current value of i : position of 'Y' while(command[i]) { i++; j++; } if(j==3) speedY = assciToNum(command[startY + 2]); else if(j==4) speedY = assciToNum(command[startY + 2])*10 + assciToNum(command[startY + 3]); else if(j==5) speedY = assciToNum(command[startY + 2])*100 + assciToNum(command[startY + 3])*10 + assciToNum(command[startY + 4]); if(command[startY + 1]== '-') speedY = -speedY; if((state_M2[0] == 'L') && (speedY < 0)) th_speed2 = 0; else if((state_M2[0] == 'R') && (speedY > 0)) th_speed2 = 0; else { //Check most recent speed is zero or not //if(th_speed2 == 0) //{ ////If motor is stopping, put an initial speed to motor Y //if(speedY > 0) PutSpeedMotor2(200); //else if(speedY < 0) PutSpeedMotor2(200); //} //if(abs(speedY) > 2) //th_speed2 = speedY; th_speed2 = speedY; r_speed2 = 0; iPart_2 = 0; Output2 = 0; pre_err2 = 0; if(th_speed2 == 0) BrakeMotor2(); } } //X-20NULL else //if((command[0]== 'X') || (command[0]== 'Y')) { int speed; unsigned char i=2; while(command[i]) i++; if(i==3) speed = assciToNum(command[2]); else if(i==4) speed = assciToNum(command[2])*10 + assciToNum(command[3]); else if(i==5) speed = assciToNum(command[2])*100 + assciToNum(command[3])*10 + assciToNum(command[4]); //else if(i==6) speed = assciToNum(command[2])*1000 + assciToNum(command[3])*100 + assciToNum(command[4])*10 + assciToNum(command[5]); if(command[1]== '-') speed = -speed; if(command[0]== 'X') { if((state_M1[0] == 'L') && (speed < 0)) th_speed1 = 0; else if((state_M1[0] == 'R') && (speed > 0)) th_speed1 = 0; else { //if(th_speed1 == 0) //{ //if(speed > 0) PutSpeedMotor1(200); //else if(speed < 0) PutSpeedMotor1(-200); //} th_speed1 = speed; r_speed1 = 0; iPart_1 = 0; Output1 = 0; pre_err1 = 0; if(th_speed1 == 0) BrakeMotor1(); } } else { if((state_M2[0] == 'L') && (speed < 0)) th_speed2 = 0; else if((state_M2[0] == 'R') && (speed > 0)) th_speed2 = 0; else { //if(th_speed2 == 0) //{ //if(speed > 0) PutSpeedMotor2(200); //else if(speed < 0) PutSpeedMotor2(-200); //} th_speed2 = speed; r_speed2 = 0; iPart_2 = 0; Output2 = 0; pre_err2 = 0; if(th_speed2 == 0) BrakeMotor2(); } } } command[0] = NULL; enable_decode = false; } void TestSwitch(void) { ClearScreen(); WriteString(0,0,"Test Switch"); char i; while(enable_decode == false) { for(i=1; i

Ngày đăng: 23/12/2018, 06:16

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan