問題來由
最近有人問一個(gè)問題,就是它有個(gè)大小800MB的圖像文件,發(fā)現(xiàn)無法通過OpenCV的imread函數(shù)加載,只要一讀取,程序就直接崩潰了。我問了圖像的大小,計(jì)算像素?cái)?shù)量之后發(fā)現(xiàn)總像素?cái)?shù)目已經(jīng)超過了OpenCV聲明最大像素?cái)?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中高效的像素遍歷方法,寫出工程級(jí)像素遍歷代碼
加載超大圖像限制與突破
加載超大圖像遇到的最常見的一個(gè)錯(cuò)誤就是

提示電腦內(nèi)存不夠了,但是很多時(shí)候電腦內(nèi)存是足夠,但是還是無法加載,原因很簡(jiǎn)單,主要是OpenCV本身對(duì)加載的圖像大小是由限制的,這個(gè)限制定義在
modulesimgcodecssrcloadsave.cpp
這個(gè)源碼文件中,有三個(gè)關(guān)于圖像imread時(shí)候最大圖像寬、高、像素?cái)?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
支持的最大像素?cái)?shù)目2^30
函數(shù)validateInputImageSize會(huì)首先校驗(yàn)圖像的大小,
?
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)存,然后手動(dòng)修改OpenCV源碼文件,把限制改到你想要的值,然后重新編譯OpenCV即可?! ?/p>
電子發(fā)燒友App









評(píng)論