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

OpenCV: Why *p_img1=*p_img2 is not correct

p_img1p_img2 之前被 IplImage* 加载,我希望 p_img1 成为 p_img2.[=22= 的副本]

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

我注意到使用 p_img1 = cvCloneImage(p_img2); 可以解决问题。

有人可以解释为什么 *p_img1 = *p_img2 是错误的吗? cvCloneImage() 有什么不同之处?

我建议您进一步阅读与 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取参数'pointer of pointer',实际上是释放指向的imageheader,所以imageheader1和imageheader2都会指向无效内存。

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

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

=> pixeldata1 如果不释放,将无法引用并成为潜在的内存泄漏。