大型图像的OpenCV内存使用问题

大型图像的OpenCV内存使用问题,opencv,memory,tiff,imshow,imread,Opencv,Memory,Tiff,Imshow,Imread,当我试图显示巨大的图像(如2GB的TIFF图像)时,我意识到内存使用问题。 代码如下: Mat image, output; image = imread("img.tif", IMREAD_UNCHANGED); //Memory usage : 2GB normalize(image, output, 0, 0xFFFF, cv::NORM_MINMAX); //Memory usage : 4GB namedWindow("Display Image", WINDOW_NORMAL)

当我试图显示巨大的图像(如2GB的TIFF图像)时,我意识到内存使用问题。 代码如下:

Mat image, output;

image = imread("img.tif", IMREAD_UNCHANGED);
//Memory usage : 2GB

normalize(image, output, 0, 0xFFFF, cv::NORM_MINMAX);
//Memory usage : 4GB

namedWindow("Display Image", WINDOW_NORMAL);
imshow("Display Image", output);
//Memory usage : 6.5GB

waitKey(0);
当我在Ubuntu环境中以调试模式一步一步地运行这个程序时,我看到系统监视器中的内存使用量正在急剧增加

当点击imread时,我的程序使用大约2GB的内存。 调用normalize时,它将增加到大约4GB。 最后,当调用imshow时,它将增加到~6.5GB

所以每次我称之为imread、normalize和imshow时,它都会创建新的拷贝

有没有办法克服这个问题?
我想也许我可以手动规范化我的原始图像,但是否可以使用imshow引用我的原始Mat对象,而不是创建一个新对象?

由于您的.tif文件是2GB,我想知道您的.tif图像是单个图像还是包含多个图像(图像序列)?“调用normalize时,它将增加到大约4GB。“--您确实告诉它将结果存储在第二个变量中…”
imshow
使用内部缓冲区以图像可以呈现的格式存储图像。这也是一个基本的便利功能。如果你需要一个更智能的UI,你最有可能需要自己编写。@ Ali,它是一个简单的图像,它是由一个并列的多个图像组成的。你可以考虑看<代码> LBVIPS和DeXZOM,因为你的.TIF文件是2GB,我想知道你的.TIF图像是一个单一的图像还是包含多个图像(图像序列)?“调用normalize时,它将增加到大约4GB。“--您确实告诉它将结果存储在第二个变量中…”
imshow
使用内部缓冲区以图像可以呈现的格式存储图像。这也是一个基本的便利功能。如果你需要一个更智能的UI,你最有可能需要自己编写。@ Ali,它是一个简单的图像,它是通过并列地粘贴几个图像来构建的。你可以考虑查看<代码> LIVIPS和DeepZoom。