现象:调用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中,会用这个大小去申请内存,程序自然就崩掉了。