loadRawData Ошибка памяти в людях при загрузке кадров opencv - PullRequest
1 голос
/ 13 декабря 2011

Я снимаю изображения в режиме реального времени, используя OpenCV, и хочу показать эти изображения в окне OGRE в качестве фона. Таким образом, для каждого кадра фон будет меняться.

Я пытаюсь использовать MemoryDataStream вместе с loadRawData для загрузки изображений в окно OGRE, но получаю следующую ошибку:

OGRE EXCEPTION (2: InvalidParametersException): размер потока не соответствовать вычисленному размеру изображения в Image :: loadRawData в ../../../../../OgreMain/src/OgreImage.cpp (строка 283)

Изображение получено из OpenCV размером 640x480, а frame->buffer является типом Mat в OpenCV 2.3. Кроме того, формат пикселя, который я использовал в OpenCV, равен CV_8UC3 (то есть каждый пиксель является 8-битным, и каждый пиксель содержит 3 канала (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)

Почему я всегда получаю эту ошибку памяти?

Ответы [ 3 ]

1 голос
/ 14 декабря 2011

Я не эксперт по Ogre, но работает ли он, если вместо этого вы используете loadDynamicImage ?

РЕДАКТИРОВАТЬ: Просто для усмешки попробуйте использовать поля Mat для настройки буфера:

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

Это позволит избежать копирования данных изображения и позволит Mat удалить его содержимое позже.

1 голос
/ 14 декабря 2011

Быстрая идея, может быть, проблемы с 4-байтовым выравниванием в памяти?

см. Ссылка 1 и Ссылка 2

0 голосов
/ 24 апреля 2014

У меня были похожие проблемы с передачей данных изображения в OGRE, в моем случае данные поступили из ROS (см. Ros.org).Дело в том, что ваши данные в frame-> buffer не RAW, но имеют заголовок файла и т. Д. Я думаю, что мое решение было искать поток данных для начала изображения (путем поиска соответствующего индикатора в блоке данных, например,0x4D 0x00) и вставляя данные с этого момента.

Вы должны выяснить, где в вашем буфере заканчивается заголовок и где начинаются ваши данные.

...