我正试图使用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迟早都会有悬空指针。