kinect-请教大家一个关于vector动态存储的问题

问题描述

请教大家一个关于vector动态存储的问题

我现在正在写一个关于kinect的小程序,定义了一个

 vector<double>inputvector(12)

,也就是inputvector里面有12个元素,全部初始化为0,现在是我要把我从kinect里面获得的骨骼数据流,总共12个数据每帧这样送到inputvector中去,然后将所有获取到的数据保存到txt文档中,下面我贴出我的代码,现在有一个问题是我只能获取最后一帧的数据保存到txt中,之前所有的帧数据都没有保存进去,求大神帮忙看一下!我基础不好,底子薄 这个问题困扰我一天了!万分感谢!

 bool getSkeletonImage(HANDLE &skeletonEvent, Mat &skeletonImage, Mat &colorImage)
{
    UINT gestureLabel = 1;
    trainingData.setNumDimensions(12);
    trainingData.setDatasetName("sensorData");
    trainingData.setInfoText("this data contains some sensor data");

    NUI_SKELETON_FRAME skeletonFrame = { 0 };
    bool bfoundskeleton = false;

    if (NuiSkeletonGetNextFrame(0, &skeletonFrame) == S_OK)
    {
        for (int i = 0; i < NUI_SKELETON_COUNT; i++)
        {
            if (skeletonFrame.SkeletonData[i].eTrackingState == NUI_SKELETON_TRACKED)
            {
                bfoundskeleton = true;
                break;//跳出for循环
            }
        }
    }
    else
    {
        cout << "没有找到合适的骨骼" << endl;
        return FALSE;

    }
    if (!bfoundskeleton)
    {
        return FALSE;
    }
    NuiTransformSmooth(&skeletonFrame, NULL);
    skeletonImage.setTo(0);

    for (int i = 0; i < NUI_SKELETON_COUNT; i++)
    {
        if (skeletonFrame.SkeletonData[i].eTrackingState == NUI_SKELETON_TRACKED&&skeletonFrame.SkeletonData[i].eSkeletonPositionTrackingState[NUI_SKELETON_POSITION_SHOULDER_CENTER] != NUI_SKELETON_POSITION_NOT_TRACKED)
        {
            float fx, fy;
            for (int j = 0; j < NUI_SKELETON_POSITION_COUNT; j++)
            {
                NuiTransformSkeletonToDepthImage(skeletonFrame.SkeletonData[i].SkeletonPositions[j], &fx, &fy);//骨骼坐标转换到深度图像中去
                skeletonPoint[i][j].x = (int)fx;
                skeletonPoint[i][j].y = (int)fy;
            }
            for (int j = 0; j < NUI_SKELETON_POSITION_COUNT; j++)
            {
                if (skeletonFrame.SkeletonData[i].eSkeletonPositionTrackingState[j] != NUI_SKELETON_POSITION_NOT_TRACKED)
                {
                    LONG colorx, colory;
                    //从深度空间中获取颜色空间对应像素点的坐标
                    NuiImageGetColorPixelCoordinatesFromDepthPixel(NUI_IMAGE_RESOLUTION_640x480, 0, skeletonPoint[i][j].x, skeletonPoint[i][j].y, 0, &colorx, &colory);
                    colorPoint[i][j].x = int(colorx);
                    colorPoint[i][j].y = int(colory);
                    circle(skeletonImage, skeletonPoint[i][j], 4, cvScalar(0, 255, 255), 1, 8, 0);
                    circle(colorImage, colorPoint[i][j], 4, cvScalar(0,0,255), 1, 8, 0);
                }
            }
            drawskeleton(colorImage, colorPoint[i], i);//在彩色图像上画上骨骼
            drawskeleton(skeletonImage, skeletonPoint[i], i);//画出骨骼图像信息

            inputvector[0] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].x;
            inputvector[1] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].y;
            inputvector[2] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].z;
            inputvector[3] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_WRIST_LEFT].x;
            inputvector[4] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_WRIST_LEFT].y;
            inputvector[5] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_WRIST_LEFT].z;
            inputvector[6] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].x;
            inputvector[7] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].y;
            inputvector[8] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].z;
            inputvector[9] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_WRIST_RIGHT].x;
            inputvector[10] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_WRIST_RIGHT].y;
            inputvector[11] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_WRIST_RIGHT].z;

            cout << "KinectLeftHandData:" << "X=" << inputvector[0] << " Y=" << inputvector[1] << " Z=" << inputvector[2] << endl;
            cout << "KinectLeftWristData: " << "X=" << inputvector[3] << "Y=" << inputvector[4] << "Z=" << inputvector[5] << endl;
            cout << "KinectRightHandData:" << "X=" << inputvector[6] << " Y=" << inputvector[7] << " Z=" << inputvector[8] << endl;
            cout << "KinectRightWristData:" << "X=" << inputvector[9] << " Y=" << inputvector[10] << " Z=" << inputvector[11] << endl;
            //cout << inputvector.size() << endl;

        trainingData.addSample(gestureLabel, inputvector);
        }
    if (!trainingData.save("TrainingData.txt"))
        {
            cout << "error:failed to save dateset to file!" << endl;
            return EXIT_FAILURE;
        }
        string datasetName = trainingData.getDatasetName();
        string infoText = trainingData.getInfoText();
        UINT numSamples = trainingData.getNumSamples();
        UINT numDimensions = trainingData.getNumDimensions();
        UINT numClasses = trainingData.getNumClasses();
        ClassificationData testData = trainingData.partition(80);
        if (!trainingData.merge(testData))
        {
            //cout << "failed to save merge datasets" << endl;
            return EXIT_FAILURE;
        }
        trainingData.clear();
    }
}

