【问题标题】:does cvrelease delete the allocated memory?cvrelease 会删除分配的内存吗?
【发布时间】:2010-10-27 18:42:05
【问题描述】:

这可能是错误的处理方式,但我将 LabView 中的一个数组作为一个简单的 char 数组传递到我的 C++ 函数中。然后我创建一个 OpenCV 图像并将指针指向我传递的数据。在函数结束时,我使用 cvReleaseImage 删除所有 OpenCV 图像,这会从我的原始指针中删除数据吗?

另外,是否有更好的方法来执行修改原始图像的就地操作?

EXPORT void smoothImg(uchar * the_img, int size_x, int size_y)
{
 CvSize size;
 size.height = size_y ;
 size.width = size_x;

 IplImage * img1 = cvCreateImageHeader(size, IPL_DEPTH_8U, 1);
 img1->imageData = (char *)the_img;
 img1->imageDataOrigin = img1->imageData;

 IplImage * img2 = cvCreateImage(size, IPL_DEPTH_8U, 1);
// this is because I want my end result to be in img1 (same data as my the_img
 memcpy(img2->imageData,img1->imageData,sizeof(char)*size_x*size_y);

 cvSmooth(img2,img1,CV_BLUR, 5,5);

 cvReleaseImage(&img1 );
 cvReleaseImage(&img2 );

}

注意:它似乎不会影响我的图像,因为结果是正确的,但我想在我把它放在任何地方之前确保这是正确的

谢谢!

【问题讨论】:

  • 别忘了标记您已经提出的其他问题的答案。
  • 你可以使用 cvCloneImg() 代替 memcpy(),它做同样的事情但可能更合适。

标签: c++ memory-management opencv


【解决方案1】:

cvRelease 释放图像使用的内存,因此在调用它之后,您将无法再引用该图像。

但是 - 在 openCV 存在之前,其他程序可能无法使用内存,它取决于系统如何处理内存,以及系统何时为其他应用程序返回释放的内存。

编辑:对不起,我没有真正回答你的问题。有一个标志可以传递给 cvCreateImage() 来表示 - 我拥有内存,不要删除它。该标志略微取决于您拥有的 opencv 版本

【讨论】:

    【解决方案2】:

    我实际上发现了一篇关于 OpenCV 内存分配/释放的非常有趣的文章,我想这意味着我应该使用 cvReleaseImageHeader,因为我只是想删除标题。

    http://www.andol.info/hci/963.htm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 2011-06-17
      • 2015-01-18
      • 2019-09-17
      • 1970-01-01
      相关资源
      最近更新 更多