問題來由
最近有人問一個問題,就是它有個大小800MB的圖像文件,發(fā)現(xiàn)無法通過OpenCV的imread函數(shù)加載,只要一讀取,程序就直接崩潰了。我問了圖像的大小,計算像素數(shù)量之后發(fā)現(xiàn)總像素數(shù)目已經(jīng)超過了OpenCV聲明最大像素數(shù)目限制,所以肯定無法讀取了!
大家都知道OpenCV中讀取圖像的函數(shù)是imread,函數(shù)功能如下:
?
Mat cv::imread( const String & filename, int flags = IMREAD_COLOR)
?
參數(shù)解釋
filename 表示輸入圖像的文件路徑
flags 表示加載圖像的方式
支持包括bmp、jpg、png、webp、pfm、sr、ras、tiff、hdr等格式圖像文件
之前寫過一篇imread的各種讀圖像技巧跟方式,鏈接如下:
OpenCV中各種類型Mat數(shù)據(jù)讀取
OpenCV中高效的像素遍歷方法,寫出工程級像素遍歷代碼
加載超大圖像限制與突破
加載超大圖像遇到的最常見的一個錯誤就是
提示電腦內(nèi)存不夠了,但是很多時候電腦內(nèi)存是足夠,但是還是無法加載,原因很簡單,主要是OpenCV本身對加載的圖像大小是由限制的,這個限制定義在
modulesimgcodecssrcloadsave.cpp
這個源碼文件中,有三個關(guān)于圖像imread時候最大圖像寬、高、像素數(shù)目大小限制,定義的代碼為:
?
static?const?size_t?CV_IO_MAX_IMAGE_WIDTH?=?utils::getConfigurationParameterSizeT("OPENCV_IO_MAX_IMAGE_WIDTH",?1?<20); static?const?size_t?CV_IO_MAX_IMAGE_HEIGHT?=?utils::getConfigurationParameterSizeT("OPENCV_IO_MAX_IMAGE_HEIGHT",?1?<20); static?const?size_t?CV_IO_MAX_IMAGE_PIXELS?=?utils::getConfigurationParameterSizeT("OPENCV_IO_MAX_IMAGE_PIXELS",?1?<30);
?
解釋如下:
支持的最大圖像寬度 2^20
支持的最大圖像高度2^20
支持的最大像素數(shù)目2^30
函數(shù)validateInputImageSize會首先校驗圖像的大小,
?
static?Size?validateInputImageSize(const?Size&?size) { ????CV_Assert(size.width?>?0); ????CV_Assert(static_cast(size.width)?<=?CV_IO_MAX_IMAGE_WIDTH); ????CV_Assert(size.height?>?0); ????CV_Assert(static_cast (size.height)?<=?CV_IO_MAX_IMAGE_HEIGHT); ????uint64?pixels?=?(uint64)size.width?*?(uint64)size.height; ????CV_Assert(pixels?<=?CV_IO_MAX_IMAGE_PIXELS); ????return?size; }
?
修改限制
想要加載超過這些限制的圖像文件,首先要確保你由足夠的內(nèi)存,然后手動修改OpenCV源碼文件,把限制改到你想要的值,然后重新編譯OpenCV即可?! ?/p>
評論