কিনেক্টের ভি 2.0 গতি থেকে বিভিএইচ ফাইল সঞ্চয় করুন


298

আমি কিনকেট 2 থেকে মোভি ক্যাপচার ডেটা বিভিএইচ ফাইল হিসাবে সঞ্চয় করতে চাই। আমি কোড খুঁজে পেয়েছি যা কিনেক্ট 1 এর জন্য এটি করে যা এখানে পাওয়া যাবে । আমি কোডটি দিয়ে গিয়েছিলাম এবং বেশ কয়েকটি জিনিস পেয়েছি যা আমি বুঝতে পারি না। উদাহরণস্বরূপ, উল্লিখিত কোডটিতে আমি স্কেলটন ঠিক কী বুঝতে চেষ্টা করেছিskel বেশ কয়েকটি স্থানে পাওয়া অবজেক্টটি আসলে কী। যদি তা না হয় তবে উদ্দেশ্য পূরণের জন্য কি কোনও পরিচিত অ্যাপ্লিকেশন উপলব্ধ রয়েছে?

সম্পাদনা করুন: আমি কঙ্কাল এসকেকে বডি স্কেলে পরিবর্তনের চেষ্টা করেছি যা আমার মনে হয় আত্মীয় এসডিকে ২.০ এর সংবাদদাতা অবজেক্ট। তবে আমি যখন শরীরের অবস্থান পাওয়ার চেষ্টা করি তখন আমার একটি ত্রুটি ঘটেছিল:

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

বডি স্কেলের ফাংশন পজিশনটি কল করার সময় আমি ত্রুটিগুলি পেয়েছি। আমি কীভাবে কঙ্কালের X, Y, Z পুনরুদ্ধার করতে পারি sdk 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 বিভিএইচ সংমিশ্রনের পরে একটি বিভিএইচ ফাইল সঞ্চয় করতে সক্ষম হয়েছি। তবে মনে হচ্ছে যে কঙ্কালটি আমি সংরক্ষণ করছি তা কার্যকর নয়। কনুইগুলিতে অদ্ভুত চলন রয়েছে। আমি কীনাটস্কেলটনবিভিএইচসিপি ফাইলটিতে কিছু পরিবর্তন করতে হবে কিনা তা বোঝার চেষ্টা করছি । আরও সুনির্দিষ্টভাবে বলা যায় যে, কিনেক্ট 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
আমি এই সমস্যাটি এড়িয়ে গেছি তবে আপনার যদি কোনও সমাধান থাকে তবে এটি কেবল আমার জন্যই এখানে পোস্ট করা ভাল, যেহেতু আমি বিভিএইচ ফাইলগুলিতে আন্দোলনগুলি সঞ্চিত করার জন্য অনেক লোককে সন্ধান করতে দেখেছি।
জোসে রমন

আমি টেক্সট ফাইলের জন্য কিনেক্ট ভি 1 এবং ভি 2 তথ্য সংরক্ষণ করতে সক্ষম। এই বিভিএইচ ফাইলটি এমন কিছু যা আমি সবে পড়েছি এবং এটি এমন একটি বৈশিষ্ট্য হবে যা আমি আমাদের অধিগ্রহণ সফ্টওয়্যারটিতে যুক্ত করব। আপনি যদি * .txt ফাইলগুলিতে আগ্রহী হন তবে আমাকে জানান। আমার কাছে এখনও কোনও সঠিক বিভিএইচ সমাধান নেই।
16per9


1
আমার কাছে কিনেক্ট ভি 1 এবং কিনেক্ট ভি 2 স্ট্রিমটি সঠিকভাবে txt তে লেখার উপায় আছে। সম্ভবত আপনি যদি এটি ব্যবহার করেন, আপনি একই পরীক্ষার জন্য আপনার বিভিএইচ ফাইলগুলি ডাবল-চেক করতে পারেন। আরও তথ্যের জন্য আমার বায়ো পরীক্ষা করুন।
16per9

1
@ খালেদ.কে আপনি যে লিঙ্কটি পোস্ট করেছেন সেটির উত্তর দিলে আপনি কি এই প্রশ্নের উত্তর দেওয়ার জন্য আপত্তি জানাতে পারবেন ( এই মেটা প্রশ্ন অনুসারে )
ম্যাট টমাস

উত্তর:


2

আপনি যে কোডটি জন্য ব্যবহৃত Kinect থেকে 1.0 একটি প্রাপ্ত করার BVH ফাইল পড়ার মাধ্যমে বিল্ড হাড় ভেক্টর করার জয়েন্টগুলোতে তথ্য ব্যবহার কঙ্কাল

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

উত্স: Nguyên Lê --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();
}

আমরা মৃতদেহের একটি তালিকাও যুক্ত করেছি, যেখানে সমস্ত দেহ / কঙ্কাল সম্পর্কিত ডেটা সংরক্ষণ করা হবে। আপনি যদি কিনেক্ট সংস্করণ 1 এর জন্য বিকাশ করেছেন, আপনি লক্ষ্য করবেন যে কঙ্কাল ক্লাসটি বডি ক্লাস দ্বারা প্রতিস্থাপিত হয়েছে। মাল্টিসোর্সফ্রেমার রিডার মনে আছে? এই শ্রেণিটি আমাদের বডি স্ট্রিম সহ প্রতিটি স্ট্রিমে অ্যাক্সেস দেয়! আমাদের কেবল সেন্সরটিকে জানাতে হবে যে পাঠককে আরম্ভ করার সময় অতিরিক্ত পরামিতি যুক্ত করে আমাদের দেহ ট্র্যাকিং কার্যকারিতা প্রয়োজন:

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

_reader.MultiSourceFrameArrived += Reader_MultiSourceFrameArrived;

যখনই কোনও নতুন ফ্রেম পাওয়া যায় তখনই পাঠক_ মাল্টিসোর্সফ্রেমআরাইভড পদ্ধতিটি কল করা হবে। আসুন বডি ডেটার ক্ষেত্রে কী হবে তা নির্দিষ্ট করে দিন:

  1. বডি ফ্রেমের একটি রেফারেন্স পান
  2. বডি ফ্রেম নাল কিনা তা পরীক্ষা করে দেখুন - এটি গুরুত্বপূর্ণ
  3. শরীরের তালিকাটি শুরু করুন
  4. বডি ডেটা তালিকায় কপি করার জন্য, getAndRefreshBodyData পদ্ধতিতে কল করুন
  5. মৃতদেহের তালিকাটি লুপ করুন এবং দুর্দান্ত স্টাফ করুন!

নাল মানগুলি পরীক্ষা করার জন্য সর্বদা মনে রাখবেন। কিনেক্ট আপনাকে প্রতি সেকেন্ডে প্রায় 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 এর জন্য কিন্ত: শারীরিক ট্র্যাকিং

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.