使用OpenCV复制指向对象

时间:2011-11-12 20:50:36

标签: c++ pointers opencv

我不是一个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语句的正确分支。)

实际发生的是我输出两个帧并且它们是相同的,而不是像我想要的那样滞后一个帧。

我是否滥用指针?如果是这样,我该怎么做才能得到我想要的行为?或者这看起来应该做我想做的事情?

感谢。

1 个答案:

答案 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 );