0

我正在尝试将Mat结构从 OpenCV 复制到另一个Mat使用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 之前,stepOldFrame 的字段地址是:

 OldFrame.step.p=0x0032f338
 OldFrame.step.buf=0x0032f338

在 memcpy 之后,step来自 NewFrame 的字段地址为:

 NewFrame.step.p=0x0032f338
 NewFrame.step.buf=0x0032f2f8 // it should be 0x0032f338

我不明白为什么地址已更改以及如何解决此问题。

4

1 回答 1

3

“有什么理由不使用 cv::Mat::clone?—— juanchopanza 48 分钟前”

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

此外,它们被引用,因此它们可以自己处理被放入一个非常好的 std::vector 中,无需删除它们。realloc 是 C 的东西,这是 C++!

所以,你可以做一个“浅”的复制,Mat a,b; b=a; (现在 a 和 b 指向同一个内存,引用计数增加了。)或深拷贝,Mat a,b, b = a.clone(); (现在两者都有自己的像素副本)

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

于 2013-02-11T17:02:13.440 回答