Bonjour,

Je travail actuellement sur un projet en python 3.1 et opencv 1.1 (library ctypes_opencv). Etant débutant sur opencv, mon problème est le suivant : je souhaite stocker une image opencv dans une mémoire partagée pour que plusieurs processus puissent avoir accès à cette image.

J'utilise le module mmap de python pour pouvoir gérer la mémoire partagée et j'enregistre chaque pixel de l'image dans le mmap.

Voici mon code de test (écrit rapidement) pour l'écriture de l'image dans le mmap :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
import mmap
import struct
 
from ctypes_opencv.cv import *
from ctypes_opencv.highgui import *
 
mem = mmap.mmap(-1, 9000000, tagname="sharedMem" , access=mmap.ACCESS_WRITE)
 
image = cvLoadImage("lena.jpg",0);
 
 
 
largeur = image.width
hauteur = image.height
 
# Write in the mmap
i=0
mem.seek(0)
while i<hauteur:
    j=0
    while j<largeur:
 
        pixel = struct.pack('i',image[i,j])       
        mem.write(pixel)       
        mem.seek(mem.tell()+4)
 
        j+=1
    i+=1
Et le code test de la lecture de l'image :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
import mmap
import struct
 
from ctypes_opencv.cv import *
from ctypes_opencv.highgui import *
 
result = cvCreateImage( cvSize(image.width,image.height), 8, 1 )
mem = mmap.mmap(-1, 9000000, tagname="sharedMem" , access=mmap.ACCESS_WRITE)
 
cvNamedWindow( "result", 1 );
 
i=0
mem.seek(0)
while i<hauteur:
    j=0
    while j<largeur:
        pixel = mem.read(4)
        pixel = struct.unpack('i',pixel)  ;    
        result[i,j] = pixel[0]      ; 
        mem.seek(mem.tell()+4);
        j+=1
 
cvShowImage("result", result);
 
cvWaitKey(0)

Le code marche en utilisant le module mmap, par contre c'est très lent (3 secondes pour l'écriture et 3 autre secondes pour la lecture).

Est-ce qu'il y a un moyen d'optimiser le code, soit au niveau d'opencv (accès au données image), soit au niveau de la mémoire partagée (le module mmap n'est peut-être pas le plus adapté pour faire de la mémoire partagée) pour que ce soit plus rapide (de l'ordre de la ms).

Merci