2015-05-26 18 views
297

Tôi muốn lưu trữ dữ liệu chụp chuyển động từ Kinect 2 dưới dạng tệp BVH. Tôi tìm thấy mã mà làm như vậy cho Kinect 1 có thể được tìm thấy here. Tôi đã đi qua mã và tìm thấy một số điều mà tôi đã không thể hiểu được. Ví dụ: trong mã được đề cập, tôi đã cố gắng hiểu chính xác đối tượng Skeleton skel, được tìm thấy ở một số nơi trong mã, thực sự là. Nếu không, có bất kỳ ứng dụng đã biết nào có sẵn để thực hiện dự định không?Store Kinect's v2.0 Chuyển động sang BVH File

EDIT: Tôi đã cố gắng thay đổi Skeleton skel thành Body skel mà tôi nghĩ là đối tượng tương ứng cho kinect SDK 2.0. Tuy nhiên, tôi đã gặp lỗi khi cố gắng lấy vị trí của cơ thể:

tempMotionVektor[0] = -Math.Round(skel.Position.X * 100,2); 
tempMotionVektor[1] = Math.Round(skel.Position.Y * 100,2) + 120; 
tempMotionVektor[2] = 300 - Math.Round(skel.Position.Z * 100,2); 

Tôi đã gặp lỗi khi gọi chức năng Vị trí cho thân xe trượt. Làm thế nào tôi có thể lấy X, Y, Z của bộ xương trong sdk 2.0 ?? Tôi cố gắng để thay đổi ba dòng trên để:

tempMotionVektor[0] = -Math.Round(skel.Joints[0].Position.X * 100, 2); 
tempMotionVektor[1] = Math.Round(skel.Joints[0].Position.Y * 100, 2) + 120; 
tempMotionVektor[2] = 300 - Math.Round(skel.Joints[0].Position.Z * 100, 2); 

EDIT: Về cơ bản tôi quản lý để lưu trữ các tập tin một BVH sau khi kết hợp bodyBasicsWPF và kinect2bvh. Tuy nhiên, có vẻ như bộ xương tôi đang lưu trữ không hiệu quả. Có những cử động lạ ở khuỷu tay. Tôi đang cố gắng hiểu nếu tôi phải thay đổi một cái gì đó trong tập tin kinectSkeletonBVH.cp. Cụ thể hơn, những thay đổi trong định hướng trục chung cho phiên bản kinect 2 là gì. Làm thế nào tôi có thể thay đổi dòng sau: skel.BoneOrientations[JointType.ShoulderCenter].AbsoluteRotation.Quaternion; Tôi đã cố gắng thay đổi dòng đó với skel.JointOrientations[JointType.ShoulderCenter].Orientation. Tôi có đúng không? Tôi đang sử dụng đoạn mã sau để thêm doanh với các đối tượng BVHBone:

BVHBone hipCenter = new BVHBone(null, JointType.SpineBase.ToString(), 6, TransAxis.None, true); 
BVHBone hipCenter2 = new BVHBone(hipCenter, "HipCenter2", 3, TransAxis.Y, false); 
BVHBone spine = new BVHBone(hipCenter2, JointType.SpineMid.ToString(), 3, TransAxis.Y, true); 
BVHBone shoulderCenter = new BVHBone(spine, JointType.SpineShoulder.ToString(), 3, TransAxis.Y, true); 

BVHBone collarLeft = new BVHBone(shoulderCenter, "CollarLeft", 3, TransAxis.X, false); 
BVHBone shoulderLeft = new BVHBone(collarLeft, JointType.ShoulderLeft.ToString(), 3, TransAxis.X, true); 
BVHBone elbowLeft = new BVHBone(shoulderLeft, JointType.ElbowLeft.ToString(), 3, TransAxis.X, true); 
BVHBone wristLeft = new BVHBone(elbowLeft, JointType.WristLeft.ToString(), 3, TransAxis.X, true); 
BVHBone handLeft = new BVHBone(wristLeft, JointType.HandLeft.ToString(), 0, TransAxis.X, true); 

BVHBone neck = new BVHBone(shoulderCenter, "Neck", 3, TransAxis.Y, false); 
BVHBone head = new BVHBone(neck, JointType.Head.ToString(), 3, TransAxis.Y, true); 
BVHBone headtop = new BVHBone(head, "Headtop", 0, TransAxis.None, false); 

Tôi không thể hiểu nơi bên trong mã the axis for every Joint được tính toán.

+9

tôi bỏ qua vấn đề này tuy nhiên Nếu bạn có bất kỳ giải pháp nó là tốt để đăng nó ở đây không chỉ cho tôi, vì tôi nhận thấy rất nhiều người tìm kiếm lưu trữ các chuyển động trong các tập tin bvh. –

+0

Tôi có thể lưu trữ thông tin Kinect v1 và v2 cho một tệp txt. Tệp BVH này là thứ mà tôi vừa đọc và nó sẽ là một tính năng mà tôi sẽ bổ sung vào phần mềm mua lại của chúng tôi. Nếu bạn quan tâm đến các tệp * .txt, hãy cho tôi biết. Tôi chưa có giải pháp BVH phù hợp. – 16per9

+2

kiểm tra: http://pterneas.com/2014/03/13/kinect-for-windows-version-2-body-tracking –

Trả lời

1

