Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 76 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
76
Dung lượng
783,17 KB
Nội dung
1 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC NHA TRANG KHOA CÔNG NGHỆ THÔNG TIN NGUYỄN LÊ THIÊN THƠ TÌM HIỂU CAMERA 3D, ỨNG DỤNG LẬP TRÌNH GIAO TIẾP GIỮA NGƯỜI VÀ MÁY BẰNG CÁC CỬ CHỈ CỦA TAY ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC NGÀNH CÔNG NGHỆ THÔNG TIN CÁN BỘ HƯỚNG DẪN: TS ĐINH ĐỒNG LƯỠNG NHA TRANG – NĂM 2016 LỜI NÓI ĐẦU Sự tương tác người sử dụng với máy tính ngày trở nên phong phú, đa dạng song hành với phát triển công nghệ thông tin ngày Trong thập niên 70, bàn phím công cụ để điều khiển máy tính Sau đến giao diện đồ họa phát triển, chuột máy tính phát minh hỗ trợ việc tương tác với máy tính trở nên thuận tiện Cùng với phát triển công nghệ, thuật toán, người giao tiếp với máy tính thông qua hình cảm ứng chạm giọng nói Tháng 04 năm 2010, xuất Camera 3D Kinect – thiết bị phát triển Microsoft thực cách mạng lĩnh vực giao tiếp người – máy Đến tháng 01 năm 2014, Intel mắt công nghệ Intel RealSense với khả cảm nhận không gian 3D góp phần đưa tương tác người – máy lên tầm cao Tuy xuất lâu Intel RealSense tiện ích lạ Việt Nam, chọn đề tài với mong muốn tìm hiểu, trải nghiệm công nghệ Intel RealSense ứng dụng công nghệ vào việc điều khiển bàn phím, chuột thông qua hình dạng cử bàn tay Từ đó, xây dựng ứng dụng áp dụng vào việc điều khiển trình chiếu Power Point thông qua cử bàn tay mà không cần đến thiết bị bàn phím hay chuột Em xin gửi đến Thầy TS Đinh Đồng Lưỡng lời cảm ơn chân thành sâu sắc Nhờ hướng dẫn giúp đỡ tận tình Thầy suốt 15 tuần, em thực hoàn thành Đồ Án Tốt Nghiệp Sự nhiệt tình hướng dẫn, bảo thầy suốt trình thực đề tài giúp em có thêm nhiều động lực, định hướng để hoàn thành đề tài Em xin cảm ơn Thầy! Đồng thời, em xin trân trọng cảm ơn Thầy Cô Trường Đại Học Nha Trang nói chung Khoa Công Nghệ Thông Tin nói riêng tận tình dạy dỗ em suốt quảng thời gian ngồi ghế giảng đường đại học Những kiến thức, kỹ mà Thầy Cô dạy cho em thực khiến em hoàn thiện thân học tập, làm việc lẫn sống Nha Trang, ngày 04 tháng 06 năm 2016 Nguyễn Lê Thiên Thơ MỤC LỤC LỜI NÓI ĐẦU DANH MỤC TỪ VIẾT TẮT DANH MỤC HÌNH ẢNH, BẢNG BIỂU CHƯƠNG I TỔNG QUAN 1.1 Giới thiệu Camera 3D 1.2 Công nghệ Camera Intel RealSense 3D 10 1.3 Giới thiệu Intel RealSense SDK 11 1.4 Các ứng dụng Camera 3D tương lai 13 1.5 Yêu cầu đề tài 15 1.6 Phương pháp 16 1.7 Cấu trúc báo cáo đồ án tốt ngiệp 17 CHƯƠNG II CỞ SỞ LÝ THUYẾT 19 2.1 Ngôn ngữ lập trình C++ 19 2.2 Thư viện OpenCV 21 2.3 Thư viện Intel RealSense SDK 24 2.3.1 Kiến trúc Intel RealSense SDK 24 2.3.2 Các Interface cốt lõi Intel RealSense SDK 25 2.4 Mô-đun Hand Tracking 26 CHƯƠNG III KHẢO SÁT BÀI TOÁN 29 3.1 Cấu trúc liệu 29 3.1.1 Dữ liệu 3D 29 3.1.2 Dữ liệu tay – Hand Data 30 3.2 Phương pháp giải 33 3.2.1 Đóng gói liệu 33 3.2.2 Xử lý liệu 37 CHƯƠNG IV XÂY DỰNG MÔ-ĐUN XỬ LÝ 40 4.1 Các định nghĩa số 40 4.2 Các phương thức xử lý 41 4.3 Interface HandDetail 42 4.3.1 Định nghĩa kiểu liệu Enum 42 4.3.2 Thuộc tính 43 4.3.3 Phương thức 45 CHƯƠNG V KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 47 5.1 Kết luận 47 5.2 Hướng phát triển 48 TÀI LIỆU THAM KHẢO 49 PHỤ LỤC 50 DANH MỤC TỪ VIẾT TẮT 2D 2-Dimension 3D 3-Dimension E3 Electronic Entertainment Expo CES Consumer Electronics Show PC Personal Computer SDK Software Development Kit GB Gigabyte USB Universal Serial Bus OpenCL Open Computing Language OpenCV Open Computer Vision XML eXtensible Markup Language OOP Oject Oriented Programming ISO International Organization for Standardization IEC International Electrotechnical Commission DANH MỤC HÌNH ẢNH, BẢNG BIỂU Hình 1.1: Camera 3D (Kinect) Hình 1.2: Cấu tạo Camera Intel RealSense 3D Hình 1.3: Camera SR300 11 Hình 1.4: Camera R200 12 Hình 1.5: Các game điều khiển cử khuôn mặt 14 Hình 1.6: Minh họa bước xử lý chương trình 16 Hình 2.1: Kiến trúc thư viện OpenCV 21 Hình 2.2: Kiến trúc Intel RealSense SDK 23 Hình 2.3: Hệ thống Interface C++/C# 24 Hình 3.1: Sự khác biệt liệu 2D 3D 28 Hình 3.2: Minh họa bước xử lý 32 Hình 3.3: Khuôn mẫu lớp Tree 33 Hình 3.4: Khuôn mẫu lớp Node 33 Hình 3.5: Minh họa cấu trúc liệu dạng 34 Hình 3.6: Xây dựng cấu trúc 35 Hình 3.7: Minh họa nhánh cấu trúc 36 Hình 3.8: Minh họa cách xác định tư ngón tay 37 Hình 3.9: Minh họa chuyển động điểm bàn tay 38 CHƯƠNG I TỔNG QUAN 1.1 Giới thiệu Camera 3D Kinect (tên gọi trước Project Natal) thiết bị camera có khả thu nhận cảm biến chuyển động phát triển Microsoft công bố vào tháng năm 2009 hội nghị thường niên E3 Thời gian đầu xuất hiện, Kinect thiết bị chuyên dụng hệ máy Xbox 360, phục vụ cho việc chơi game Hình 1.1 – Camera 3D (Kinect) Kinect thực tạo sốt không cộng đồng Game mà giới nghiên cứu, lập trình viên nhà thiết kế giới Kinect ứng dụng vào nhiều lĩnh vực đời sống như: giáo dục, y khoa, robot, giao tiếp người – máy Đầu năm 2014, Intel nâng tầm công nghệ Camera 3D lên tầm cao giới thiệu Camera Intel RealSense 3D triển lãm CES 2014 Camera 3D có khả ghi nhận chiều sâu đối tượng, tương tự mắt người, hỗ trợ công nghệ nhận dạng khuôn mặt, khả nhận biết cử ngón tay, hiểu theo dõi cảm xúc gương mặt Camera Intel Realsense 3D có phiên dành cho thiết bị laptop, All in One, 2in1, tablet smartphone Hình 1.2 – Cấu tạo Camera Intel RealSense 3D Camera Intel RealSense 3D bao gồm thành phần riêng biệt: ống kính thường, ống kính hồng ngoại ống kính laser hồng ngoại Khi kết hợp với nhau, ống kính cho phép thiết bị suy chiều sâu cách phát ánh sáng hồng ngoại phản xạ trở lại từ đối tượng phía trước Dữ liệu trực quan này, lấy kết hợp với phần mềm theo dõi chuyển động Intel RealSense, tạo giao diện cảm ứng không cần chạm có khả phản hồi theo chuyển động tay, cánh tay, đầu nét mặt người dùng, cho phép họ tương tác với thiết bị cách dễ dàng 10 Chiếc Camera Intel RealSense 3D tích hợp ống kính cảm biến chiều sâu mắt người độ phân giải full 1080p Thiết bị có khả nhận biết chuyển động ngón tay, cho phép nhận dạng cử động với độ xác cao, hiểu cử động cảm xúc gương mặt 1.2 Công nghệ Camera Intel RealSense 3D Công nghệ Camera Intel RealSense 3D, ban đầu gọi Intel Perceptual Computing, tảng cho phép người thực việc tương tác với máy tính thông qua cử cảm xúc khuôn mặt qua không giản mở Điều cho phép người điều khiển máy tính mình, lệnh, nhận diện hay quét vật thể qua không gian mà không cần chạm bấm Để làm điều này, Camera 3D phận đóng vai trò then chốt trình hoạt động Intel RealSense Chức ghi nhận thao tác, cử biểu cảm khuôn mặt người dùng để từ máy tính thực thi tác vụ theo yêu cầu Intel RealSense cho phép người dùng tương tác với máy tính (PC để bàn laptop) thông qua cử thể bao gồm hai tay, khuôn mặt, điệu thay cho kiểu tương tác với PC, laptop truyền thống qua bàn phím, chuột Như vậy, với thao tác điều khiển máy tính nhận diện qua cử chỉ, khuôn mặt người dùng Công nghệ giúp người dùng kích hoạt mở máy tính chức nhận diện khuôn mặt in văn bản, chơi game, vẽ, ghi chú, chí chơi nhạc cụ cử tương tác tay mà không cần phải chạm vào máy RealSense hoạt động cách sử dụng camera máy, camera kết nối với thư viện lưu giữ thông tin đơn giản hóa 62 //=====================================================// bool HandDetail::mouseGate() { mouseCount++; // pass n Calls if (mouseCount save the previous Index Tip Data 63 preIndexTip = indexTip; // get New Fingers Values wrist = rootDataNode->getNodeValue(); thumb0 = rootDataNode->getChildNodes()[0].getNodeValue(); thumb1 = rootDataNode->getChildNodes()[0].getChildNodes()[0].getNodeValue(); thumb2 = rootDataNode->getChildNodes()[0].getChildNodes()[0].getChildNodes()[0] getNodeValue(); thumbTip = rootDataNode->getChildNodes()[0].getChildNodes()[0].getChildNodes()[0] getChildNodes()[0].getNodeValue(); index0 = rootDataNode->getChildNodes()[1].getNodeValue(); index1 = rootDataNode->getChildNodes()[1].getChildNodes()[0].getNodeValue(); index2 = rootDataNode->getChildNodes()[1].getChildNodes()[0].getChildNodes()[0] getNodeValue(); indexTip = rootDataNode->getChildNodes()[1].getChildNodes()[0].getChildNodes()[0] getChildNodes()[0].getNodeValue(); mid0 = rootDataNode->getChildNodes()[2].getNodeValue(); mid1 = 64 rootDataNode->getChildNodes()[2].getChildNodes()[0] getNodeValue(); mid2 = rootDataNode->getChildNodes()[2].getChildNodes()[0].getChildNodes()[0] getNodeValue(); midTip = rootDataNode->getChildNodes()[2].getChildNodes()[0].getChildNodes()[0] getChildNodes()[0].getNodeValue(); ring0 = rootDataNode->getChildNodes()[3].getNodeValue(); ring1 = rootDataNode->getChildNodes()[3].getChildNodes()[0].getNodeValue(); ring2 = rootDataNode->getChildNodes()[3].getChildNodes()[0].getChildNodes()[0] getNodeValue(); ringTip = rootDataNode->getChildNodes()[3].getChildNodes()[0].getChildNodes()[0] getChildNodes()[0].getNodeValue(); pinky0 = rootDataNode->getChildNodes()[4].getNodeValue(); pinky1 = rootDataNode->getChildNodes()[4].getChildNodes()[0].getNodeValue(); pinky2 = rootDataNode->getChildNodes()[4].getChildNodes()[0].getChildNodes()[0] getNodeValue(); pinkyTip = rootDataNode->getChildNodes()[4].getChildNodes()[0].getChildNodes()[0] 65 getChildNodes()[0].getNodeValue(); updateHandShape(); // if Mouse Mode OFF -> continue detect new Gesture if (isMouseOn == false) updateHandGesture(); else if (changeShape == false) // Mouse Mode ON -> process MouseMove updateCursor(); } //=====================================================// void HandDetail::updateHandShape() { int dem = 0; // count the number of straight Fingers straightFingers = ""; // which Finger is straight // straight Thumb if (isStraightFinger(&thumb0, &thumb1, &thumb2, &thumbTip)) { dem++; straightFingers += "thumb "; } 66 // straight Index if (isStraightFinger(&index0, &index1, &index2, &indexTip) && isStraightFingerH(&wrist, &index0, &indexTip)) { dem++; straightFingers += "index "; } // straight Mid if (isStraightFinger(&mid0, &mid1, &mid2, &midTip) && &ring2, &ringTip) && isStraightFingerH(&wrist, &mid0, &midTip)) { dem++; straightFingers += "mid "; } // straight Ring if (isStraightFinger(&ring0, &ring1, isStraightFingerH(&wrist, &ring0, &ringTip)) { dem++; straightFingers += "ring "; } // straight Pinky if (isStraightFinger(&pinky0, &pinky1, &pinky2, &pinkyTip) && isStraightFingerH(&wrist, &pinky0, &pinkyTip)) 67 { dem++; straightFingers += "pinky "; } HandDetail::HandShape handShape; switch (dem) { case 0: handShape = HandDetail::ZERO; break; case 1: handShape = HandDetail::ONE; break; case 2: handShape = HandDetail::TWO; break; case 3: handShape = HandDetail::THREE; break; case 4: handShape = HandDetail::FOUR; break; case 5: handShape = HandDetail::FIVE; break; 68 default: handShape = HandDetail::NONES; break; } // Special Shape -> Mouse Mode On if (straightFingers == "index " || straightFingers == "thumb index ") { handShape = HandDetail::MOUSE; isMouseOn = true; } else isMouseOn = false; // detect Difference if (i_handShape == handShape) changeShape = false; else // i_handShape != handShape { i_handShape = handShape; changeShape = true; } } 69 //=====================================================// void HandDetail::updateHandGesture() { updateGesture(); // push current state Movement into the Queue Up, Right, Down or Left // initialize int up, right, down, left; left = right = up = down = 0; // count in the Queue for (int i = 0; i < NUM_OF_HAND_PRE_MOVEMENT; i++) { switch (previousGesture[i]) { case 'U': up++; break; case 'R': right++; break; case 'D': down++; break; case 'L': left++; break; 70 default: break; } } // get current HAND GESTURE if (up >= int(NUM_OF_HAND_PRE_MOVEMENT * RATE_OF_HAND_GESTURE_DETECTOR)) i_handGesture = HandDetail::PULL_UP; else if (right >= int(NUM_OF_HAND_PRE_MOVEMENT * RATE_OF_HAND_GESTURE_DETECTOR)) i_handGesture = HandDetail::PULL_RIGHT; else if (down >= int(NUM_OF_HAND_PRE_MOVEMENT * RATE_OF_HAND_GESTURE_DETECTOR)) i_handGesture = HandDetail::PULL_DOWN; else if (left >= int(NUM_OF_HAND_PRE_MOVEMENT RATE_OF_HAND_GESTURE_DETECTOR)) i_handGesture = HandDetail::PULL_LEFT; else i_handGesture = HandDetail::NONEG; // Reset Queue if (i_handGesture != HandDetail::NONEG) * 71 { resetPreviousGesture(); } } //=====================================================// void HandDetail::updateGesture() { float deltaX = mid0.positionWorld.x - preMid0.positionWorld.x; float deltaY = mid0.positionWorld.y - preMid0.positionWorld.y; if (abs(deltaX) >= abs(deltaY)) { if (deltaX >= LEAST_MOVE_DISTANCE) // left - increase X pushGesture('L'); else if (deltaX = LEAST_MOVE_DISTANCE) // up - increase Y pushGesture('U'); else if (deltaY = 1; i ) { previousGesture[i] = previousGesture[i-1]; } previousGesture[0] = gestureHeading; } //=====================================================// void HandDetail::resetPreviousGesture() { for (int i = 0; i < NUM_OF_HAND_PRE_MOVEMENT; i++) previousGesture[i] = 'N'; } //=====================================================// void HandDetail::updateCursor() { 73 // get distance of Hand Move float deltaX = mid0.positionWorld.x - preMid0.positionWorld.x; float deltaY = mid0.positionWorld.y - preMid0.positionWorld.y; // compute the distance that Mouse will move (pixel) int x = (int) (-deltaX / MOVE_DISTANCE_PER_PIXCEL); int y = (int) (-deltaY / MOVE_DISTANCE_PER_PIXCEL); if (x != || y != 0) MouseMove(&mouseInput, x, y); } //=====================================================// bool HandDetail::getChangeShape() { return changeShape; } //=====================================================// string HandDetail::getStraightFingers() { return straightFingers; } //=====================================================// string HandDetail::getHandShapeToString() { 74 switch (i_handShape) { case HandDetail::NONES: return "NONES"; break; case HandDetail::ZERO: return "ZERO"; break; case HandDetail::ONE: return "ONE"; break; case HandDetail::TWO: return "TWO"; break; case HandDetail::THREE: return "THREE"; break; case HandDetail::FOUR: return "FOUR"; break; case HandDetail::FIVE: return "FIVE"; break; case HandDetail::MOUSE: return "MOUSE"; break; default: 75 return "NONE _ ERROR"; break; } } //=====================================================// HandDetail::HandShape HandDetail::getHandShape() { return i_handShape; } //=====================================================// HandDetail::HandGesture HandDetail::getHandGesture() { if (gestureDelay) // can not get New Hand Gesture { if (gestureGate()) gestureDelay = false; // can get New Hand Gesture return HandDetail::NONEG; } // gestureDelay == false if (i_handGesture != HandDetail::NONEG) gestureDelay = true; HandGesture hG = i_handGesture; 76 i_handGesture = HandDetail::NONEG; return hG; } HẾT [...]... Hình 1.5 – Các game điều khiển bằng cử chỉ và khuôn mặt 1.5 Yêu cầu đề tài Nội dung yêu cầu thực hiện trong đề tài: - Tìm hiểu camera 3D, sự cần thiết của dữ liệu 3D trong việc nhận dạng các đối tượng - Giới thiệu và trình bày đặc tính của camera 3D Realsense, tìm hiều thư viện SDK hỗ trợ Camera Realsense, cách thu ảnh 3D realtime và trích chọn đặc trưng của tay - Nhận dạng các tư thế của tay thông... mềm bằng cách cho phép lập trình viên tập trung vào các đối tượng phần mềm ở bậc cao hơn Ngoài ra, nhiều người còn cho rằng OOP dễ tiếp thu hơn cho những người mới học về lập trình hơn là các phương pháp trước đó Một cách giản lược, đây là khái niệm và là một nỗ lực nhằm giảm nhẹ các thao tác viết mã cho người lập trình, cho phép họ tạo ra các ứng dụng mà các yếu tố bên ngoài có thể tương tác với các. .. nhận dạng các di chuyển của tay - Ứng dụng trong giao tiếp người và máy tính thông qua các hình dạng, cử chỉ tay, sử dụng ngôn ngữ lập trình C++ 16 1.6 Phương pháp Từ khi ra mắt đến nay, công nghệ Intel RealSense đang dần được tích hợp sẵn trong các sản phẩm thương mại cùng những ứng dụng đi kèm mang đến trải nghiệm mới lạ cho người dùng Tuy nhiên, chúng còn khá mới lạ đối với phần lớn người dùng... - Bước 2: Nhận diện các thành phần của tay, chương trình sử dụng các mô-đun Hand Tracking trong thư viện SDK hỗ trợ cùng với việc xử lý để nhận diện các thành phần bàn tay - Bước 3: Nhận diện các cử điệu tay và ứng dụng điều khiển, chương trình thực hiện xử lý dữ liệu và gọi các phương thức điều khiển máy tính 17 Hình 1.6 – Minh họa các bước xử lý trong chương trình 1.7 Cấu trúc của báo cáo đồ án tốt... cỡ của tay, khoảng cách giữa các khớp (độ dài xương) là không thay đổi - Dữ liệu ngón tay: độ cong và khoảng cách từ đầu ngon tay đến trọng tâm bàn tay - Hình ảnh: mặt nạ bàn tay cho phép tách hình ảnh bàn tay với nền - Độ mở của bàn tay: cho biết bàn tay đang xòe năm ngón hay đang nắm chặt Gesture Tracking Sử dụng interface PXCHandData để truy cập thông tin cử chỉ tay Thông báo Mô-đun này giúp ứng dụng. .. trình bày các tính năng trong Mô-đun Hand Tracking như là theo dõi bàn tay, theo dõi các ngón tay, theo dõi 22 khớp xương trên bàn tay và nhận biết cử chỉ tay Mô-đun này còn có các tiện ích được cung cấp để hiển thị dữ liệu đầu ra và thông báo Mô-đun Hand Tracking bắt lấy những dấu vết của tay trong khung hình, cho phép người dùng có thể xây dựng lại khung sườn bàn tay 3D, nhận biết được những cử chỉ. .. camera Intel Realsense đã được tích hợp vào chiếc máy laptop Lenovo Ideapad 500 với các ứng dụng mang lại trải nghiệm 3D đến người sử dụng: - Quét khuôn mặt để mở máy truy cập vào Window bằng Window Hello được tích hợp trên Window 10 - Điều khiển bằng cử chỉ để cuộn trang trong trình duyệt hoặc văn bản - Phần mềm chơi nhạc Kagura - Các game điều khiển bằng cử chỉ và khuôn mặt: Lego Portal Racers, Warrior... động cử chỉ qua không gian 3D Do đó, tôi chọn Hand Tracking để ứng dụng Camera Intel RealSense 3D vào việc điều khiển trình chiếu Microsoft Office Power Point bằng cử chỉ tay Hand Tracking là một thuật ngữ trong lĩnh vực thị giác máy tính (Computer Vision) dùng để chỉ sự nhận diện, theo dõi di chuyển của bàn tay thông qua dữ liệu đầu vào từ thiết bị camera Thư viện Intel RealSense SDK cung cấp các Interface... dữ liệu 2D và tính cần thiết của dữ liệu 3D, dữ liệu về bàn tay trong – Hand Data trong Intel RealSense SDK + Phương pháp giải quyết: cách thức đóng gói dữ liệu và xử lý dữ liệu để đưa ra các kết quả nhận diện về hình dạng và cử chỉ của bàn tay - Chương IV Xây dựng mô-đun xử lý HandDetail Phần này trình bày mô-đun xử lý chính trong chương trình và diễn giải các thành phần bên trong mô-đun + Các định... phép người sử dụng truy xuất dữ liệu 3D của bàn tay từ Camera thông qua mô-đun Hand Tracking Do đó, tôi vận dụng thư viện để xây dựng chương trình nhận diện tư thế và cử chỉ của tay, thông qua đó điều khiển máy tính mà không cần thao tác với chuột hay bàn phím Chương trình gồm các bước chính sau: - Bước 1: Thu thập dữ liệu, dữ liệu được lấy từ Camera dưới dạng từng khung ảnh (frame) gồm ảnh 2D và dữ