स्टोर Kinect के v2.0 बीवीएच फाइल को मोशन


298

मैं Kinect 2 से गति कैप्चर डेटा को BVH फ़ाइल के रूप में संग्रहीत करना चाहूंगा। मुझे ऐसा कोड मिला जो Kinect 1 के लिए ऐसा करता है जो यहां पाया जा सकता है । मैंने कोड के माध्यम से जाना और कई चीजें पाईं जिन्हें मैं समझ नहीं पा रहा था। उदाहरण के लिए, उल्लेखित कोड में मैंने समझने की कोशिश की है कि कोड skelमें कई स्थानों पर पाए जाने वाले कंकाल की वस्तु वास्तव में क्या है। यदि नहीं, तो क्या कोई उद्देश्य प्राप्त करने के लिए कोई ज्ञात आवेदन उपलब्ध है?

संपादित करें: मैंने कंकाल को शरीर की खोपड़ी में बदलने की कोशिश की जो मुझे लगता है कि kinect एसडीके 2.0 के लिए पत्राचार वस्तु है। हालाँकि मुझे एक त्रुटि मिली है जब मैं शरीर की स्थिति प्राप्त करने की कोशिश करता हूं:

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);

बॉडी स्कील के लिए फंक्शन पोज़िशन को कॉल करते समय मुझे त्रुटियाँ मिली हैं। मैं एसडी 2.0 में कंकाल के एक्स, वाई, जेड को कैसे प्राप्त कर सकता हूं ?? मैंने उपरोक्त तीन पंक्तियों को बदलने की कोशिश की:

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);

संपादित करें: मूल रूप से मैं बॉडीविक्स डब्ल्यूपीएफ और किनेक्ट 2 बीवीएचएच के संयोजन के बाद एक बीवीएच फाइल को स्टोर करने में कामयाब रहा। हालांकि, ऐसा लगता है कि जिस कंकाल को मैं स्टोर कर रहा हूं वह कुशल नहीं है। कोहनी में अजीब हरकतें होती हैं। मैं समझने की कोशिश कर रहा हूं कि क्या मुझे फ़ाइल kinectSkeletonBVH.cp में कुछ बदलना है । अधिक विशेष रूप से, किन्ट 2 संस्करण के लिए संयुक्त अक्ष अभिविन्यास में क्या बदलाव हैं। मैं निम्नलिखित पंक्ति को कैसे बदल सकता हूँ: skel.BoneOrientations[JointType.ShoulderCenter].AbsoluteRotation.Quaternion; मैंने उस पंक्ति को बदलने की कोशिश की skel.JointOrientations[JointType.ShoulderCenter].Orientation। क्या मैं सही हू? मैं 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);

मुझे समझ नहीं आ रहा है कि कोड के अंदर कहाँ the axis for every Jointगणना की जाती है।


9
हालाँकि मैंने इस मुद्दे को छोड़ दिया है। यदि आपके पास कोई समाधान है तो इसे यहाँ मेरे लिए ही नहीं पोस्ट करना अच्छा है, क्योंकि मैंने बहुत सारे लोगों को बीवीएच फाइलों में स्टोर करने वाले आंदोलनों को खोजने पर ध्यान दिया।
जोस रेमन

मैं एक txt फ़ाइल के लिए Kinect v1 और v2 जानकारी संग्रहीत करने में सक्षम हूं। यह BVH फाइल कुछ है जो मैं अभी पढ़ता हूं और यह एक ऐसी सुविधा होगी जिसे मैं अपने अधिग्रहण सॉफ्टवेयर में जोड़ूंगा। यदि आप * .txt फाइलों में रुचि रखते हैं तो मुझे बताएं। मेरे पास अभी तक उचित बीवीएच समाधान नहीं है।
16per9


1
मैं सही ढंग से tect में Kinect v1 और Kinect v2 धाराओं को लिखने का एक तरीका है। हो सकता है कि यदि आप इसका उपयोग करते हैं, तो आप उसी प्रयोग के लिए अपने bvh की फ़ाइलों को दोबारा जांच सकते हैं। अधिक जानकारी के लिए मेरे जैव की जाँच करें।
16per9

