OpenCV:为什么* p_img1 = * p_img2不正确

时间:2017-08-19 14:22:26

标签: c++ opencv iplimage

p_img1p_img2以前是IplImage* cvLoad' ed,我希望p_img1成为p_img2的副本。

*p_img1 = *p_img2;似乎工作正常(我可以在调试模式下检查它,以及通过显示图像),除了在该行之后,使用cvReleaseImage作为一个指针显然也会破坏另外一个。我不理解它,因为两个指针(两个地址)不同,只复制了结构的字段。

我注意到使用p_img1 = cvCloneImage(p_img2);修复了问题。

有人可以解释为什么*p_img1 = *p_img2错了吗? cvCloneImage()的做法有何不同?

1 个答案:

答案 0 :(得分:5)

我建议你进一步阅读与C ++指针相关的引用。

您的p_img1p_img2是指向IplImage结构的指针。

  • p_img1指向imageheader1
  • p_img2指向imageheader2

但是,IplImage结构不包含图像数据,而是保存指向存储像素值的内存位置的指针。

  • imageheader1包含指向pixeldata1的指针
  • imageheader2包含指向pixeldata2的指针

执行*p_img1 = *p_img2会使p_img1的内容与p_img2类似,因此

  • imageheader1现在包含指向pixeldata2的指针
  • imageheader2仍然包含指向pixeldata2的指针
如果未释放,

pixeldata1将被取消引用并成为潜在的内存泄漏。释放时,cvReleaseImage接受指针'指针的参数,实际释放指向的图像头,因此imageheader1和imageheader2都将指向无效的内存。

cvCloneImage具有内置内存分配功能,在将内容复制到内存之前,它实际上会分配新的内存块。执行p_img1 = cvCloneImage(p_img2)将导致OpenCV分配新的内存块(pixeldata3),从pixeldata2复制数据(由p_img2的imageheader2指向),然后更新imageheader1(由p_img1指向)。

  • imageheader1包含指向pixeldata3的指针
  • imageheader2包含指向pixeldata2的指针

=>如果未释放,pixeldata1将被取消引用并成为潜在的内存泄漏。