L'attuazione del imread()
:
Mat imread(const string& filename, int flags)
{
Mat img;
imread_(filename, flags, LOAD_MAT, &img);
return img;
}
Questo alloca la matrice corrispondente per caricare un'immagine come array contiguo. Quindi questo dipende (almeno in parte) dalle prestazioni dell'hardware: la macchina deve essere in grado di allocare un array di RAM contiguo da 4 GB (se si utilizza una distribuzione Debian, è possibile controllare la dimensione della RAM eseguendo, ad esempio, vmstat -s -SM
).
dalla curiosità, ho cercato di ottenere un array contiguo di memoria (uno grande, ma meno di quello dell'immagine 4 GB richiede) utilizzando ascontiguousarray
, ma prima di questo, ho già imbattuti in un problema di allocazione di memoria:
>>> img = numpy.zeros(shape=(35000,35000))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
>>>
in pratica, anche se avete abbastanza RAM, non è una buona idea di manipolare i pixel di immagine RAM a 4 GB e sarà necessario dividerlo in ogni caso in termini di regions of interests, aree più piccole e può essere channels troppo, a seconda del na delle operazioni che si desidera eseguire sui pixel.
EDIT 1:
Come ho detto nel mio commento qui sotto la tua risposta, se si dispone di 16 GB di RAM e siete in grado di leggere l'immagine con scikit allora non c'è ragione per cui non si può fare la lo stesso con OpenCV.
Si prega di dare una prova:
import numpy as np # Do not forget to import numpy
import cv2
img = cv2.imread('ortho.tif')
Hai dimenticato di importare Numpy nel codice originale e questo è il motivo per cui non è riuscito OpenCV, ovviamente, per caricare l'immagine. Tutte le strutture dell'array OpenCV sono convertite in e dagli array Numpy e l'immagine che leggi sono rappresentate da OpenCV come array nella memoria.
EDIT 2:
OpenCV può trattare imaes quale formato è fino a 10 GB.Ma questo è vero quando arriva la funzione cv2.imwrite()
. Per cv2.imread()
, tuttavia, la dimensione dell'immagine da leggere è molto più piccola: si tratta di un bug annunciato a settembre 2013 (Issue3258 #1438) che è ancora, AFAIK, non risolto.
Che cosa dice il messaggio di errore? – Hexaholic
Per matplotlib plt.imshow (self.image [:,:, :: - 1]) TypeError: oggetto 'NoneType' non ha alcun attributo '\ _ \ _ getitem \ _ \ _' OpenCV sais: Errore OpenCV: asserzione non riuscita (size.width> 0 && size.height> 0) in cv :: imshow, file .. \ .. \ .. \ modules \ highgui \ src \ window.cpp, riga 261 cv2.imshow ('image', self.image) cv2.error: .. \ .. \ .. \ modules \ highgui \ src \ window.cpp: 261: errore: (-215) size.width> 0 && size.height > 0 in function cv :: imshow Essenzialmente, l'immagine ha dimensione 0 x 0 pixel. – cLupus
... e sei sicuro che questa roba (e quando dico questa roba intendo OpenCV e Python) sia stata compilata per 64 bit? – carlosdc