C++ Mat结构和memcpy的问题
我正在尝试使用C++ Mat结构和memcpy的问题,c++,opencv,C++,Opencv,我正在尝试使用memcpy将Mat结构从OpenCV复制到另一个Mat(我在Windows中使用OpenCV 2.4.3) 基本上,守则是: Mat NewFrame,OldFrame; OldFrame=imread(image,CV_LOAD_IMAGE_COLOR); memcpy(&NewFrame,&OldImage,sizeof(Mat)); 问题是新框架和旧框架不一样。NewFrame.step.buf的地址在此memcpy(???)之后已更改 在memcpy之前
memcpy
将Mat
结构从OpenCV复制到另一个Mat
(我在Windows中使用OpenCV 2.4.3)
基本上,守则是:
Mat NewFrame,OldFrame;
OldFrame=imread(image,CV_LOAD_IMAGE_COLOR);
memcpy(&NewFrame,&OldImage,sizeof(Mat));
问题是新框架和旧框架不一样。NewFrame.step.buf
的地址在此memcpy(???)之后已更改
在memcpy之前,OldFrame的步骤
字段的地址为:
OldFrame.step.p=0x0032f338
OldFrame.step.buf=0x0032f338
在memcpy之后,NewFrame的步骤
字段的地址为:
NewFrame.step.p=0x0032f338
NewFrame.step.buf=0x0032f2f8 // it should be 0x0032f338
我不明白为什么地址发生了变化,以及如何解决这个问题 “有没有不使用cv::Mat::clone的理由?–48分钟前的juanchopanza”
请相信那个家伙,上帝杀了小猫,如果你在简历上使用memcpy::Mat是这样的
此外,它们是refcounted的,因此它们可以自己处理放入std::vector的操作,不需要删除它们。ReLoLc是C的东西,这是C++!
所以,你可以做一个“浅”的拷贝,Mat a,b;b=a;(现在a和b指向相同的内存,refcount增加了。)
或者一个深度副本,Mat a,b,b=a.clone();(现在两者都有自己的像素副本)
使用纯memcpy与浅拷贝类似,它只是不能正确处理引用计数,因此memcpied Mat的src和dst迟早都会有悬空指针。“有什么理由不使用cv::Mat::clone吗?–48分钟前的juanchopanza”
请相信那个家伙,上帝杀了小猫,如果你在简历上使用memcpy::Mat是这样的
此外,它们是refcounted的,因此它们可以自己处理放入std::vector的操作,不需要删除它们。ReLoLc是C的东西,这是C++!
所以,你可以做一个“浅”的拷贝,Mat a,b;b=a;(现在a和b指向相同的内存,refcount增加了。)
或者一个深度副本,Mat a,b,b=a.clone();(现在两者都有自己的像素副本)
使用普通memcpy与浅拷贝类似,它只是不能正确处理引用计数,因此memcpied Mat的src和dst迟早都会有悬空指针。有没有理由不使用
cv::Mat::clone
?@juanchopanza是的。这段代码来自一个更大的项目,我把一些Mat
结构放在一个动态增长的模板向量中,当它增长时,它会执行memcpy
和delete
(就像realloc)。有什么理由不使用cv::Mat::clone
。这段代码来自一个更大的项目,我把一些Mat
结构放在一个动态增长的模板向量中,当它增长时,它会执行memcpy
和delete
(就像realloc)。对不起,伙计,你没有回答我的问题。我理解克隆的好处,但我不能使用克隆,因为它来自模板向量。我问为什么在memcpy
期间,来自step
的buf
成员发生了变化。我不知道,为什么您的step成员在那里发生了变化。进行了一次测试,但没有在这里发生(但舒尔的测试结果因堆损坏而崩溃)。我只是想让你远离memcpy,因为它会破坏src和dst的引用计数。解释一下,你为什么想要memcpy?对不起,伙计,但你没有回答我的问题。我理解克隆的好处,但我不能使用克隆,因为它来自模板向量。我问为什么在memcpy
期间,来自step
的buf
成员发生了变化。我不知道,为什么您的step成员在那里发生了变化。进行了一次测试,但没有在这里发生(但舒尔的测试结果因堆损坏而崩溃)。我只是想让你远离memcpy,因为它会破坏src和dst的引用计数。解释一下,你为什么想要memcpy?