В настоящее время я работаю над проектом Kinect в C ++. Я работаю под Ubuntu 12.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. Это означает, что вместо вставки последние точки заменяются. (Я их распечатал, чтобы я мог видеть координаты)
Я также пытался push_front
который заменяет координаты спереди, а также векторы вместо списков, что имеет ту же проблему для push_back
а также insert
,
Я также пробовал тот же код в Windows с VS2010, где он работал нормально.
Я понятия не имею, что я делаю не так.
Так что было бы здорово, если бы кто-то мог мне помочь. 🙂
Я вижу пару проблем.
Когда вы добавляете указатель на переменную стека в список рук. Как только рука выходит из области видимости, у вас есть свисающий указатель.
Во-вторых, ваш handlist.Get возвращается (предположительно) копией, и, следовательно, все, что вы добавляете в него, не отражается в версии, которую занимает handlist. То есть: Вы можете вызвать handlist.Get (), добавить 500 баллов, затем вызвать handlist.Get еще раз, и это будет оригинальная версия.
Ваша функция handlist.Get () также не возвращает указатель, но вы передаете указатель handlist.Add (), поэтому ваш интерфейс не ясен.
Других решений пока нет …