我不是一个C ++程序员,更习惯于C#和Java,而不需要担心指针。我思考我明白我在这里做了什么,但结果并不是我所期待的,我不确定我在这里做些蠢事,或者是否在其他地方程序造成了问题。
无论如何,我正在使用OpenCV,我有两张图片,我这样初定:
IplImage *current_frame = NULL;
IplImage *previous_frame = NULL;
然后我有这段代码:
if (current_frame != NULL)
{
previous_frame = new IplImage(*current_frame);
current_frame = cvQueryFrame( capture );
}
else
{
current_frame = cvQueryFrame( capture );
previous_frame = cvQueryFrame( capture );
}
这个想法是第一次代码执行时,当前帧和前一帧都将使用新捕获的图像,但对于后续帧,previous_frame将采用current_frame的先前值,而current_frame将捕获一个新图像(I'我逐步完成了代码,它将进入if语句的正确分支。)
实际发生的是我输出两个帧并且它们是相同的,而不是像我想要的那样滞后一个帧。
我是否滥用指针?如果是这样,我该怎么做才能得到我想要的行为?或者这看起来应该做我想做的事情?
感谢。
答案 0 :(得分:1)
我怀疑您使用的是原始C API:IplImage
is defined as a POD struct
typedef struct _IplImage
{
// ...
char *imageData;
// ...
}
IplImage;
如您所见,new IplImage(*current_frame)
仅复制指针(尤其是imageData
),而不是实际数据。因此,您错误地共享两个图像中的数据。
我建议你在这里阅读C ++包装器,特别是如何将它们用于内存管理:http://opencv.willowgarage.com/documentation/cpp/memory_management.html
编辑如果您想使用C API:
currFrame = cvQueryFrame( cap );
// Clone the frame to have an identically sized and typed copy
prevFrame = cvCloneImage( currFrame );