解决方案

我自己的观点是:是不是因为我申请的这个inputvector(12),这个空间的大小就是12啊 然后我每帧送过来的数据存进去,
下一帧数据过来之后就会覆盖掉我上一帧的数据,所以我最后存入的只能是最后一帧的数据

解决方案二:

vector会自动扩展空间,当超过当前空间以后,会把数据继续插入,不会覆盖
你要看你的逻辑是不是把数据覆盖了

解决方案三:

vector会自动扩展空间,当超过当前空间以后,会把数据继续插入,不会覆盖 你要看你的逻辑是不是把数据覆盖了

您看一下我代码里面有一行:

   trainingData.addSample(gestureLabel, inputvector);

这一行的意思就是每产生一帧数据,我就把该帧数据送到traingData中去,这一句话是写在if条件语句中的,也就是只要我一直有骨骼流数据送进来,那么我就一直把数据放到traingData里面去,直到if条件不满足的时候,再把trainingData中的数据保存到txt文档中,逻辑好像没错,我下面再贴出一个代码是跟这个类似的 您可以看一下就是他的那个 trainingData.addSample是怎么使用的:

  //For now we will just add some random data
    Random random;
    for(UINT i=0; i<100; i++){
        sample[0] = random.getRandomNumberUniform(-1.0,1.0);
        sample[1] = random.getRandomNumberUniform(-1.0,1.0);
        sample[2] = random.getRandomNumberUniform(-1.0,1.0); 

        //Add the sample to the training data
        trainingData.addSample( gestureLabel, sample );
    }

    //After recording your training data you can then save it to a file
    if( !trainingData.save( "TrainingData.grt" ) ){
        cout << "ERROR: Failed to save dataset to file!n";
        return EXIT_FAILURE;
    }

上面代码完整的例子我就不贴出来了,主要就是他写了一个随机数产生器,是一百组的数据,然后每一次for循环产生一组,然后用 trainingData.addSample来保存起来,结束循环之后,将其保存到txt中,这个是可行的 我确实得到了所有的数据,就是不知道为什么我的不行呢?求指教!

解决方案四:

我顶下,别沉啊!赶快来人啊

解决方案五:

人呢?怎么没人出来 没人帮忙吗

时间: 2025-01-20 20:34:44

kinect-请教大家一个关于vector动态存储的问题的相关文章

c++-请教一个关于vector函数的问题?

