問(wèn)題來(lái)由
最近有人問(wèn)一個(gè)問(wèn)題,就是它有個(gè)大小800MB的圖像文件,發(fā)現(xiàn)無(wú)法通過(guò)OpenCV的imread函數(shù)加載,只要一讀取,程序就直接崩潰了。我問(wèn)了圖像的大小,計(jì)算像素?cái)?shù)量之后發(fā)現(xiàn)總像素?cái)?shù)目已經(jīng)超過(guò)了OpenCV聲明最大像素?cái)?shù)目限制,所以肯定無(wú)法讀取了!
大家都知道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等格式圖像文件
之前寫(xiě)過(guò)一篇imread的各種讀圖像技巧跟方式,鏈接如下:
OpenCV中各種類(lèi)型Mat數(shù)據(jù)讀取
OpenCV中高效的像素遍歷方法,寫(xiě)出工程級(jí)像素遍歷代碼
加載超大圖像限制與突破
加載超大圖像遇到的最常見(jiàn)的一個(gè)錯(cuò)誤就是
提示電腦內(nèi)存不夠了,但是很多時(shí)候電腦內(nèi)存是足夠,但是還是無(wú)法加載,原因很簡(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; }
?
修改限制
想要加載超過(guò)這些限制的圖像文件,首先要確保你由足夠的內(nèi)存,然后手動(dòng)修改OpenCV源碼文件,把限制改到你想要的值,然后重新編譯OpenCV即可?! ?/p>
評(píng)論