loadRawData加载opencv帧时在食人魔中的内存问题

时间:2011-12-13 14:10:57

标签: c++ opencv ogre3d ogre

我正在使用OpenCV实时捕捉图像,我想在OGRE窗口中将这些图像显示为背景。因此,对于每一帧,背景都会改变。

我正在尝试使用MemoryDataStreamloadRawData将图片加载到OGRE窗口中,但是我收到以下错误:

  

OGRE EXCEPTION(2:InvalidParametersException):流大小没有   匹配Image :: loadRawData at中的计算图像大小   ../../../../../OgreMain/src/OgreImage.cpp(第283行)

图片来自OpenCV,大小为640x480,而frame->buffer是OpenCV 2.3中的Mat类型。另外,我在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 个答案:

答案 0 :(得分:1)

快速的想法,也许是内存4字节对齐问题?

请参阅Link 1Link 2

答案 1 :(得分:1)

我不是食人魔专家,但如果你改用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稍后删除它的内容。

答案 2 :(得分:0)

我有类似的问题将图像数据输入OGRE,在我的例子中,数据来自ROS(参见ros.org)。问题是你的frame->缓冲区中的数据不是RAW,而是有文件头等。 我认为我的解决方案是在数据流中搜索图像的开头(通过在数据块中找到适当的指示符,例如0x4D 0x00),然后从此处插入数据。

您必须找到缓冲区中的标题结束以及数据开始的位置。