Mat结构和memcpy的问题

时间:2013-02-11 16:00:49

标签: c++ opencv

我正在尝试使用MatMat结构从OpenCV复制到另一个memcpy(我在Windows中使用OpenCV 2.4.3)

基本上代码是:

Mat NewFrame,OldFrame;
OldFrame=imread(image,CV_LOAD_IMAGE_COLOR);
memcpy(&NewFrame,&OldImage,sizeof(Mat));

问题是NewFrame和OldFrame不一样。在此memcpy(???)

之后,NewFrame.step.buf的地址已更改

在memcpy之前,OldFrame中step字段的地址为:

 OldFrame.step.p=0x0032f338
 OldFrame.step.buf=0x0032f338

在memcpy之后,来自NewFrame的step字段的地址为:

 NewFrame.step.p=0x0032f338
 NewFrame.step.buf=0x0032f2f8 // it should be 0x0032f338

我不明白为什么地址已经改变以及如何解决这个问题。

1 个答案:

答案 0 :(得分:3)

“任何理由不使用cv :: Mat :: clone? - juanchopanza 48分钟前”

请相信那个家伙,上帝杀了小猫,如果你用cv :: Mat这样的方式使用memcpy!

另外,它们都是refcounted,所以它们可以自己处理std :: vector非常好,不需要删除它们。 realloc是C的东西,这是C ++!

所以,你可以做一个'浅'副本,Mat a,b; B = A; (现在a和b指向相同的内存,refcount增加了。) 或深拷贝,Mat a,b,b = a.clone(); (现在都有自己的像素副本)

使用plain memcpy类似于浅拷贝,它只是不能正确处理refcounts,所以你的memcpied Mat的src和dst迟早会有悬空指针。