Salut,
Merci pour les pistes! Pour l'instant je pense que je peux stocker mes données dans un tableau 16 bits. En réalité je n'ai pas forcément besoin de charger beaucoup de frames à la fois, si jamais je déborde trop sur la RAM je pourrai surement me débrouiller. Mais je garde les idées dans un coin au cas où ça pourrait devenir utile. D'ailleurs là j'essaye de codre quelque chose pour lire entièrement le fichier binaire mais c'est juste pour commencer, à terme j'aimerais rendre ça plus flexible en pouvant sélectionner un range de frames, et éventuellement en passer (par exemple ne lire qu'une frame sur trois).
Quand je parlais de mémoire je pensais surtout à la mémoire dure, ce qui est stockée. J'ai quelques très grosses vidéos (jusqu'à 64go max ... mais c'est marginal), la majorité sont de tailles beaucoup plus raisonnables (de quelques mo à quelques go), Mais vu que j'ai vraiment beaucoup de données c'est appréciable d'essayer de gagner de la place en les sauvegardant toutes en 12 bits au lieu de 16. Pour ce qui est du traitement c'est assez basique en fait, je pense. Principalement de la détection de contours par thresholding sur l'image de base, et/ou en utilisant le gradient et/ou des choses à base de transformée de Hough, transformée de Fourier, ... Je fais aussi pas mal de divisions et soustractions entre les images. Je m'en sors pas trop mal avec Matlab, mais le peu que j'ai joué avec j'ai l'impression que Python permet d'avoir des codes plus rapides, et pourrait me simplifier un peu la vie pour certaines choses au niveau de la programmation (plus de possibilités, plus flexible, etc...). Je pense que Python est assez adapté pour ce que je veux faire, peut-être que ça pourrait aller un poil plus vite en C (?) mais là ça devient un peu trop bas niveau pour moi et les gens avec qui je travaille, et pour faire du prototypage rapide c'est peut-être pas l'idéal (ce qu'on fait majoritairement)
Mon problème est que quand je code moi-même la lecture d'un fichier binaire 12 bits (dans une structure 16 bits), c'est vraiment très lent... Quand en utilisant memmap sur un fichier 16 bits je charge une vidéo 640*256 pixels, 150 frames, en 0.1 ms ; je charge 5 frames de la même vidéo mais cette fois-ci sauvegardée en 12 bits et avec mon propre code en ... plus de 10s.
Ce que je fais:
- j'ouvre le fichier binaire et stocke les données
- je lis 3 bytes par 3 bytes (3 bytes = 24 bits, donc correspondent à 24/12=2 pixels)
En code ça donne (j'espère que les noms des variables non définies sont assez explciites)
with open(filename_video, 'rb') as f:
data=f.read()
images=np.zeros(int(2*len(data)/3),dtype=np.uint16)
ii=0
for jj in range(0,int(len(data))-2,3):
a=bitstring.Bits(bytes=data[jj:jj+3],length=24) #3 bytes
images[ii],images[ii+1] = a.unpack('uint:12,uint:12')
ii=ii+2
images = np.reshape(images,(nb_frames,height,width))
Encore une fois je m'y connais pas trop en Python ni en lecture de fichiers binaires, ni en algorithmique de manière générale d'ailleurs, mais vu que ça donne quelque chose de 10^6 fois moins rapide que ce à quoi je pourrais m'attendre je pense que ça peut être un poil optimisé. Par contre je ne vois pas trop comment.... (si ça peut aider je peux fournir un exemple de fichier vidéo)