我在OpenCV 2.2.0的图像处理方面工作了一年。
如果我尝试分配> 2GB IplImage,我会得到一个内存分配错误,因为CvMat的相同分配是有效的。我可以使用CvMat分配任何我想要的东西,我也试过了> 10 GB。
OpenCV是64位编译的,也是这个简单的应用程序。此外,我确信应用程序以64位模式运行,我可以从任务管理器中看到。 O.S. (Windows 7)也是64位。
int main(int argc, char* argv[])
{
printf("trying to allocate >2GB matrix...\n");
CvMat *huge_matrix = cvCreateMat(40000,30000,CV_16UC1);
cvSet(huge_matrix,cvScalar(5));
printf("...done!\n\n");
system("PAUSE");
printf("trying to allocate >2GB image...\n");
IplImage *huge_img = cvCreateImage(cvSize(40000,30000),IPL_DEPTH_16U, 1);
cvSet(huge_img,cvScalar(5));
printf("...done!\n\n");
system("PAUSE");
cvReleaseMat(&huge_matrix);
cvReleaseImage(&huge_img);
}
错误信息是“内存不足:在未知功能中......这可能是个错误吗?”
答案 0 :(得分:2)
IplImage
结构不支持大于2Gb的图像,因为它将总图像大小存储在int
类型的字段中。即使你用一些黑客分配IplImage
大于2Gb,那么其他方法也无法正确处理它。 OpenCV继承了英特尔图像处理库中的IplImage
结构,因此不会更改格式。
您应该使用较新的结构(C接口中的CvMat
或C ++接口中的cv::Mat
)来处理大图像。