我需要使用缓冲区,所以我决定使用deque。我正在跟踪一个帧中的多个对象,我将坐标和直方图信息放入一个大小为20的trackarray。为此,我有一个名为Tracker的类。 trackarray是一个Tracker对象,它保存跟踪的对象信息。我试图将这些信息复制到缓冲区。
这是我定义缓冲区和结构的方式:
std::deque<FRAMETRACKERARRAY> bufferTA;
typedef struct
{
Tracker TrackerArray[trackerSize];
} FRAMETRACKERARRAY;
这是我更新缓冲区的方式:
if(uLastIndex > BUF_SIZE-1)
{
uLastIndex = 0;
}
memcpy(FrameTrackerArray[uLastIndex].TrackerArray, trackarray, sizeof(Tracker)*trackerSize);
for (int k = 0; k<trackarray[0].lastIndex; k++) {
if(trackarray[k].initial_height!=-1 && trackarray[k].initial_width!=-1 && trackarray[k].initialx!=-1 && trackarray[k].initialy!=-1) {
memcpy(&FrameTrackerArray[uLastIndex].TrackerArray[k].histogram, &trackarray[k].histogram, sizeof(trackarray[k].histogram));
}
}
uLastIndex++;
这是我将数组添加到缓冲区的方法:
bufferTA.pop_front();
bufferTA.push_back(FrameTrackerArray[uLastIndex]);
我拿着一个大小为10的缓冲区。每一帧,我将当前的trackarray推到deque并弹出第一个。
Tracker类是这样的:
class Tracker
{
public:
Tracker();
~Tracker();
int initialx;
int initialy;
int initial_width;
int initial_height;
CvHistogram * histogram;
private:
IplImage *backproject;
}
Tracker::Tracker()
{
initialx=-1;
initialy=-1;
initial_width=-1;
initial_height=-1;
int hist_size[]={ybins,cbbins,crbins};
float y_ranges[]={0,255};
float cb_ranges[]={0,255};
float cr_ranges[]={0,255};
float* ranges[]={y_ranges,cb_ranges,cr_ranges};
histogram = cvCreateHist(3,hist_size,CV_HIST_ARRAY,ranges,1);
}
Tracker::~Tracker()
{
if(backproject) {
cvReleaseImage(&backproject);
}
cvReleaseHist(&histogram);
}
在第一帧中,我使用第一帧中跟踪对象的信息初始化缓冲区。这意味着,在第一帧缓冲区中,所有元素都是相同的。当新帧到来时,缓冲区会更新。当uLastIndex再次变为0时,当我使用pop_front()时,我的缓冲区中保存的整个直方图信息被重置。在uLastIndex得到0之前,我可以毫无问题地使用我的缓冲区。我该如何解决这个问题?
谢谢。