【发布时间】:2013-02-15 04:50:03
【问题描述】:
请帮忙解决这个问题:
OpenCV 错误: Insufficient memory (Failed to allocate 921604 bytes) in 未知功能,文件 ........\ocv\opencv\modules\core\src\alloc.cpp,第 52 行
我使用cv::clone和pointer的方法之一
代码是:
每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 创建的所有结果图像都存储在某种容器中。