1. Trang chủ
  2. » Tất cả

Nhận diện cử chỉ tay

11 173 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 11
Dung lượng 2,35 MB
File đính kèm file dinh kem.rar (2 KB)

Nội dung

Phần I. Giới thiệu 1. Giới thiệu công nghệ Hand Tracking(Theo dõi chuyển động bàn tay) Ngày nay công nghệ thông tin đang ngày càng phát triển mạnh mẽ, trong đó công nghệ thực tế ảo đang được chú trọng và được rất nhiều các nước và các công ty công nghệ hàng đầu quan tâm. Hiện này, hầu hết sự tuơng tác giữa con người với công nghệ thực tế ảo đều thông qua các thiết bị hỗ trợ như găng tay cảm biến, … . Vậy nên để có thể tương tác với công nghệ ảo mà không cần thiết bị hỗ trợ thì cần phải có một công nghệ thay thế. Hand tracking là công nghệ được phát triển để theo dõi chuyển động và mô phỏng lại mô hình của bàn tay trong không gian. Việc này được thực hiện bằng các phân tích các hình ảnh thông qua video. Và sau đó bàn tay được mô phỏng lại bằng mô hình 3D.

HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG KHOA KỸ THUẬT ĐIỆN TỬ ************** BÁO CÁO BÀI TẬP LỚN ĐỀ TÀI: NHẬN DIỆN CỬ CHỈ TAY HỌC PHẦN: TRUYỀN THÔNG ĐA PHƯƠNG TIỆN GVHD : Vũ Hữu Tiến Mục lục LỜI MỞ ĐẦU Phần I Giới thiệu Phần II Chuẩn bị Ngơn ngữ lập trình python 2 Thư viện openCV Thư viện mediapipe .2 Máy tính camera .3 Phần III Cách thức hoạt động Phát dấu mốc bàn tay 3D theo thời gian thực .3 Xây dựng đếm ngón tay Xây dựng chức trò chơi kéo búa bao Phần IV Code Phần V Kết LỜI CẢM ƠN LỜI MỞ ĐẦU Ngày với phát triển ngành khoa học kỹ thuật, kỹ thuật điện tử đóng vai trị quan trọng lĩnh vực khoa học kỹ thuật, quản lý, cơng nghiệp tự động hóa, cung cấp thơng tin phải nắm bắt vận dụng cách có hiệu nhằm góp phần vào phát triển khoa học kĩ thuật giới nói chung kỹ thuật điện tử nói riêng Cùng với tiến khoa học công nghệ thiết bị điện tử tiếp tục ứng dụng ngày rộng rãi mang lại hiệu cao hầu hết lĩnh vực kinh tế, kỹ thuật đời sống xã hội Nhờ vào tiến công nghệ xử lý hình ảnh, ngày nhiều thiết bị có khả ghi nhận cử tay chuyển đổi thành tín hiệu xử lý máy tính Vậy nên chúng em nghiên cứu tìm hiểu đề tài “Nhận diện cử tay” Phần I Giới thiệu Giới thiệu công nghệ Hand Tracking(Theo dõi chuyển động bàn tay) Ngày công nghệ thông tin ngày phát triển mạnh mẽ, cơng nghệ thực tế ảo trọng nhiều nước công ty công nghệ hàng đầu quan tâm Hiện này, hầu hết tuơng tác người với công nghệ thực tế ảo thông qua thiết bị hỗ trợ găng tay cảm biến, … Vậy nên để tương tác với công nghệ ảo mà không cần thiết bị hỗ trợ cần phải có cơng nghệ thay Hand tracking công nghệ phát triển để theo dõi chuyển động mô lại mô hình bàn tay khơng gian Việc thực phân tích hình ảnh thơng qua video Và sau bàn tay mơ lại mơ hình 3D Tổng quan đề tài Đề tài Nhận dạng cử bàn tay , chúng em xây dựng dựa công việc chính:  Xây dựng ứng dụng nhận diện bàn tay vẽ 21 điểm 3D bàn tay  Xây dựng chức đếm số ngón tay  Xây dựng trò chơi kéo búa bao Phần II Chuẩn bị Ngơn ngữ lập trình python Python ngơn ngữ lập trình đa đời năm 1991 Guido van Rossum sáng tạo Đây ngôn ngữ lập trình với điểm mạnh dễ đọc, dễ nhớ, dễ học Với cấu trúc rõ ràng, thuận tiện nên thu hút nhiều người mong muốn học ngôn ngữ Thư viện openCV OpenCV tên viết tắt open source computer vision library – hiểu thư viện nguồn mở cho máy tính Cụ thể OpenCV kho lưu trữ mã nguồn mở dùng để xử lý hình ảnh, phát triển ứng dụng đồ họa thời gian thực OpenCV cho phép cải thiện tốc độ CPU thực hoạt động real time Nó cịn cung cấp số lượng lớn mã xử lý phục vụ cho quy trình thị giác máy tính hay learning machine khác Thư viện mediapipe MediaPipe là tập hợp loạt giải pháp Machine Learning đa tảng, can thiệp nhẹ Một số ưu điểm kể tới giải pháp bao gồm:  Cung cấp giải pháp inference nhanh chóng: Google khẳng định cơng cụ chạy ổn định hầu hết cấu hình phần cứng thơng dụng  Dễ dàng cài đặt triển khai: Việc cài đặt dễ dàng tiện lợi, triển khai nhiều tảng khác Mobile (Android/iOS), Desktop/Cloud, Web IoT devices  Mã nguồn mở miễn phí: Tồn source code cơng khai trên MediaPipe, người dùng hồn tồn sử dụng tùy chỉnh trực tiếp để phù hợp với tốn Máy tính camera Phần III Cách thức hoạt động Phát dấu mốc bàn tay 3D theo thời gian thực Thư viện Mediapipe cung cấp giải pháp mạnh mẽ có khả dự đốn 21 điểm mốc 3D trong thời gian thực với độ xác tốc độ cao, thiết bị cấp thấp điện thoại, máy tính xách tay, v.v., điều làm cho bật so với thiết bị khác giải pháp khỏi Hình ảnh bên cho thấy 21 mốc bàn tay mà giải pháp phát với mục chúng Để phát xác 21 điểm mốc bàn tay , nhà phát triển phải đánh dấu thủ cơng 30K hình ảnh giới thực với tọa độ 3D cách sử dụng đồ độ sâu hình ảnh Giải pháp: phải khởi tạo lớp hands bằng  mp.solutions.hands cú pháp sau phải gọi hàm  mp.solutions.hands.Hands() với tham số:  static_image_mode - Đây giá trị boolean mà đặt thành  False, giải pháp coi hình ảnh đầu vào luồng    video. Nó cố gắng phát bàn tay hình ảnh đầu vào phát thành công địa hóa thêm mốc bàn tay. Nếu đặt thành  True, tính phát bàn tay chạy hình ảnh đầu vào lý tưởng để xử lý loạt hình ảnh tĩnh, khơng liên quan. Giá trị mặc định là  False max_num_hands : Đó số lượng bàn tay tối đa để phát hiện. Giá trị mặc định là  2 min_detection_confidence : Đây độ tin cậy phát tối thiểu  ([0.0, 1.0]) cần thiết để coi dự đoán mơ hình phát lịng bàn tay xác. Giá trị mặc định tất nó  0.5 có nghĩa phát có độ tin cậy dự đốn nhỏ 50% bị bỏ qua theo mặc định min_tracking_confidence : Đó độ tin cậy theo dõi tối thiểu  ([0.0, 1.0]) cần thiết để coi mốc bàn tay theo dõi mơ hình theo dõi mốc hợp lệ. Nếu độ tin cậy nhỏ giá trị đối số trình phát lại gọi khung hình / hình ảnh tiếp theo, đó, việc tăng giá trị làm tăng độ chắn, làm tăng độ trễ. Giá trị mặc định là  0.5 Xây dựng đếm ngón tay Ngun lí hoạt động:Sau có kết 21 điểm mốc ngón tay đánh dấu chúng , ta thực sau:   So sánh tọa độ y của FINGER_TIP mốc và  FINGER_PIP mốc ngón tay. Nếu tọa độ y của  FINGER_TIP có giá trị thấp giá trị của  FINGER_PIP ngón tay duỗi thẳng ngược lại Nhưng ngón tay khác chút phải so sánh tọa độ x của  THUMB_TIP mốc và  THUMB_MCP mốc điều kiện thay đổi tùy thuộc vào việc tay trái hay tay phải Đối với tay phải, ngón tay mở, tọa độ x của mốc THUMB_TIP  có giá trị thấp so với  mốc THUMB_MCP và ngược lại tay trái Xây dựng chức trò chơi kéo búa bao Dựa vào kết phần phát dấu mốc bàn tay , có mảng lưu trữ giá trị trạng thái ngón tay :     Nếu trạng thái ngón tay bên trái True(tương đương với kéo) , trạng thái ngón tay bên phải False(tương đương với búa) bên phải thắng ngược lại Nếu trạng thái ngón tay nên trái True(tương đương với lá) , trạng thái ngón tay bên phải False( tương đương với búa) bên phải thắng ngược lại Nếu trạng thái ngón tay bên trái True (tương đương với kéo) trạng thái ngón tay bên phải True(tương đương với lá) bên trái thắng ngược lại Nếu trạng thái ngón tay tương ứng bên giống kết hịa Phần IV Code import cv2 import time import mediapipe as mp mp_hands = mp.solutions.hands hands = mp_hands.Hands(static_image_mode=True, max_num_hands=2, min_detection_confidence=0.5) hands_videos = mp_hands.Hands(static_image_mode=False, max_num_hands=2, min_detection_confidence=0.5) mp_drawing = mp.solutions.drawing_utils pTime = cap = cv2.VideoCapture(0) def detectHandsLandmarks(image, hands,draw=True): output_image = image.copy() imgRGB = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = hands.process(imgRGB)# phát dấu hiệu bàn tay if results.multi_hand_landmarks and draw: #kiểm tra xem có điểm mốc vẽ bàn tay không for hand_landmarks in results.multi_hand_landmarks: #lặp lại điểm bàn tay mp_drawing.draw_landmarks(image=output_image, landmark_list=hand_landmarks, connections=mp_hands.HAND_CONNECTIONS, landmark_drawing_spec=mp_drawing.DrawingSpec(color=(255, 255, 255), thickness=2, circle_radius=2), connection_drawing_spec=mp_drawing.DrawingSpec(color=(0, 255, 0), thickness=2, circle_radius=2))#vẽ điểm mốc bàn tay return output_image, results def countFingers(image,result): # hàm đếm số ngón tay height, width,_ = image.shape #lấy kích thước ảnh output_image = image.copy() count = {'RIGHT': 0, 'LEFT': 0} # biến lưu số ngón tay fingers_tips_ids = [mp_hands.HandLandmark.INDEX_FINGER_TIP, mp_hands.HandLandmark.MIDDLE_FINGER_TIP, mp_hands.HandLandmark.RING_FINGER_TIP, mp_hands.HandLandmark.PINKY_TIP] #lưu số mốc ngón tay fingers_statuses = {'RIGHT_THUMB': False, 'RIGHT_INDEX': False, 'RIGHT_MIDDLE': False, 'RIGHT_RING': False, 'RIGHT_PINKY': False, 'LEFT_THUMB': False, 'LEFT_INDEX': False, 'LEFT_MIDDLE': False, 'LEFT_RING': False, 'LEFT_PINKY': False} #chỗ lưu trạng thái ngón tay for hand_index, hand_info in enumerate(results.multi_handedness): hand_label = hand_info.classification[0].label # lấy nhãn bàn tay đc tìm thấy hand_landmarks = results.multi_hand_landmarks[hand_index]# lấy điểm mốc for tip_index in fingers_tips_ids: #lặp số ngón tay finger_name = tip_index.name.split("_")[0] # truy xuất nhãn if (hand_landmarks.landmark[tip_index].y < hand_landmarks.landmark[tip_index - 2].y): fingers_statuses[hand_label.upper() + "_" + finger_name] = True count[hand_label.upper()] += #check ngón tay thumb_tip_x = hand_landmarks.landmark[mp_hands.HandLandmark.THUMB_TIP].x thumb_mcp_x = hand_landmarks.landmark[mp_hands.HandLandmark.THUMB_TIP - 2].x if ((hand_label == 'Right' and (thumb_tip_x < thumb_mcp_x)) or (hand_label == 'Left' and (thumb_tip_x > thumb_mcp_x))): fingers_statuses[hand_label.upper() + "_THUMB"] = True count[hand_label.upper()] += return output_image, fingers_statuses, count,width def displaycounter(frame,width): cv2.putText(frame, str(sum(count.values())), (width // - 150, 240), cv2.FONT_HERSHEY_SIMPLEX, 8.9, (20, 255, 155), 10, 10) def keobuala(frame,fingers_statuses,width):# trò chơi kéo búa bao cv2.putText(frame, 'Player1', (10, 100), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 255, 0), 2) cv2.putText(frame, 'Player2', (450, 100), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 255, 0), 2) #truong hop keo bua if(fingers_statuses['LEFT_THUMB']== False and fingers_statuses['LEFT_INDEX']== True and fingers_statuses['LEFT_MIDDLE'] == True and fingers_statuses['LEFT_RING'] == False and fingers_statuses['LEFT_PINKY'] == False and fingers_statuses['RIGHT_THUMB']==False and fingers_statuses['RIGHT_INDEX']==False and fingers_statuses['RIGHT_MIDDLE'] == False and fingers_statuses['RIGHT_RING'] ==False and fingers_statuses['RIGHT_PINKY']==False): cv2.putText(frame, 'Player2 Win', (width//2 - 150, 240), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 255, 0), 2) elif(fingers_statuses['LEFT_THUMB']== False and fingers_statuses['LEFT_INDEX']== False and fingers_statuses['LEFT_MIDDLE'] == False and fingers_statuses['LEFT_RING'] == False and fingers_statuses['LEFT_PINKY'] == False and fingers_statuses['RIGHT_THUMB']==False and fingers_statuses['RIGHT_INDEX']==True and fingers_statuses['RIGHT_MIDDLE'] == True and fingers_statuses['RIGHT_RING'] ==False and fingers_statuses['RIGHT_PINKY']==False): cv2.putText(frame, 'Player1 Win', (width//2 - 150, 240), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 255, 0), 2) #truong hop bua la elif (fingers_statuses['LEFT_THUMB'] == True and fingers_statuses['LEFT_INDEX'] == True and fingers_statuses['LEFT_MIDDLE'] == True and fingers_statuses['LEFT_RING'] == True and fingers_statuses['LEFT_PINKY'] == True and fingers_statuses['RIGHT_THUMB'] == False and fingers_statuses['RIGHT_INDEX'] == False and fingers_statuses['RIGHT_MIDDLE'] == False and fingers_statuses['RIGHT_RING'] == False and fingers_statuses['RIGHT_PINKY'] == False): cv2.putText(frame, 'Player1 Win', (width // - 150, 240), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 255, 0), 2) elif (fingers_statuses['LEFT_THUMB'] == False and fingers_statuses['LEFT_INDEX'] == False and fingers_statuses['LEFT_MIDDLE'] == False and fingers_statuses['LEFT_RING'] == False and fingers_statuses['LEFT_PINKY'] == False and fingers_statuses['RIGHT_THUMB'] == True and fingers_statuses['RIGHT_INDEX'] == True and fingers_statuses['RIGHT_MIDDLE'] == True and fingers_statuses['RIGHT_RING'] == True and fingers_statuses['RIGHT_PINKY'] == True): cv2.putText(frame, 'Player2 Win', (width // - 150, 240), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 255, 0), 2) #trương hop keo la elif (fingers_statuses['LEFT_THUMB'] == False and fingers_statuses['LEFT_INDEX'] == True and fingers_statuses['LEFT_MIDDLE'] == True and fingers_statuses['LEFT_RING'] == False and fingers_statuses['LEFT_PINKY'] == False and fingers_statuses['RIGHT_THUMB'] == True and fingers_statuses['RIGHT_INDEX'] == True and fingers_statuses['RIGHT_MIDDLE'] == True and fingers_statuses['RIGHT_RING'] == True and fingers_statuses['RIGHT_PINKY'] == True): cv2.putText(frame, 'Player1 Win', (width // - 150, 240), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 255, 0), 2) elif (fingers_statuses['LEFT_THUMB'] == True and fingers_statuses['LEFT_INDEX'] == True and fingers_statuses['LEFT_MIDDLE'] == True and fingers_statuses['LEFT_RING'] == True and fingers_statuses['LEFT_PINKY'] == True and fingers_statuses['RIGHT_THUMB'] == False and fingers_statuses['RIGHT_INDEX'] == True and fingers_statuses['RIGHT_MIDDLE'] == True and fingers_statuses['RIGHT_RING'] == False and fingers_statuses['RIGHT_PINKY'] == False): cv2.putText(frame, 'Player2 Win', (width // - 150, 240), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 255, 0), 2) #truong hop hoa elif (fingers_statuses['LEFT_THUMB'] == True and fingers_statuses['LEFT_INDEX'] == True and fingers_statuses['LEFT_MIDDLE'] == True and fingers_statuses['LEFT_RING'] == True and fingers_statuses['LEFT_PINKY'] == True and fingers_statuses['RIGHT_THUMB'] == True and fingers_statuses['RIGHT_INDEX'] == True and fingers_statuses['RIGHT_MIDDLE'] == True and fingers_statuses['RIGHT_RING'] == True and fingers_statuses['RIGHT_PINKY'] == True): cv2.putText(frame, 'HOA', (width // - 100, 240), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 255, 0), 2) elif (fingers_statuses['LEFT_THUMB'] == False and fingers_statuses['LEFT_INDEX'] == False and fingers_statuses['LEFT_MIDDLE'] == False and fingers_statuses['LEFT_RING'] == False and fingers_statuses['LEFT_PINKY'] == False and fingers_statuses['RIGHT_THUMB'] == False and fingers_statuses['RIGHT_INDEX'] == False and fingers_statuses['RIGHT_MIDDLE'] == False and fingers_statuses['RIGHT_RING'] == False and fingers_statuses['RIGHT_PINKY'] == False): cv2.putText(frame, 'HOA', (width // - 100, 240), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 255, 0), 2) elif (fingers_statuses['LEFT_THUMB'] == False and fingers_statuses['LEFT_INDEX'] == True and fingers_statuses['LEFT_MIDDLE'] == True and fingers_statuses['LEFT_RING'] == False and fingers_statuses['LEFT_PINKY'] == False and fingers_statuses['RIGHT_THUMB'] == False and fingers_statuses['RIGHT_INDEX'] == True and fingers_statuses['RIGHT_MIDDLE'] == True and fingers_statuses['RIGHT_RING'] == False and fingers_statuses['RIGHT_PINKY'] == False): cv2.putText(frame, 'HOA', (width // - 100, 240), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 255, 0), 2) while True: success, img = cap.read() imggray = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) cTime = time.time() fps = / (cTime - pTime) pTime = cTime frame, results = detectHandsLandmarks(img, hands_videos) if results.multi_hand_landmarks: frame, fingers_statuses, count,width = countFingers(frame, results) #displaycounter(frame,width) keobuala(frame,fingers_statuses,width) print(fingers_statuses) cv2.putText(frame, f'FPS: {int(fps)}', (10, 30), cv2.FONT_HERSHEY_PLAIN,2, (0, 255, 0), 1) cv2.imshow('Image', frame) if cv2.waitKey(10) & 0xFF == ord('q'): break cap.release() cv2.destroyWindow() Phần V Kết 1.Demo đếm số ngón tay 2.Demo trị chơi kéo búa LỜI CẢM ƠN Đầu tiên, chúng em xin gửi lời cảm ơn sâu sắc đến Học viện Cơng nghệ Bưu Viễn thơng đưa mơn học Truyền thơng đa phương tiện vào chương trình giảng dạy Đặc biêt, chúng em xin gửi lời cảm ơn sâu sắc đến giảng viên Vũ Hữu Tiến truyền đạt kiến thức quý báu cho chúng em suốt thời gian học tập kỳ vừa qua Thầy giảng dạy nhiệt tình hỗ trợ chúng em nhiều việc gửi tài liệu trực tuyến tạo thảo luận Vì vậy, thời gian tham dự lớp học thầy, chúng em tiếp thu, tích lũy cho thân nhiều kiến thức bổ ích, học cách nghiên cứu tìm hiểu đề tài Đây thực điều cần thiết cho trình rèn luyện, học tập công tác chúng em sau Bộ môn Truyền thông đa phương tiện môn học bổ ích gắn liền với nhu cầu thực tiễn sinh viên Tuy nhiên, thời gian học tập học phần không nhiều, cố gắng tích lũy kiến thức học chắn hiểu biết môn học em điểm hạn chế Do vậy, báo cáo chúng em khó tránh khỏi thiếu sót có điểm chưa chuẩn xác Kinh mong thầy xem xét góp ý giúp báo cáo chúng em hoàn thiện Chúng em xin trân thành cảm ơn! Hà Nội, ngày 06 tháng 05 năm 2022 Sinh viên thực Bùi Văn Mạnh Lê Đăng Long Nguyễn Công Minh ... video Và sau bàn tay mơ lại mơ hình 3D Tổng quan đề tài Đề tài Nhận dạng cử bàn tay , chúng em xây dựng dựa công việc chính:  Xây dựng ứng dụng nhận diện bàn tay vẽ 21 điểm 3D bàn tay  Xây dựng... hình ảnh, ngày nhiều thiết bị có khả ghi nhận cử tay chuyển đổi thành tín hiệu xử lý máy tính Vậy nên chúng em nghiên cứu tìm hiểu đề tài ? ?Nhận diện cử tay? ?? Phần I Giới thiệu Giới thiệu công nghệ... của  FINGER_PIP ngón tay duỗi thẳng ngược lại Nhưng ngón tay khác chút phải so sánh tọa độ x của  THUMB_TIP mốc và  THUMB_MCP mốc điều kiện thay đổi tùy thuộc vào việc tay trái hay tay phải Đối với tay phải,

Ngày đăng: 05/02/2023, 23:00

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w