【问题标题】:How to fix the insufficient memory error (openCV)如何修复内存不足错误(openCV)
【发布时间】:2013-02-15 04:50:03
【问题描述】:

请帮忙解决这个问题:

OpenCV 错误: Insufficient memory (Failed to allocate 921604 bytes) in 未知功能,文件 ........\ocv\opencv\modules\core\src\alloc.cpp,第 52 行

我使用cv::clonepointer的方法之一

代码是:

每100ms有一个定时器; 在定时器事件中,我调用了这个方法:

void DialogApplication::filterhijau(const Mat &image, Mat &result) {   
   cv::Mat resultfilter = image.clone();

   int nlhijau = image.rows;

   int nchijau = image.cols*image.channels();;

    for(int j=0; j<nlhijau; j++) {
       uchar *data2=resultfilter.ptr<uchar> (j);  //alamat setiap line pada result
       for(int i=0; i<nchijau; i++) {
          *data2++ = 0;       //element B
          *data2++ = 255;     //element G  
          *data2++ = 0;       //element R
       }
     //  free(data2);   //I add this line but the program hung up
   }

   cv::addWeighted(resultfilter,0.3,image,0.5,0,resultfilter);
   result=resultfilter;
}

【问题讨论】:

  • 每次调用此函数都会创建一个新图像。您对该函数进行了多少次调用?
  • 而不是result = resultfilter,这样做result = resultfilter.clone(); resultfilter.release()。而且永远不会像这样释放cv::Mat对象的内部数据指针:free(data2)
  • @carlosdc:我想几百是因为程序运行良好,但是2分钟后有错误显示。
  • @sgar91:感谢指正。但是在 result = resultfilter.clone() 之后,意味着我们再次创建了一个新图像。尝试后仍然有错误消息。还有其他可能吗?
  • 通常不需要 Mat::release(),因为当 cv::Mat 的实例超出范围 (RAII) 时,内存会自动释放。请显示完整的代码以重现您的问题。 (sscce.org)。如果没有,我们只需要猜测您将使用 filterhijau 创建的所有结果图像都存储在某种容器中。

标签: c++ opencv


【解决方案1】:

cv::Matclone() 方法执行数据的硬拷贝。所以问题是,为每个filterhijau() 分配了一个新图像,并且在数百次调用此方法后,您的应用程序将占用数百 MB(如果不是 GB),从而抛出 Insufficient Memory错误。

您似乎需要重新设计当前的方法,以便占用更少的 RAM 内存。

【讨论】:

  • 你的意思是 clone() 应该被其他替换吗?我只是使用一个计时器,在计时器中我调用 filterhijau() 方法。
  • 没有。我的意思是您需要重新考虑当前程序的工作方式并重新设计它,这样您就不会占用太多 RAM。您真的需要将所有这些图像同时存储在内存中吗?听起来您可以在它们被处理后释放它们,这样它们就不会浪费有用的 RAM 空间。
  • @karlphilip:实际上不需要存储图像。我没有找到 C++ 中的 cv::Release,就像 C 中的 CvRelease 一样。
【解决方案2】:

我之前遇到过这个错误,我通过在阅读图像时减小图像的大小来解决它并牺牲了一些分辨率。

在 Python 中是这样的:

# Open the Video 
cap = cv2.VideoCapture(videoName + '.mp4')
i = 0
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    frame = cv2.resize(frame, (900, 900))
    # append the frames to the list
    images.append(frame)
    i += 1
cap.release()

注意我知道这不是解决问题的最佳方案,但对我来说已经足够了。

【讨论】:

  • 缩小尺寸不会减少它,因为它是一种有缺陷的方法,你最终会遇到同样的错误,但在这个过程的后期。除了你用错误的编程语言回答之外。
  • 我知道这不是最好的方法,但我只是建议一种对我来说很好的可能方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 2019-04-18
  • 2023-04-09
相关资源
最近更新 更多