垫子结构和记忆的问题

Problems with Mat structure and memcpy

本文关键字:问题 记忆 结构      更新时间:2023-10-16

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

基本上代码是:

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

问题是NewFrame和OldFrame不一样。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

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

"有没有理由不使用cv::Mat::clone?–juancapanza 48分钟前"

请相信那个家伙,上帝会杀死小猫,如果你在简历上使用memcpy:Mat是这样的!

此外,它们被重新计数,因此它们可以处理被放入std::vector中的问题,这本身就很好,不需要删除它们。realloc是一个C的东西,这就是C++!

所以,你可以做一个"浅"拷贝,Mat a,b;b=a;(现在a和b指向同一个内存,refcount增加了。)或深度复制,Mat a,b,b=克隆();(现在两人都有了自己的像素副本)

使用普通memcpy与浅拷贝类似,只是不能正确处理refcount,所以memcpied Mat的src和dst迟早都会有悬空指针。