Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Mat结构和memcpy的问题_C++_Opencv - Fatal编程技术网

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?