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

标签 c++ opencv iplimage

p_img1p_img2IplImage* 之前的 cvLoad'ed,我希望 p_img1 成为拷贝p_img2

编写 *p_img1 = *p_img2; 似乎工作正常(我可以在 Debug模式下检查它,以及通过显示图像),除了在那行之后,使用 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 如果不释放,将不会被引用并成为潜在的内存泄漏。

关于c++ - OpenCV:为什么 *p_img1=*p_img2 不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45772655/

相关文章:

c++ - 为什么模板只能在头文件中实现?

c++ - 移动包含正在运行的 std::thread 成员的对象

c++ - Boost 库中的 Io_context 错误

java - 将 3x3 OpenCV Mat 转换为 Android 矩阵

c++ - 找不到成员函数的标识符

python - cv2.matchTemplate 函数与模板和图像不匹配后,如何阻止程序执行?

python - 函数adaptiveThreshold中的CV_8UC1(错误215)

c++ - 从 IplImage* 到 cv::MAT 的转换

java - Android 上 java.awt.image.BufferedImage 的 ClassNotFoundException

java - JavaCV 的 cvResize 函数