现象:调用cvLoadImage加载图片时报OpenCV Error: Insufficient memory (Failed to allocate 3221225472 bytes) in cv::OutOfMemoryError

通过错误描述可以大致猜想,是在申请内存时崩溃,且这个值的大小超过了int的最大值,带着猜想我们跟一下opencv的源码。

调用栈如下:

cvLoadImage->cv::imread_->cvCreateImage->cvCreateImageHeader->cvInitImageHeader->cvCreateData

cvInitImageHeader中计算图片像素大小,关键代码段:array.cpp::cvInitImageHeader

image->widthStep = (((image->width * image->nChannels *
         (image->depth & ~IPL_DEPTH_SIGN) + 7)/8)+ align - 1) & (~(align - 1));
image->origin = origin;
image->imageSize = image->widthStep * image->height;

此时,由于图片像素太大,opencv计算出的 image->imageSize 的值为3221225472,而image->imageSize的类型为int,该值已经超过了正整数的最大值,导致发生了截断,在内存中表示的值为-1073741824。而在cvCreateData中,会用这个大小去申请内存,程序自然就崩掉了。

 

总结:图片像素过大,opencv算出来的值超过了int的最大值,发生了截断,算法就是以上几行代码。然后用这个大小申请内存时崩溃。可见opencv对输入的图片像素是有限制的,在调用cvLoadImage之前,可以手动计算一下该值大小,如果超过了最大正整数的值,即2147483648,就会发生截断,造成程序崩溃。

GitHub 加速计划 / opencv31 / opencv
237
21
下载
OpenCV: 开源计算机视觉库
最近提交(Master分支:3 个月前 )
d8bc5b94 Fix potential pointer overflow in BlockSum 1 天前
481ebe0a Fix copyTo on empty fixed-type matrices (#28343) 1 天前
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