1

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

我正在尝试使用MemoryDataStreamwithloadRawData将图像加载到 OGRE 窗口中,但出现以下错误:

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

图像来自 OpenCV,大小为 640x480,frame->buffer属于MatOpenCV 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)

为什么我总是得到这个内存错误?

4

3 回答 3

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稍后删除它的内容。

于 2011-12-14T04:48:15.710 回答
1

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

链接 1链接 2

于 2011-12-13T23:42:44.087 回答
0

我在将图像数据导入 OGRE 时遇到了类似的问题,在我的情况下,数据来自 ROS(参见 ros.org)。问题是您在 frame->buffer 中的数据不是 RAW,而是具有文件头等。我认为我的解决方案是在数据流中搜索图像的开头(通过在数据块中找到适当的指示符,例如0x4D 0x00),并从此时开始插入数据。

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

于 2014-04-24T14:47:46.600 回答