Thiết kế hệ thống nhận diện khuôn mặt đóng mở cửa tự động

91 5 0
Thiết kế hệ thống nhận diện khuôn mặt đóng mở cửa tự động

Đ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

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TP HỒ CHÍ MINH ĐỒ ÁN TỐT NGHIỆP THIẾT KẾ HỆ THỐNG NHẬN DIỆN KHN MẶT ĐĨNG MỞ CỬA TỰ ĐỘNG Ngành: KỸ THUẬT CƠ KHÍ Chuyên ngành: KỸ THUẬT CƠ KHÍ Giảng viên hướng dẫn: T.S Nguyễn Trọng Hải Sinh viên thực hiện: MSSV: Lớp: Tô Vỹ Quang 1711040568 18DCKA2 Trần Trung Dũng 1811040355 18DCKA2 Nguyễn Thành Trung 1811040390 18DCKA2 TP Hồ Chí Minh, ngày 09 tháng 07 năm 2022 MỤC LỤC LỜI CAM ĐOAN I LỜI CẢM ƠN II TÓM TẮT III ABSTRACT IV MỤC LỤC V DANH MỤC HÌNH VIII CHƯƠNG I: GIỚI THIỆU ĐỀ TÀI 1.1 ĐẶT VẤN ĐỀ .1 1.2 MỤC TIÊU 1.3 NỘI DUNG NGHIÊN CỨU 1.4 GIỚI HẠN ĐỀ TÀI .2 1.5 BỐ CỤC CHƯƠNG II: TỔNG QUAN GIẢI PHÁP CÔNG NGHỆ 2.1 LÝ THUYẾT XỬ LÝ ẢNH 2.1.1 Giới thiệu 2.1.2 Thu nhận ảnh (Image acquision) 2.1.3 Tiền xử lý ảnh (Image processing) .5 2.1.4 Phân vùng ảnh (Segmentation) 2.1.5 Biểu diễn ảnh (Image representation) 2.1.6 Nhận diện nội suy ảnh (Image recognition and Interpretation) 2.1.7 Cơ sở tri thức (Knowledge base) 2.1.8 Mô tả 2.2 NHỮNG VẤN ĐỀ TRONG XỬ LÝ ẢNH 2.2.1 Điểm ảnh (Picture Element – Pixel) 2.2.2 Độ phân giải cùa ảnh 2.2.3 Mức xám cùa ảnh 2.2.4 Ảnh số (Digital image) 2.2.5 Quan hệ điểm ảnh 2.3 RASPBERRY PI 10 2.3.1 Giới thiệu 10 2.3.2 Thông tin cấu hình Raspberry Pi 11 2.3.3 Ưu nhược điểm Raspberry Pi 12 2.3.4 Các ngõ GPIO 12 v 2.4 MÀN HÌNH TFT 1.44 INCH SPI .16 2.4.1 Giới thiệu 16 2.4.2 Thông số kỹ thuật 16 2.4.3 Giao diện chân Màn TFT 1.44 inch SPI 17 2.5 ARDUINO UNO R3 18 2.5.1 Giới thiệu 18 2.5.2 Thông số kỹ thuật 18 2.6 THUẬT TOÁN HISTOGRAM OF ORIENTED GRADIENT (HOG) .19 2.6.1 Giới thiệu 19 2.6.2 Ứng dụng HOG .20 2.6.3 Cách hoạt động thuật toán .21 2.6.4 Phép tính HOG .21 2.7 THUẬT TOÁN HAAR-LIKE 25 2.7.1 Giới thiệu thuật toán Haar-like 25 2.7.2 Đặc trưng Haar-like .26 2.7.3 Khái niệm Intergal Image 27 2.7.4 AdaBoost 29 2.8 PHẦN MỀM PYTHON 31 2.8.1 Giới thiệu 31 2.8.2 Ứng dụng Python 31 2.8.3 Đặc điểm bật Python .32 2.9 PHƯƠNG PHÁP NHẬN DIỆN KHUÔN MẶT 32 2.9.1 Quá trình training 33 2.9.2 Q trình nhận diện khn mặt 34 CHƯƠNG III: PHƯƠNG PHÁP GIẢI QUYẾT 36 3.1 GIỚI THIỆU VỀ CÔNG NGHỆ NHẬN DIỆN KHUÔN MẶT 36 3.2 NHỮNG LỢI ÍCH CỦA HỆ THỐNG NHẬN DIỆN KHN MẶT ĐĨNG MỞ CỬA TỰ ĐỘNG .36 3.3 NHƯỢC ĐIỂM CỦA HỆ THỐNG NHẬN DIỆN KHN MẶT ĐĨNG MỞ CỬA TỰ ĐỘNG .36 CHƯƠNG IV: QUY TRÌNH THIẾT KẾ PHẦN CỨNG VÀ PHẦN MỀM 37 4.1 GIỚI THIỆU .37 4.2 TÍNH TỐN VÀ THIẾT KẾ HỆ THỐNG 37 4.2.1 Thiết kế sơ đồ khối tự động 37 vi 4.2.2 Tính toán thiết kế .38 4.3.2 Sơ đồ nguyên lý toàn mạch 43 4.4.2 Tính tốn thiết kế phần mềm 43 CHƯƠNG V: THI CƠNG MƠ HÌNH THỰC NGHIỆM 46 5.1 GIỚI THIỆU .46 5.2 THI CƠNG MƠ HÌNH HỆ THỐNG 46 5.2.1 Chuẩn bị phần cứng .46 5.2.2 Lắp ráp kiểm tra 46 5.3 THI CƠNG MƠ HÌNH .48 5.4 LẬP TRÌNH HỆ THỐNG 51 5.4.1 Lưu đồ giải thuật 51 CHƯƠNG VI: ĐÁNH GIÁ KẾT QUẢ, KẾT LUẬN 56 6.1 ĐÁNH GIÁ KẾT QUẢ .56 6.1.1 Kết mơ hình 56 6.1.2 Nhận xét đánh giá 57 6.2 KẾT LUẬN 57 6.2.1 Kết đạt 57 6.2.2 Những hạn chế .58 6.3 HƯỚNG PHÁT TRIỂN 58 TÀI LIỆU THAM KHẢO 59 SÁCH THAM KHẢO .59 PHỤ LỤC 60 vii DANH MỤC HÌNH Hình 1.1: Các bước xử lý ảnh Hình 2.2: Lân cận điểm ảnh tọa độ Hình 2.3: Raspberry Pi 10 Hình 2.4: Sơ đồ khối Raspberry Pi 11 Hình 2.5: Vị trí chân Raspberry Pi 12 Hình 2.6: Màn TFT 1.44 inch SPI 16 Hình 2.7: Sơ đồ khối TFT 1.44 inch SPI 17 Hình 2.8: Arduino Uno R3 18 Hình 2.9: Ảnh phân tích Histogram .23 Hình 2.10: Map giá trị độ lớn gradient vào bin tương ứng với phương 23 Hình 2.11: Biểu đồ HOG tương ứng với cell 24 Hình 2.12: Các đặc trưng Haar-like 26 Hình 2.13: Các đặc trưng haar-like sử dụng việc phát khn mặt .26 Hình 2.14: Intergal Image 27 Hình 2.15: Mơ tả Intergal Image 28 Hình 2.16: Mơ tả lọc Haar-Cascade .29 HÌNH 2.17: Kết hợp phận phân loại yếu thành phận phân loại mạnh 30 Hình 2.18: Hai đặc trưng để xác định khn mặt 30 Hình 2.19: Phần mềm Python 31 Hình2.20: Quá trình Training 33 Hình 2.21:Q trình nhận diện khn mặt 34 Hình 4.1: Sơ đồ khối hệ thống .37 Hình 4.2: Sơ đồ khối Raspberry với khối khác 40 Hình 4.3:Camera Pi kết nối với kit Raspberry .41 Hình 4.4:Bàn phím mềm 4x4 .41 Hình 4.5:Adapter chuyên dụng cho Raspberry 42 viii Hình 4.6: Sơ đồ nguyên lý toàn mạch 43 Hình 4.7: Khơng phát khuôn mặt 44 Hình 4.8: Phát khn mặt .44 Hình 5.1: Raspberry kết nối với camera, bàn phím mềm, hình LCD 47 Hình 5.2: Arduino kết nối bới Servo Raspberry 48 Hình 5.3:Servo kết nối với cửa 48 Hình 5.4: Tổng quan mơ hình 49 Hình 5.5:Mơ hình nhìn từ phía trước 49 Hình 5.6: Vị trí đặt Raspberry, camera Pi, bàn phím mềm 50 Hình 5.7:Vị trí đặt Arduino 50 Hình 5.8: Hoạt động hệ thống sau cấp nguôn 51 Hình 5.9: Hoạt động liệu xử lý hình ảnh .52 Hình 5.10: Hoạt động keypad xử lý nút nhấn 53 Hình 5.11: Hoạt động liệu hiển thị hình ảnh 54 Hình 5.12: Hoạt động relay servo 55 ix CHƯƠNG I: GIỚI THIỆU ĐỀ TÀI 1.1 ĐẶT VẤN ĐỀ Với phát triển không ngừng nghỉ khoa học kỹ thuật, việc ứng dụng khoa học kỹ thuật vào đời sống, xã hội trở nên phổ biến cần thiết hết Nó góp phần thúc đẩy phát triển thứ dần trở nên tự động hiệu suất công việc nâng cao với giúp đỡ máy móc, thiết bị Trong đó, cơng nghệ tiên tiến áp dụng rộng rãi đời sống xử lí ảnh Khơng dừng lại việc chỉnh sửa, tăng chất lượng hình ảnh mà cơng nghệ xử lí hình ảnh ngày cịn giải vấn đề nhận diện chữ viết, khn mặt, dấu vân tay,… Trong vấn đề nhiều người quan tâm nhận diện khuôn mặt Như biết, khn mặt đóng vai trị quan trọng việc giao tiếp người với người, mang lượng lớn thơng tin giúp ta xác định giới tính, tuổi tác, chủng tộc, trạng thái cảm xúc, đặc biệt xác nhận quan hệ đối tượng Do ứng dụng đóng vai trị quan trọng đời sống ngày an ninh, y tế,… Do đó, dựa tảng kiến thức học, vốn kiến thức điện tử đồng ý giảng viên hướng dẫn - thầy Nguyễn Trọng Hải, nhóm định chọn đề tài “Thiết kế hệ thống nhận diện khn mặt đóng mở cửa tự động” 1.2 MỤC TIÊU Đề tài “Thiết kế hệ thống nhận diện khn mặt đóng mở cửa tự động” với mục tiêu là: • Nhận diện xác người có sở liệu • Cho phép mơ hình mở cửa nhận diện thành cơng • Sử dụng phần mềm Python để viết chương trình nhận diện khn mặt • Sử dụng Raspberry Pi làm thiết bị nhúng • Hệ thống hoạt động ổn định 1.3 NỘI DUNG NGHIÊN CỨU Đề tài “Thiết kế hệ thống nhận diện khn mặt đóng mở cửa tự động” có nội dung sau: • Nội dung 1: Tìm hiểu Raspberry Pi phần mềm Python • Nội dung 2: Tổng quan xử lý ảnh thuật tốn nhận diện khn mặt • Nội dung 3: Viết chương trình nhận diện khn mặt • Nội dung 4: Thiết kế thi cơng mơ hình • Nội dung 5: Chạy thử nghiệm điều chỉnh mơ hình • Nội dung 6: Viết báo cáo đồ án • Nội dung 7: Báo cáo đồ án 1.4 GIỚI HẠN ĐỀ TÀI Trong đề tài này, nhóm thực xem xét chương trình nhận diện khn mặt làm mơ hình nhỏ nên cịn giới hạn về: • Nhận diện mơi trường đủ ánh sáng • Khn mặt khơng bị che khuất, góc nhìn trực diện • Mơ hình thi cơng có kích thước: • Mơ hình nhr, sử dụng máy tính để xử lý hình ảnh thơng qua phần mềm hỗ trợ Python, Raspberry Pi làm hệ thống điều khiển 1.5 BỐ CỤC Nội dung đề tài sau: • Chương – Giới thiệu đề tài: Trình bày khái quát xu hướng phát triển, nguyên nhân chọn đề tài, xác định mục tiêu giới hạn cơng việc đề tài • Chương – Tổng quan giải pháp công nghệ: Giới thiệu kiến thức tảng công nghệ phần mềm sử dụng khóa luận bao gồm kiến thức xử lý hình ảnh, kết nối Rastpberry Pi với máy tính thơng qua Python cần thiết cho mơ hình • Chương – Phương pháp giải quyết: Thực kế hoạch tập mẫu, diễn giải thơng số mơ hình, xây dựng vẽ chi tiết mơ hình, thiết kế kiểm tra hệ thống nhận diện khn mặt • Chương – Quy trình thiết kế phần cứng phần mềm: Thực lập trình hệ thống, xây dựng lưu đồ giải thuật, nạp code tiến hành chạy thử nghiệm • Chương – Thi cơng mơ hình thực nghiệm: Trình bày kết đạt qua trình kiểm tra, thử nghiệm hệ thống nhận diện khn mặt • Chương – Kết luận hướng phát triển: Trình bày kết đạt được, nêu lên hướng nghiên cứu phát triển đề tài CHƯƠNG II: TỔNG QUAN GIẢI PHÁP CÔNG NGHỆ 2.1 LÝ THUYẾT XỬ LÝ ẢNH 2.1.1 Giới thiệu Xử lý ảnh lĩnh vực mang tính khoa học cơng nghệ Nó ngành khoa học mẻ so với nhiều ngành khoa học khác tốc độ phát triển nhanh, kích thích trung tâm nghiên cứu, ứng dụng, đặc biệt máy tính chun dụng riêng Để dễ tưởng tượng, xét bước cần thiết xử lý ảnh Đầu tiên, ảnh tự nhiên từ giới thu nhận qua thiết bị thu (như Camera, máy chụp ảnh) Trước đây, ảnh thu qua camera ảnh tương tự ( loại camera ống kiểu CCIR) Gần đây, với phát triển công nghệ, ảnh màu đen trắng lấy từ Camera, sau chuyển trực tiếp thành ảnh số tạo thuận lợi cho xử lý Mặt khác, ảnh tiếp nhận từ vệ tinh, quét từ ảnh chụp từ máy quét ảnh Hình 1.1: Các bước xử lý ảnh 2.1.2 Thu nhận ảnh (Image acquision) Ảnh thu nhận qua camera màu trắng đen Thường ảnh nhận qua camera ảnh tương tự (loại camera ống chuẩn CCIR với tần số 1/25, ảnh 25 dòng), có loại camera số hóa (như lại CCD – change coupled device) loại photodiode tạo cường độ sáng điểm ảnh option_training: 'C: Training', option_back: 'B: Back', } menu_enter_password = { option_password_title: "", option_delete_password: 'D: Delete', option_confirm_password: 'C: Confirm', option_back: 'B: Back', option_free_option: "your pass: " } def init (self): super(). init () self._run_flag = True def run(self): is_show_menu = False while self._run_flag: try: key=keypad.readKey(keypad.col_list, keypad.row_list) if(key == keypad.show_menu_key): self.print_menu(self.menu_main_options) is_show_menu = True if(key == keypad.exit_program): # self.keypad_input_signal.emit(key) os._exit(0) 71 if is_show_menu: option = '' try: option = int(key) except: print('Wrong input Please enter a number ') #Check what choice was entered and act accordingly if option == self.option_add_new: time.sleep(1) self.add_new_option() self.print_menu(self.menu_main_options) elif option == self.option_delete_data: time.sleep(1) self.delete_data_option() self.print_menu(self.menu_main_options) elif option == self.option_change_password: time.sleep(1) self.change_password_option() self.print_menu(self.menu_main_options) elif option == self.option_hide_menu: print("hide/show") self.hide_menu_option() is_show_menu = False elif option == self.option_open_door: time.sleep(1) print("option_open_door") self.open_door() 72 self.print_menu(self.menu_main_options) else: print('Invalid option Please enter a number between and 4.') except KeyboardInterrupt: GPIO.cleanup() sys.exit() def add_new_option(self): print("add_new_option") admin_pass = self.get_password_from_file() input_pass = self.get_password_authentication("add new") if input_pass == None: return if(input_pass == admin_pass): data_menu = self.menu_addnew_options self.send_text_main_screen("successfully") time.sleep(2) self.print_menu(data_menu) while True: try: key=keypad.readKey(keypad.col_list, keypad.row_list) if key != None: if key is keypad.capture_key: print("capture") self.send_text_main_screen(keypad.capture_key) if key is keypad.training_key: self.send_text_main_screen(keypad.training_key) print("training") 73 return time.sleep(0.3) # gives user enoght time to release without having double inputs except KeyboardInterrupt: GPIO.cleanup() sys.exit() else: self.send_text_main_screen("password false") time.sleep(2) def get_password_authentication(self, title): data_menu = self.menu_enter_password data_menu[self.option_password_title] = title self.print_menu(data_menu) password = "" while True: try: key=keypad.readKey(keypad.col_list, keypad.row_list) if key != None: if key not in keypad.function_keys: password = password + key data_menu[self.option_free_option] = "your password:\n" + password self.print_menu(data_menu) if key is keypad.delete_key: len_key = len(password) if len_key > 0: 74 password = password[:len_key-1] data_menu[self.option_free_option] = "your password:\n" + password self.print_menu(data_menu) if key is keypad.back_key: return None if key is keypad.confirm_key: return password time.sleep(0.3) # gives user enoght time to release without having double inputs except KeyboardInterrupt: GPIO.cleanup() sys.exit() def delete_data_option(self): print("delete_data_option") admin_pass = self.get_password_from_file() input_pass = self.get_password_authentication("delete") if input_pass == None: return if(input_pass == admin_pass): time.sleep(2) self.send_text_main_screen(keypad.delete_key) time.sleep(2) self.send_text_main_screen("delete done") time.sleep(2) else: self.send_text_main_screen("password false") 75 time.sleep(2) def open_door(self): admin_pass = self.get_password_from_file() input_pass = self.get_password_authentication("open door") if input_pass == None: return if(input_pass == admin_pass): self.open_door_signal.emit() time.sleep(2) self.send_text_main_screen("door is open") time.sleep(2) else: self.send_text_main_screen("password false") time.sleep(2) def change_password_option(self): print("change_password_option") admin_pass = self.get_password_from_file() input_pass = self.get_password_authentication("old pass") if input_pass == None: return if(input_pass == admin_pass): time.sleep(2) newpass = self.get_password_authentication("new pass") if newpass == None: self.send_text_main_screen("cancel") 76 time.sleep(2) return if len(newpass) < 4: self.send_text_main_screen("password \ntoo short") time.sleep(2) return self.save_password_to_file(newpass) self.send_text_main_screen("change password \nsuccessfully") time.sleep(2) def hide_menu_option(self): self.keypad_input_signal.emit("") print("hide_menu_option") def print_menu(self, menu): global data_lcd self.data_lcd = "" for key in menu.keys(): self.data_lcd = self.data_lcd + menu[key] + "\n" self.keypad_input_signal.emit(self.data_lcd) def get_password_from_file(self): with open('password.txt', 'r') as f: return f.read() def save_password_to_file(self, password): 77 with open('password.txt', 'w') as f: f.write(password) def send_text_main_screen(self, text): self.keypad_input_signal.emit(text) def stop(self): """Sets run flag to False and waits for thread to finish""" self._run_flag = False self.wait() class App(QWidget): thread = VideoThread() name_save = "test" # is_capture_new = True showRecognize = True password_input = "" create_new_name = True keypadThread = KeypadThread() motorThread = MotorControlThread() def init (self): super(). init () 78 # self.init_variables() # self.setWindowState(Qt.WindowFullScreen) self.setWindowTitle("Face Rec") self.disply_width = 300 self.display_height = 300 self.image_label = QLabel(self) self.image_label.resize(300, 300) self.image_label.setScaledContents(True) self.image_label.move(0, 0) self.textLabel = QLabel('Webcam') self.thread.change_pixmap_signal.connect(self.update_image) self.thread.open_door_signal.connect(self.opendoor) self.thread.start() self.keypadThread.keypad_input_signal.connect(self.keypad_update) self.keypadThread.open_door_signal.connect(self.opendoor) self.keypadThread.start() self.motorThread.start() def closeEvent(self, event): self.thread.stop() event.accept() 79 def del_all_user(self): self.thread.del_all_user() def take_snapshot(self): print("take_snapshot") self.thread.take_snapshot_enable() def training_data(self): print("[INFO] start processing faces ") imagePaths = list(paths.list_images("dataset")) # filter image paths if they are not images # just get image path contain name_save imagePaths = [p for p in imagePaths if self.name_save in p] print("imagePaths", imagePaths) encodingsP = "encodings.pickle" data = pickle.loads(open(encodingsP, "rb").read()) # initialize the list of known encodings and known names knownEncodings = data["encodings"] knownNames = data["names"] # loop over the image paths for (i, imagePath) in enumerate(imagePaths): print("imagePath", imagePath, "i", i) # extract the person name from the image path print("[INFO] processing image {}/{}".format(i + 1, len(imagePaths))) name = imagePath.split(os.path.sep)[-2] image = cv2.imread(imagePath) 80 rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) boxes = face_recognition.face_locations(rgb, model="hog") encodings = face_recognition.face_encodings(rgb, boxes) for encoding in encodings: # check name not exist in knownNames print("name", name) if name not in knownNames: # add name to knownNames knownNames.append(name) # add encoding to knownEncodings knownEncodings.append(encoding) # dump the facial encodings + names to disk print("[INFO] serializing encodings ") data = {"encodings": knownEncodings, "names": knownNames} f = open("encodings.pickle", "wb") f.write(pickle.dumps(data)) f.close() # update user list list_users = self.thread.get_user_list() def tolerance_option_button_change_value(self, value): print("option_button_change_value", self.option_button.currentText()) self.thread.set_tolerance(float(self.option_button.currentText())) # def show_alert(timeout, text): 81 @pyqtSlot(np.ndarray) def update_image(self, cv_img): """Updates the image_label with a new opencv image""" qt_img = self.convert_cv_qt(cv_img) self.image_label.setPixmap(qt_img) @pyqtSlot() def opendoor(self): self.motorThread.turn_on_motor() @pyqtSlot(str) def keypad_update(self, key): if key == keypad.capture_key: if self.create_new_name: self.create_new_name = False self.name_save = str(random.randrange(1000, 10000)) self.thread.set_name(self.name_save) self.take_snapshot() self.thread.setText("capture: " + str(self.thread.getIndexImg() + 1) + "\nname: " + self.name_save) elif key == keypad.training_key: self.training_data() self.create_new_name = True self.thread.setText("training data \n done") self.thread.reload_list() elif key == keypad.delete_key: 82 self.thread.setText("delete all data") self.thread.del_all_user() else: self.thread.setText(key) # global showRecognize, name_save, create_new_name # print("key: ", key) # if(key == keypad.add_new_key): # print("add_new_key") # self.thread.setText("#: enter, D: del\nenter password: ") # elif(key == keypad.enter_key): # print("enter_key") # os._exit(0) # elif(key == keypad.capture_key): # print("capture_key face") # if self.create_new_name: # self.create_new_name = False # self.name_save = str(random.randrange(1000, 10000)) # self.thread.setText("capture: " + str(self.thread.getIndexImg() + 1) + "\nname: " + self.name_save) # self.thread.set_name(self.name_save) # self.take_snapshot() # elif(key == keypad.recognition_enable_key): # print("recognition_enable_key") # self.showRecognize = not self.showRecognize # if self.showRecognize: # # self.thread.setText("recognize") else: 83 # # self.thread.setText("camera") self.thread.set_recognize_user(self.showRecognize) # elif(key == keypad.training_key): # print("training_key face") # self.thread.setText("training data") # self.thread.restart_img_counter() # self.training_data() # self.thread.setText("training data \n done") # self.create_new_name = True # elif(key == keypad.delete_key): # print("delete_key face") # self.thread.setText("delete all data") # self.thread.del_all_user() # else: # password_input = key # self.thread.setText("password: \n" + password_input) def convert_cv_qt(self, cv_img): """Convert from an opencv image to QPixmap""" rgb_image = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB) h, w, ch = rgb_image.shape bytes_per_line = ch * w convert_to_Qt_format = QtGui.QImage( rgb_image.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888) p = convert_to_Qt_format.scaled( 84 self.disply_width, self.display_height, Qt.KeepAspectRatio) return QPixmap.fromImage(p) if name == " main ": app = QApplication(sys.argv) a = App() a.show() sys.exit(app.exec_()) 85 ... định chọn đề tài ? ?Thiết kế hệ thống nhận diện khn mặt đóng mở cửa tự động? ?? 1.2 MỤC TIÊU Đề tài ? ?Thiết kế hệ thống nhận diện khuôn mặt đóng mở cửa tự động? ?? với mục tiêu là: • Nhận diện xác người... tài ? ?Thiết kế hệ thống nhận diện khn mặt đóng mở cửa tự động? ?? 3.2 NHỮNG LỢI ÍCH CỦA HỆ THỐNG NHẬN DIỆN KHN MẶT ĐĨNG MỞ CỬA TỰ ĐỘNG • Sử dụng cơng nghệ face id • Bắt kịp xu hướng cơng nghệ • Tính... NGHỆ NHẬN DIỆN KHUÔN MẶT 36 3.2 NHỮNG LỢI ÍCH CỦA HỆ THỐNG NHẬN DIỆN KHN MẶT ĐĨNG MỞ CỬA TỰ ĐỘNG .36 3.3 NHƯỢC ĐIỂM CỦA HỆ THỐNG NHẬN DIỆN KHN MẶT ĐĨNG MỞ CỬA TỰ ĐỘNG

Ngày đăng: 01/03/2023, 18:10

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

Tài liệu liên quan