问题描述 请教一个关于vector函数的问题? std::vectorcard; class Information { ...... }; Information *Search() { int i=1; string tempname; cout<<"请输入姓名:"; cin>>tempname; Information * temp; temp=card.begin(); //无法从"std::_Vector_iterator<_Myvec

javascript-JavaScript 请教大家一个动态创建下拉列表的问题?

问题描述 JavaScript 请教大家一个动态创建下拉列表的问题? 我需要动态创建下拉列表,每次创建有一个清空下拉列表的过程. 用如下代码创建: function getopt(data,obj){ var optcontent=""; for(var i=0;i<data.length;i++){ optcontent="<option value="+(i+1)+">"+data[i]+"</option&

请教朋友们,django动态改变ImageField,FileField的upload_to

问题描述 请教朋友们,django动态改变ImageField,FileField的upload_to 各位朋友们好,现在我有两个文件夹pro1和pro2, pro1下面有0.mp4,1.mp4,pro2下面有0.mp4和1.mp4,我用django的 video = models.FileField(upload_to = 'myvideo') 虽然可以将视频都上传到myvideo目录下面,但是myvideo下面的文件是: 0. mp4,0_2.mp4,1.mp4,1_2.mp4了,因为出现一

c++-请教:一个完整的C++程序如何提供一个接口给其他软件使用

问题描述 请教:一个完整的C++程序如何提供一个接口给其他软件使用 如题.我用C++做了一个软件,现在想提供一个dll给另一个软件使用.要如何做?是直接在这个C++程序上做接口,还是另外建一个工程来生成dll? 请教大神们啦~谢谢 解决方案 要看另一个软件是需要如何和你的程序交互. 用到你程序的一部分,那么开放dll 只是传递数据的话,提供数据传递的标准,让它自己实现 希望整体嵌入你的程序,那么你实现一个OLE Server,让它用OLE Container嵌入你的程序. 如果那个程序不在本地,

内存机制-关于动态存储与静态存储的区别

问题描述 关于动态存储与静态存储的区别 什么时候要用到动态存储呢?它在用的时候还要指定大小,和静态分配区别在哪呢? 解决方案 运行的时候若由用户指定了一个大小n,程序接下来就可以这样分配int *arr = (int *) malloc ( sizeof(int) * n ); 解决方案二: 编译的时候无法确定大小的,只能用动态存储.另外,程序中可能使用,也可能不使用的存储,用动态存储可以提高性能. 解决方案三: 我是说编译时无法确定大小.而不是说无法确定大小.malloc中指定变量,而变量来自

C语言动态存储分配

动态存储分配 C语言支持动态存储分配,即在程序执行期间分配内存单元的能力,利用动态存储分配,可以根据需要设计扩大(或缩小)的数据结构,虽然可以适用于所有类型的数据,但是动态存储分配更常用于字符串.数组和结构体 本文地址:http://www.cnblogs.com/archimedes/p/c-dynamic-storage-allocation.html,转载请注明源地址. 1.内存分配函数 3种内存分配函数都是声明在<stdlib.h>中: malloc函数--分配内存块,但是不对内存块进

受访的IT用户中每四个就有一个实施了统一存储

尽管貌似我们已经听统一存储听了很久了,但它还是相对很新的--这意味着我们还在接受循环的早期. 不过有一点是明显的,统一或者多协议的存储有十分诱人的价值优势.在一个统一存储环境中,数据存储变成了一个共享的资源池,来存储块的或者文件数据,并根据应用需求来配置.所以用户非常有兴趣来实施统一存储平台就不足为奇了.在最近的一个对306个有存储规划或者决策职责的IT专业人士的调查中,ESG(Enterprise Strategy Group)发现在受访者中有70%已经或者正在计划实施统一存储.有23%已经实

使用C语言实现vector动态数组的实例分享_C 语言

下面是做项目时实现的一个动态数组,先后加入了好几个之后的项目,下面晒下代码. 头文件: # ifndef __CVECTOR_H__ # define __CVECTOR_H__ # define MIN_LEN 256 # define CVEFAILED -1 # define CVESUCCESS 0 # define CVEPUSHBACK 1 # define CVEPOPBACK 2 # define CVEINSERT 3 # define CVERM 4 # define EXP

(五十九)自动存储、静态存储、动态存储

自动存储: 函数内部定义的常规变量,被称为自动变量,这意味着他们在所属的函数被调用的时候自动产生,在该函数结束时消亡.   自动变量是一个局部变量,作用域为包含他的代码块,比如int main(){}中定义的int a; 在int abc(){}这个函数中就不能用.   自动变量通常储存在 栈 中,这意味着执行代码块时,其中的变量将依次加入到 栈 中,而离开代码块时,将按相反的顺序释放这些变量,这被称为后进先出(LIFO),因此,在程序执行的过程中,栈将不断的增大和缩小.   静态存储: 静态存