我正在尝试使用Mat
将Mat
结构从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
我不明白为什么地址已经改变以及如何解决这个问题。
答案 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迟早会有悬空指针。