用OpenCV复制一个指向对象

Copying a pointed-to object with OpenCV

本文关键字:一个 对象 OpenCV 复制      更新时间:2023-10-16

我不是一个很好的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捕获一个新的图像(我已经完成了代码,它将进入if语句的正确分支)。

实际发生的情况是,我输出的两个帧是相同的,而不是像我希望的那样,previous_frame延迟一个。

我是否误用了指针?如果是这样,我该如何获得我想要的行为呢?或者它看起来像我想要的那样?

谢谢。

我怀疑您正在使用原始的C API:这里IplImage被定义为POD结构

typedef struct _IplImage
{
  // ...
    char *imageData;
  // ...
}
IplImage;

可以看到,new IplImage(*current_frame)只复制指针(特别是imageData),而不是实际数据。所以你是在虚假地共享两张图像中的数据。

我建议您在这里阅读c++包装器,特别是如何使用它们进行内存管理:http://opencv.willowgarage.com/documentation/cpp/memory_management.html

EDIT如果你想使用C API:

currFrame = cvQueryFrame( cap );
// Clone the frame to have an identically sized and typed copy
prevFrame  = cvCloneImage( currFrame );
相关文章: