2011-10-14 33 views
6

Tôi đang thực hiện Ứng dụng kinect bằng cách sử dụng Kinect SDK chính thức.Phân tích cử chỉ Kinect

Kết quả tôi muốn 1) có thể xác định cơ thể đã vẫy tay trong 5 giây. Làm điều gì đó nếu nó 2) có thể xác định nghiêng với một chân cho 5sec. làm một cái gì đó nếu nó.

Bất kỳ ai cũng biết cách làm như vậy? Tôi đang làm trong một ứng dụng WPF.

Muốn có một số ví dụ. Tôi khá mới với Kinect.

Cảm ơn bạn trước sự giúp đỡ của bạn!

Trả lời

17

Kinect cung cấp cho bạn bộ xương theo dõi, bạn phải thực hiện phần còn lại. Về cơ bản, bạn cần phải tạo một định nghĩa cho mỗi cử chỉ bạn muốn và chạy nó đối với các bộ xương mỗi khi sự kiện SkeletonFrameReady được kích hoạt. Điều này không dễ.

Xác định Gestures

Xác định những cử chỉ có thể ngạc nhiên khó khăn. Các cử chỉ đơn giản nhất (dễ nhất) là những cử chỉ xảy ra tại một thời điểm duy nhất, và do đó không dựa vào các vị trí quá khứ của các chi. Ví dụ: nếu bạn muốn phát hiện khi người dùng đặt tay lên trên đầu, điều này có thể được kiểm tra trên từng khung hình riêng lẻ. Các cử chỉ phức tạp hơn cần phải tính đến một khoảng thời gian. Đối với cử chỉ vẫy tay của bạn, bạn sẽ không thể nói từ một khung hình duy nhất cho dù một người đang vẫy tay hay chỉ giơ tay lên trước mặt họ.

Vì vậy, bây giờ bạn cần có khả năng lưu trữ thông tin liên quan trước đây, nhưng thông tin nào có liên quan? Nếu bạn giữ một cửa hàng của 30 khung hình cuối cùng và chạy một thuật toán chống lại điều đó? 30 khung hình chỉ mang lại cho bạn giá trị thông tin thứ hai .. có lẽ 60 khung hình? Hoặc trong 5 giây, 300 khung hình? Con người không di chuyển nhanh như vậy, vì vậy có thể bạn có thể sử dụng mỗi khung thứ năm, điều này sẽ khiến 5 giây của bạn trở lại 60 khung hình. Một ý tưởng tốt hơn là chọn và chọn thông tin liên quan ra khỏi khung. Đối với một cử chỉ vẫy tay, vận tốc hiện tại của tay, nó di chuyển trong bao lâu, nó di chuyển bao xa, vv tất cả có thể là thông tin hữu ích.

Sau khi bạn đã tìm ra cách để nhận và lưu trữ tất cả thông tin liên quan đến cử chỉ của mình, làm cách nào để biến các số đó thành định nghĩa? Vẫy tay có thể yêu cầu tốc độ tối thiểu nhất định hoặc hướng (trái/phải thay vì lên/xuống) hoặc thời lượng. Tuy nhiên, thời lượng này không phải là khoảng thời gian 5 giây mà bạn quan tâm. Thời lượng này là mức tối thiểu tuyệt đối cần thiết để giả định rằng người dùng đang vẫy tay. Như đã đề cập ở trên, bạn không thể xác định một làn sóng từ một khung hình. Bạn không nên xác định một làn sóng từ 2, hoặc 3, hoặc 5, bởi vì đó chỉ là không đủ thời gian. Nếu bàn tay của tôi co giật trong một phần nhỏ của một giây, bạn sẽ xem xét một làn sóng? Có lẽ là một điểm ngọt mà hầu hết mọi người sẽ đồng ý rằng chuyển động trái sang phải tạo thành một làn sóng, nhưng tôi chắc chắn không biết nó đủ tốt để xác định nó trong một thuật toán.

Có một vấn đề khác với yêu cầu người dùng thực hiện một cử chỉ nhất định trong một khoảng thời gian. Rất có thể, không phải mọi khung hình trong năm giây đó sẽ xuất hiện là một làn sóng, bất kể bạn viết định nghĩa như thế nào. Khi bạn có thể dễ dàng xác định xem ai đó có nắm tay trên đầu của họ trong năm giây (bởi vì nó có thể được xác định trên cơ sở khung hình đơn), khó làm điều đó hơn cho các cử chỉ phức tạp. Và trong khi vẫy tay không phải là phức tạp, nó vẫn cho thấy vấn đề này. Khi bàn tay của bạn thay đổi hướng ở hai bên của một làn sóng, nó dừng di chuyển trong một phần nhỏ của một giây. Bạn vẫn vẫy tay à? Nếu bạn trả lời có, hãy vẫy chậm hơn để bạn tạm dừng thêm một chút ở hai bên. Liệu sự tạm dừng đó vẫn được coi là một làn sóng? Có thể, tại một số thời điểm trong năm cử chỉ thứ hai, định nghĩa sẽ không phát hiện ra một làn sóng.Vì vậy, bây giờ bạn cần phải đưa vào tài khoản một khoan dung cho thời gian cử chỉ .. nếu cử chỉ vẫy tay xảy ra cho 95% trong năm giây cuối cùng, là đủ tốt? 90%? 80%?

Điểm tôi đang cố gắng thực hiện ở đây là không có cách nào dễ dàng để thực hiện nhận dạng cử chỉ. Bạn phải suy nghĩ thông qua cử chỉ và xác định một số loại định nghĩa sẽ biến một loạt các vị trí chung (dữ liệu bộ xương) thành một cử chỉ. Bạn sẽ cần phải theo dõi dữ liệu có liên quan từ các khung hình trước đây, nhưng nhận ra rằng định nghĩa cử chỉ có thể sẽ không hoàn hảo.

