私は現在、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を使用して同じコードを試しましたが、正常に機能しました。何が間違っているのか全くわかりません。
だから誰かが私を助けてくれたら素晴らしいと思います。:)