2011-12-13 2 views
1

Je capture des images en temps réel à l'aide d'OpenCV et je souhaite afficher ces images dans la fenêtre OGRE en arrière-plan. Ainsi, pour chaque image, l'arrière-plan change.loadRawData Problème de mémoire dans ogre lors du chargement des trames opencv

Je suis en train d'utiliser MemoryDataStream avec loadRawData pour charger les images dans une fenêtre de OGRE, mais je reçois l'erreur suivante:

OGRE EXCEPTION(2:InvalidParametersException): Stream size does not match calculated image size in Image::loadRawData at ../../../../../OgreMain/src/OgreImage.cpp (line 283)

Une image vient de OpenCV avec une taille de 640x480 et frame->buffer est un type de Mat dans OpenCV 2.3. En outre, le format de pixel que j'ai utilisé dans OpenCV est CV_8UC3 (c'est-à-dire que chaque pixel est de 8 bits et chaque pixel contient 3 canaux (B8G8R8)).

Ogre::MemoryDataStream* videoStream = new Ogre::MemoryDataStream((void*)frame->buffer.data, 640*480*3, true); 
Ogre::DataStreamPtr ptr(videoStream,Ogre::SPFM_DELETE); 
ptr->seek(0); 
Ogre::Image* image = new Ogre::Image(); 
image->loadRawData(ptr,640, 480,Ogre::PF_B8G8R8); 
texture->unload(); 
texture->loadImage(*image) 

Pourquoi je reçois toujours cette erreur de mémoire?

Répondre

1

Une idée rapide, peut-être des problèmes d'alignement de mémoire de 4 octets?

voir Link 1 et Link 2

+0

J'ai essayé l'alignement de 4 octets mais rien n'a changé. Je reçois toujours un même problème de mémoire – barzos

1

Je ne suis pas un expert Ogre, mais ça marche si vous utilisez à la place loadDynamicImage?

EDIT: Juste pour essayer d'utiliser les grimaces Mat champs pour configurer le tampon:

Ogre::Image* image = new Ogre::Image(); 
image->loadDynamicImage((uchar*)frame->buffer.data, frame->buffer.cols, frame->buffer.rows, frame->buffer.channels(), Ogre::PF_B8G8R8); 

Cela évitera la copie des données d'image, et devraient laisser le Mat supprimer son contenu plus tard.

+0

Ça ne marche pas, j'essaie. Mon problème est plus sur une inégalité entre la taille de l'image et la taille de la mémoire tampon – barzos

+0

Et, vous êtes sûr que la taille de l'image est 640x480x3? – mevatron

+0

oui je suis sûr à ce sujet – barzos

0

J'ai eu des problèmes similaires pour obtenir des données d'image dans OGRE, dans mon cas, les données proviennent de ROS (voir ros.org). La chose est que vos données dans frame-> buffer ne sont pas RAW, mais ont un en-tête de fichier, etc Je pense que ma solution était de rechercher le flux de données pour le début de l'image (en trouvant l'indicateur approprié dans le bloc de données, par exemple 0x4D 0x00), et en insérant les données à partir de ce point.

Vous auriez dû savoir si votre tampon se terminait par l'en-tête et où vos données commençaient.

Questions connexes