2016-03-14 43 views
1

我有一些非常大GeoTiff馬賽克(50,000 x 50,000細胞與多達4個樂隊)。對這些圖像使用imread時,OpenCV返回None,但成功讀取較小的圖像(2,880 x 3,840)。由於imread適用於相同大型馬賽克的裁剪版本,因此圖像尺寸似乎是個問題,而不是圖像本身。我有兩個問題:什麼是OpenCV中可以讀取的最大圖像?

  • imread可以處理的最大圖像是什麼?

  • is there a way to read a subset/ROI of an image in OpenCV (similar to band.ReadAsArray(xoff, yoff, xcount, ycount) in GDAL?

回答

3

最大尺寸受最大值size_t限制。你可以看到的是OpenCV的功能setSize,所述尺寸取決於:

  • 元件尺寸:基礎類型乘以信道的數量的大小。例如。一個Mat4b(或類型CV_8UC4Mat)是8*4 = 32

  • 數量的元件的:在矩陣元素的數目。對於二維矩陣來說簡直就是rows * cols

對於32位版本,則矩陣的總大小:sizeof(type) * channels * rows * cols應小於2^32 = 4294967296

在你的情況下,假設有4個通道的uchar矩陣,其大小將爲:8 * 4 * 50000 * 50000 = 80000000000 > 4294967296,這太大了。

您可以使用64位版本生成更大的圖像。


不,OpenCV不提供從磁盤只讀取圖像ROI的功能。你需要依靠其他庫來做到這一點。

+0

感謝您從哪裏開始尋找的建議。坦率地說,我認爲我始終在使用64位庫。由於我使用Anaconda在5個不同的平臺上建立了一致的工具鏈,因此我幾乎無法控制所提供的軟件包。我將更深入地瞭解32/64位狀態。 – EBo

+0

我能夠使用「img = bnd.ReadAsArray(1024,2048,1024,1024)」來讀取圖像,但我認爲可能有一種方法可以從OpenCV中完成,並保持代碼更清晰。感謝您確認OpenCV中沒有ROI功能。 – EBo

+0

很高興幫助。我不完全確定64位的東西,因爲我只有32位構建。但看着代碼,我認爲它會以這種方式工作。如果我的答案不完全正確,請讓我知道。 – Miki

相關問題