Để có thể lấy được chiều sâu ta phải cài một thư viện của OpenCV có tên là: “CL-NUI- Platform”. Đây là thư viện cung cấp các hàm để có thể lấy được chiều sâu bao gồm: + GetNUICameraDepthFrameRAW.
+ GetNUICameraDepthFrameCorrected12. + GetNUICameraDepthFrameCorrected8. + GetNUICameraDepthFrameRGB32.
Ngoài ra thư viện này con cung cấp các phương thức rất qua trọng để điều khiểu Kinect:
+ GetNUIDeviceSerial: Lấy serial của Kinect. + StartNUICamera: Mở kinect
+ StopNUICamera: Đóng kinect.
Cách lấy ảnh chiều sâu của Kinect đã được giải thích trong mục 1.2.3.
3.2.2 Phát hiện bàn tay trong ảnh.
Sau khi đã lấy được ảnh chiều sâu nhờ vào Kinect, việc tính toán số lượng ngón tay sẽ dựa vào ảnh chiều sâu này, để xác định bàn tay trong ảnh ta thực hiện các bước sau:
Bước 1: Phân ngưỡng ảnh chiều sâu
Trong OpenCV đã hỗ trợ sẵn hàm phân ngưỡng chiều sâu, nhưng hàm phân ngưỡng này chỉ phân ngưỡng hình ảnh ở mức độ cơ bản vì vậy để có thể phân ngưỡng tốt hơn ta phải tự tạo ra phương thức phân ngưỡng riêng.
Đầu tiên ta duyệt qua toàn ảnh, kiểm tra những điểm ảnh nào có giá trị độ sâu nhỏ hơn độ sâu cho trước, sẽ được truyền vào bởi chương trình khi người dùng thiết lập, thông số này tương ứng với khoảng cách từ camera Kinect tới bàn tay hoặc vật đứng trước nhất so với camera Kinect. Những điểm ảnh thỏa yêu cầu thì ta lưu vào một ảnh tạm. Những điểm ảnh còn lại sẽ được gán là 0.
Ta tìm điểm ảnh nhỏ nhất (min) trong ảnh tạm vừa lưu. Sau đó đi kiểm tra những điểm ảnh nào nằm trong khoảng từ min tới min + depth (depth là giá trị được gán động bởi người sử dụng để có thể lấy được tương đối vật với độ dày depth), những điểm ảnh này sẽ được gắn vào ảnh đầu ra (ảnh đen trắng), những vị trí thuộc bàn tay sẽ là màu trắng và những vị trí còn lại sẽ là màu đen.
Hình 3.2: Bàn tay sau khi đã phân ngưỡng chiều sâu.
Bước 2: Lọc nhiễu ảnh đã phân ngưỡng phương pháp xử lý ảnh Morphology.
Mophology là phương pháp dùng để trích các thành phần của ảnh. Các thành phần này hữu ích trong việc biểu diễn và mô tả các thành phần của miền như biên, xương và bao đồi. Ngoài ra cũng có các phương pháp xử lý ảnh khác như lọc, làm âm ảnh, tỉa nhánh.
Dilation (giãn nở):
Hình 3.3: Kết quả của thuật toán Dilation
Erosion (bào mòn):
- Là tác vụ ngược lại Dilation. A và B là 2 tập hợp trong Z2, Erosion của A và B được định nghĩa như sau:
Hình 3.4: Kết quả của thuật toán Erosion
- OpenCV có hỗ trợ hai hàm dành cho Erosion và Dilation:
- Hai hàm cvErode() và cvDilate() lấy một ảnh nguồn và ảnh đích. Đối số thứ ba là kernel, mà mặc định là NULL. Cuối cùng, đối số thứ tư là số lần lặp. Nếu không đặt đối số này mặc định là 1.
- Opening và Closing: Biểu hiện cho 2 thuật toán này là ảnh xám có hình thức
như một ảnh nhị phân. Là các kết hợp của erosion và dilation.
Opening: của ảnh f bởi thành phần cấu trúc b, kí hiệu là f b:
Hình 3.6: Trình tự thực hiện của Opening.
- Mục đích của Opening là là đứt những chỗ hẹp và xóa những chỗ lồi ra.
Closing: của ảnh f bởi thành phần cấu trúc b, kí hiệu là f ¥ b:
Hình 3.7: Trình tự thực hiện của Closing.
- Mục đích của Closing là nối những chỗ bị đứt và loại bỏ những lỗ nhỏ.
- Mục đích sau cùng của bước 2 này là lọc nhiễu trong ảnh, làm cho ảnh trơn hơn và tăng thêm hiểu quả cho quá trình phân ngưỡng.