Hãy xem xét những người

Vì vậy, bây giờ mà tôi đã nói lý do tại sao làn sóng thứ hai năm sẽ rất khó để phát hiện, cho phép tôi ít nhất là cho những suy nghĩ của tôi về cách để làm điều đó: không. Bạn không nên buộc người dùng lặp lại cử chỉ dựa trên chuyển động trong một khoảng thời gian nhất định (làn sóng thứ năm). Nó là đáng ngạc nhiên mệt mỏi và không chỉ là những gì mọi người mong đợi/muốn từ máy tính. Điểm và nhấp là tức thời; ngay sau khi chúng tôi nhấp vào, chúng tôi mong đợi một phản hồi. Không ai muốn phải giữ một nhấp chuột trong năm giây trước khi họ có thể mở Minesweeper. Việc lặp lại cử chỉ trong một khoảng thời gian là ổn nếu nó liên tục thực hiện một số hành động, như sử dụng cử chỉ để chuyển qua danh sách - người dùng sẽ hiểu rằng họ phải tiếp tục thực hiện cử chỉ để di chuyển xa hơn trong danh sách. Điều này thậm chí làm cho cử chỉ dễ phát hiện hơn, bởi vì thay vì cần thông tin trong 5 giây cuối cùng, bạn chỉ cần đủ thông tin để biết liệu người dùng có đang thực hiện cử chỉ ngay bây giờ hay không.

Nếu bạn muốn người dùng giữ cử chỉ trong một khoảng thời gian nhất định, hãy làm cho nó trở thành một cử chỉ dừng chân (giữ bàn tay ở vị trí nào đó trong x giây dễ dàng hơn nhiều so với vẫy tay). Nó cũng là một ý tưởng rất tốt để cung cấp cho một số thông tin phản hồi trực quan, để nói rằng bộ đếm thời gian đã bắt đầu. Nếu người dùng vặn lên cử chỉ (tay sai, địa điểm sai, vv) và kết thúc đứng ở đó trong 5 hoặc 10 giây chờ đợi điều gì đó xảy ra, họ sẽ không vui, nhưng đó không thực sự là một phần của câu hỏi này.

Bắt đầu với Kinect Gestures

Bắt đầu nhỏ .. thực sự nhỏ. Trước tiên, hãy chắc chắn rằng bạn biết cách của bạn xung quanh lớp SkeletonData. Có 20 khớp được theo dõi trên mỗi bộ xương và mỗi khớp có một TrackingState. Trạng thái theo dõi này sẽ cho biết liệu Kinect có thực sự nhìn thấy khớp (Theo dõi) hay không, nếu nó đang tìm ra vị trí của khớp dựa trên phần còn lại của bộ xương (Suy luận), hoặc nếu nó hoàn toàn bị bỏ rơi cố tìm khớp (NotTracked) . Những trạng thái này là quan trọng. Bạn không muốn nghĩ rằng người dùng đang đứng trên một chân đơn giản chỉ vì Kinect không nhìn thấy chân kia và đang báo cáo một vị trí không có thật cho nó. Mỗi khớp có một vị trí, đó là cách bạn biết nơi người dùng đang đứng .. từng mảnh. Làm quen với hệ tọa độ.

Sau khi bạn biết thông tin cơ bản về cách dữ liệu bộ xương được báo cáo, hãy thử một số cử chỉ đơn giản. In tin nhắn đến màn hình khi người dùng giơ tay lên trên đầu họ. Điều này chỉ đòi hỏi phải so sánh từng bàn tay với khớp đầu và nhìn thấy nếu một trong hai tay cao hơn đầu trong mặt phẳng tọa độ. Sau khi bạn nhận được rằng làm việc, di chuyển lên đến một cái gì đó phức tạp hơn. Tôi muốn đề nghị thử một chuyển động swiping (tay ở phía trước của cơ thể, di chuyển hoặc là phải sang trái hoặc trái sang phải một khoảng cách tối thiểu). Điều này đòi hỏi thông tin từ các khung hình trước đây, vì vậy bạn sẽ phải suy nghĩ thông qua những thông tin nào cần lưu trữ. Nếu bạn có thể làm việc đó, bạn có thể thử chuỗi một chuỗi cử chỉ vuốt trong một khoảng thời gian ngắn và diễn giải nó như một làn sóng.

tl; dr: Cử chỉ khó. Bắt đầu nhỏ, xây dựng theo cách của bạn. Không làm cho người dùng thực hiện các chuyển động lặp đi lặp lại cho một hành động đơn lẻ, nó mệt mỏi và khó chịu. Bao gồm phản hồi trực quan cho cử chỉ dựa trên thời lượng. Đọc phần còn lại của bài viết này.

+0

Cám ơn những lời khuyên! =) – user981924

3

Kinect SDK giúp bạn có được tọa độ của các khớp khác nhau.Một cử chỉ là gì, nhưng thay đổi vị trí của một tập hợp các khớp trong một khoảng thời gian.

Để nhận biết cử chỉ, bạn phải lưu trữ tọa độ trong một khoảng thời gian và lặp lại nó để xem nó có tuân thủ các quy tắc cho một cử chỉ cụ thể không (như tay phải luôn di chuyển lên trên).

Để biết thêm chi tiết, hãy kiểm tra bài viết trên blog của tôi về chủ đề này: http://tinyurl.com/89o7sf5

Các vấn đề liên quan