Lưu trữ Chuyển động v2.0 của Kinect sang tệp BVH


298

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ã làm như vậy cho Kinect 1 có thể tìm thấy ở đây . Tôi đã xem 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 skelđối tượng Skeleton , được tìm thấy ở một số vị trí trong mã, thực sự là gì. Nếu không, có bất kỳ ứng dụng được biết đến có sẵn để thực hiện dự định?

EDIT: Tôi đã cố gắng thay đổi skel Skeleton thành Body skel mà tôi nghĩ là đối tượng sửa lỗi 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 hàm Position cho skel Body. Làm cách nào tôi có thể truy xuất X, Y, Z của bộ xương trong sdk 2.0 ?? Tôi đã cố gắng thay đổi ba dòng trên thành:

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ữ tệp bvh sau khi kết hợp bodyBasicsWPF và kinect2bvh. Tuy nhiên, dường như bộ xương tôi đang lưu trữ không hiệu quả. Có những chuyển động kỳ 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 hướng trục chung cho phiên bản kinect 2 là gì. Làm cách nào để thay đổi dòng sau: skel.BoneOrientations[JointType.ShoulderCenter].AbsoluteRotation.Quaternion; Tôi đã cố gắng thay đổi dòng đó bằngskel.JointOrientations[JointType.ShoulderCenter].Orientation . Tôi có đúng không Tôi đang sử dụng đoạn mã sau để thêm khớp vào 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ào thì tốt nhất là đăng nó ở đây không chỉ cho tôi, vì tôi nhận thấy rất nhiều người đang tìm kiếm lưu trữ các chuyển động trong các tệp bvh.
Jose Ramon

Tôi có thể lưu trữ thông tin Kinect v1 và v2 cho tệp txt. Tệp BVH này là thứ tôi vừa đọc và nó sẽ là một tính năng mà tôi sẽ thêm 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 thích hợp.
16per9


1
Tôi có một cách để viết đúng luồng Kinect v1 và Kinect v2 vào txt. Có thể nếu bạn sử dụng nó, bạn có thể kiểm tra kỹ các tệp bvh của mình cho cùng một thử nghiệm. Kiểm tra sinh học của tôi để biết thêm.
16per9

1
@ Khaled.K Nếu liên kết bạn đăng câu trả lời này, bạn có phiền hình thành câu trả lời cho câu hỏi này không (theo câu hỏi meta này )
Matt Thomas

Câu trả lời:


2

Mã bạn đã sử dụng cho Kinect 1.0 để lấy tệp BVH sử dụng thông tin khớp để xây dựng các vectơ xương bằng cách đọ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ừ Kinect 2.0 , lớp Skeleton đã được thay thế bằng lớp Body , vì vậy bạn cần thay đổi nó để đối phó với Body thay vào đó và có được các khớp bằng cách làm theo các bước được trích dẫn dưới đây.

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

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

_reader.MultiSourceFrameArrived += Reader_MultiSourceFrameArrived;

Phương thức Reader_MultiSourceFrameArrived sẽ được gọi bất cứ khi nào có khung mới. Hãy chỉ định những gì sẽ xảy ra về mặt dữ liệu cơ thể:

  1. Tham khảo khung cơ thể
  2. Kiểm tra xem khung cơ thể có rỗng không - điều này rất quan trọng
  3. Khởi tạo danh sách _body
  4. Gọi phương thức GetAndRefreshBodyData để sao chép dữ liệu cơ thể vào danh sách
  5. Vòng qua danh sách các cơ quan và làm những thứ 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 mỗi giây - mọi thứ có thể là không hoặc 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 cơ quan mà Kinect xác định. Bước tiếp theo là hiển thị thông tin bộ xương trên màn hình. Mỗi cơ thể bao gồm 25 khớp. Cảm biến cung cấp cho chúng ta vị trí (X, Y, Z) và thông tin xoay cho từng người trong số họ. Hơn nữa, Kinect cho chúng ta biết liệu các khớp được theo dõi, giả thuyết hay không được theo dõi. Đó là một thực hành tốt để kiểm tra xem một cơ thể có được theo dõi hay không trước khi thực hiện bất kỳ chức năng quan trọng nào.

Đoạn mã sau minh họa cách chúng ta có thể truy cập vào các khớp cơ thể khác nhau:

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 CHO WINDOWS PHIÊN BẢN 2: THEO D BODI CƠ THỂ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.