Mã bạn sử dụng cho Kinect 1.0 để có được một BVH tập tin sử dụng thông tin khớp để xây dựng vectơ xương bằng cách đọc các Skeleton.

public static double[] getBoneVectorOutofJointPosition(BVHBone bvhBone, Skeleton skel) 
{ 
    double[] boneVector = new double[3] { 0, 0, 0 }; 
    double[] boneVectorParent = new double[3] { 0, 0, 0 }; 
    string boneName = bvhBone.Name; 

    JointType Joint; 
    if (bvhBone.Root == true) 
    { 
     boneVector = new double[3] { 0, 0, 0 }; 
    } 
    else 
    { 
     if (bvhBone.IsKinectJoint == true) 
     { 
      Joint = KinectSkeletonBVH.String2JointType(boneName); 

      boneVector[0] = skel.Joints[Joint].Position.X; 
      boneVector[1] = skel.Joints[Joint].Position.Y; 
      boneVector[2] = skel.Joints[Joint].Position.Z; 
.. 

Nguồn: Nguyên Lê Đặng - Kinect2BVH.V2

Ngoại trừ trong Kinect 2.0, Skeleton lớp đã được thay thế bởi lớp Body, vì vậy bạn cần phải thay đổi nó để đối phó với một Body thay vào đó, và lấy các khớp bằng cách làm theo các bước được trích dẫn bên dưới.

// Kinect namespace 
using Microsoft.Kinect; 

// ... 

// Kinect sensor and Kinect stream reader objects 
KinectSensor _sensor; 
MultiSourceFrameReader _reader; 
IList<Body> _bodies; 

// Kinect sensor initialization 
_sensor = KinectSensor.GetDefault(); 

if (_sensor != null) 
{ 
    _sensor.Open(); 
} 

Chúng tôi cũng đã thêm một danh sách của các cơ quan, nơi tất cả các cơ thể/bộ xương liên quan dữ liệu sẽ được lưu lại. Nếu bạn đã phát triển cho Kinect phiên bản 1, bạn lưu ý rằng lớp Skeleton đã được thay thế bởi lớp Body. Ghi nhớ MultiSourceFrameReader? Lớp học này cho phép chúng tôi truy cập trên mọi luồng, bao gồm luồng cơ thể!Chúng tôi chỉ cần để cho các cảm biến biết rằng chúng ta cần theo dõi chức năng cơ thể bằng cách thêm một tham số bổ sung khi khởi tạo người đọc:

_reader = _sensor.OpenMultiSourceFrameReader(FrameSourceTypes.Color | 
              FrameSourceTypes.Depth | 
              FrameSourceTypes.Infrared | 
              FrameSourceTypes.Body); 

_reader.MultiSourceFrameArrived += Reader_MultiSourceFrameArrived; 

Phương pháp Reader_MultiSourceFrameArrived sẽ được gọi bất cứ khi nào một khung mới có sẵn. Hãy xác định những gì sẽ xảy ra trong điều khoản của dữ liệu cơ thể:

  1. Nhận một tham chiếu đến khung cơ thể
  2. Kiểm tra xem khung cơ thể là null - điều này là rất quan trọng
  3. Khởi tạo _bodies danh sách
  4. Gọi phương thức GetAndRefreshBodyData, để sao chép dữ liệu nội dung vào danh sách
  5. Lặp qua danh sách các cơ quan và thực hiện các công cụ tuyệt vời!

Luôn nhớ kiểm tra giá trị null. Kinect cung cấp cho bạn khoảng 30 khung hình/giây - mọi thứ có thể bị thiếu hoặc bị thiếu! Đây là mã cho đến nay:

void Reader_MultiSourceFrameArrived(object sender, 
      MultiSourceFrameArrivedEventArgs e) 
{ 
    var reference = e.FrameReference.AcquireFrame(); 

    // Color 
    // ... 

    // Depth 
    // ... 

    // Infrared 
    // ... 

    // Body 
    using (var frame = reference.BodyFrameReference.AcquireFrame()) 
    { 
     if (frame != null) 
     { 
      _bodies = new Body[frame.BodyFrameSource.BodyCount]; 

      frame.GetAndRefreshBodyData(_bodies); 

      foreach (var body in _bodies) 
      { 
       if (body != null) 
       { 
        // Do something with the body... 
       } 
      } 
     } 
    } 
} 

Đây là nó! Bây giờ chúng ta có quyền truy cập vào các xác của Kinect. Bước tiếp theo là hiển thị thông tin bộ xương trên màn hình. Mỗi cơ quan bao gồm 25 khớp. Cảm biến cung cấp cho chúng tôi vị trí (X, Y, Z) và thông tin xoay vòng cho từng vị trí. Hơn nữa, Kinect cho chúng tôi biết liệu các khớp được theo dõi, giảm kích thước hoặc không theo dõi . Thực hành tốt là kiểm tra xem cơ thể có được theo dõi trước khi thực hiện bất kỳ chức năng quan trọng nào không.

Các mã sau minh họa cách chúng ta có thể truy cập khác nhau cơ thể khớp:

if (body != null) 
{ 
    if (body.IsTracked) 
    { 
     Joint head = body.Joints[JointType.Head]; 

     float x = head.Position.X; 
     float y = head.Position.Y; 
     float z = head.Position.Z; 

     // Draw the joints... 
    } 
} 

Nguồn: Vangos Pterneas Blog - KINECT FOR WINDOWS VERSION 2: BODY TRACKING

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