0

私は現在、C++でkinectプロジェクトに取り組んでいます。私はUbuntu12.04(32ビット)で作業しており、OpenNI/NITEを使用しています。手を見つけてその座標をリストに保存したいのですが、この部分には次のコードがあります。

ヘッダ:

#ifndef HAND_H_
#define HAND_H_
#include <list>
#include<iostream>
#include <stdio.h>

class Hand
{
public:
    std::list<double> Xpoints;
    std::list<double> Ypoints;
    std::list<double> Zpoints;
    Hand(int id);
    int handID;
    void AddPoint(double x, double y, double z);
    void ClearList(void);
    void ReleaseHand(void);
    int GetID(void);
    int Size();
};
#endif

CPP:

#include "Hand.h"

Hand::Hand(int id)
{
    handID = id;
}


void Hand::AddPoint(double x, double y, double z)
{
    ("Hand ID: %d: (%f,%f,%f)\n", handID, x, y, z);
    if(handID > 0)
    {
        Xpoints.push_back(x);
        Ypoints.push_back(y);
        Zpoints.push_back(z);
        ("Added to Hand ID: %d: (%f,%f,%f)\n", handID, x, y, z);
    }
    else
    {
        std::cout << "Hand does not exist anymore - Inconsistency!" << std::endl;
    }
}


void Hand::ClearList(void)
{
    Xpoints.clear();
    Ypoints.clear();
    Zpoints.clear();
}

void Hand::ReleaseHand(void)
{
    handID = -1; // if (ID==-1) no valid hand
    Xpoints.clear();
    Ypoints.clear();
    Zpoints.clear();
}

int Hand::GetID(void)

{
    return handID;
}

int Hand::Size()
{
    return Xpoints.size();
}

ここでAddPoints()呼ばれます:

Hand hand(cxt->nID);
hand.AddPoint(cxt->ptPosition.X, cxt->ptPosition.Y, cxt->ptPosition.Z);
handlist.Add(&hand);

そしてそれはうまくいきます。後で、kinectから手の新しい座標を取得すると、これを次のように呼び出します。

Hand tmp = handlist.Get(cxt->nID);
tmp.AddPoint(cxt->ptPosition.X, cxt->ptPosition.Y, cxt->ptPosition.Z);
std::cout << "Hand size " << tmp.Size() << std::endl;

ここで、これが初めて呼び出されたときに、2番目の座標セットが私の手のリストに追加されます。ただし、その後、リストはサイズ2より大きくなることはできません。つまり、挿入する代わりに、最後のポイントが置き換えられます。(私はそれらを印刷したので、座標を見ることができました)またpush_front、同じ問題を抱えているリストの代わりに、前面の座標とベクトルを置き換えるものをpush_back試しましたinsert。また、WindowsでVS2010を使用して同じコードを試しましたが、正常に機能しました。何が間違っているのか全くわかりません。

だから誰かが私を助けてくれたら素晴らしいと思います。:)

4

1 に答える 1

2

いくつかの問題があります。

スタック変数へのポインターをハンドリストに追加するもの。手が範囲外になるとすぐに、ポインタがぶら下がります。

第 2 に、handlist.Get は (おそらく) コピーによって返されるため、それに追加した内容は、handlist が占めるバージョンには反映されません。つまり、handlist.Get() を呼び出し、500 ポイントを追加してから、handlist.Get を再度呼び出すと、元のバージョンになります。

handlist.Get() 関数もポインターを返していませんが、handlist.Add() にポインターを渡しているため、インターフェイスが明確ではありません。

于 2013-01-28T16:58:20.363 に答える