1
@ Khaled.K यदि आपके द्वारा पोस्ट किया गया लिंक इसका उत्तर देता है, तो क्या आप इस प्रश्न के उत्तर में ( इस मेटा प्रश्न के अनुसार) विचार करेंगे )
मैट थॉमस

जवाबों:


2

बीवीएच फ़ाइल प्राप्त करने के लिए आपने Kinect 1.0 के लिए जो कोड इस्तेमाल किया है, वह कंकाल को पढ़कर हड्डियों की वैक्टर बनाने के लिए जोड़ों की जानकारी का उपयोग करता है ।

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;
..

स्रोत: गुयेन लान --ng - Kinect2BVH.V2

Kinect 2.0 , कंकाल को छोड़कर वर्ग को शरीर वर्ग द्वारा प्रतिस्थापित किया गया है , इसलिए आपको इसके बजाय एक निकाय से निपटने के लिए इसे बदलना होगा , और नीचे दिए गए चरणों का पालन करके जोड़ों को प्राप्त करना होगा।

// 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();
}

हमने निकायों की एक सूची भी जोड़ी है, जहां सभी शरीर / कंकाल संबंधी डेटा सहेजे जाएंगे। यदि आपने Kinect संस्करण 1 के लिए विकसित किया है, तो आप ध्यान दें कि कंकाल वर्ग को निकाय वर्ग द्वारा प्रतिस्थापित किया गया है। MultiSourceFrameReader याद रखें? यह वर्ग हमें शरीर की धारा सहित हर धारा पर पहुँच प्रदान करता है! हमें बस सेंसर को यह बताने की जरूरत है कि रीडर को इनिशियलाइज़ करते समय हमें एक अतिरिक्त पैरामीटर जोड़कर बॉडी ट्रैकिंग फंक्शनलिटी की ज़रूरत है:

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

_reader.MultiSourceFrameArrived += Reader_MultiSourceFrameArrived;

जब भी कोई नया फ्रेम उपलब्ध होगा, Reader_MultiSourceFrameArrived विधि को कॉल किया जाएगा। आइए निर्दिष्ट करें कि शरीर के डेटा के संदर्भ में क्या होगा:

  1. बॉडी फ्रेम का संदर्भ लें
  2. जांचें कि क्या बॉडी फ्रेम अशक्त है - यह महत्वपूर्ण है
  3. _Bodies सूची प्रारंभ करें
  4. GetAndRefreshBodyData विधि को कॉल करें, ताकि शरीर के डेटा को सूची में कॉपी किया जा सके
  5. निकायों की सूची के माध्यम से लूप करें और कमाल का सामान करें!

हमेशा शून्य मानों की जांच करना याद रखें। Kinect आपको लगभग 30 फ्रेम प्रति सेकंड प्रदान करता है - कुछ भी अशक्त या गायब हो सकता है! यहाँ अब तक का कोड है:

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...
                }
            }
        }
    }
}

यह बात है! हमारे पास अब उन निकायों तक पहुंच है जो किनेक्ट की पहचान करते हैं। अगला कदम कंकाल की जानकारी ऑन-स्क्रीन प्रदर्शित करना है। प्रत्येक शरीर में 25 जोड़ होते हैं। सेंसर हमें स्थिति (एक्स, वाई, जेड) और उनमें से प्रत्येक के लिए रोटेशन की जानकारी प्रदान करता है। इसके अलावा, किनेक्ट हमें यह जानने देता है कि क्या जोड़ों को ट्रैक किया गया है, परिकल्पित या ट्रैक नहीं किया गया है। यह जांचने के लिए एक अच्छा अभ्यास है कि किसी महत्वपूर्ण कार्य को करने से पहले शरीर को ट्रैक किया गया है या नहीं।

निम्नलिखित कोड दिखाता है कि हम विभिन्न शरीर के जोड़ों तक कैसे पहुंच सकते हैं:

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...
    }
}

स्रोत: वांगोस पोंटेस ब्लॉग - विन्डोज़ वर्जन के लिए कनेक्ट 2: बॉडी ट्रैकिंग

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.