【问题标题】:loadRawData Memory issue in ogre while load opencv frames加载opencv帧时,Ogre中的loadRawData内存问题
【发布时间】:2011-12-13 14:10:57
【问题描述】:

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

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

OGRE EXCEPTION(2:InvalidParametersException):流大小不 匹配 Image::loadRawData 中计算的图像大小 ../../../../../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)

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

【问题讨论】:

    标签: c++ opencv ogre3d ogre


    【解决方案1】:

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

    Link 1Link 2

    【讨论】:

    • 我尝试了 4 字节对齐,但没有任何改变。我总是遇到同样的内存问题
    【解决方案2】:

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

    【讨论】:

    • 不行,我试试。我的问题更多是关于图像大小和缓冲区大小之间的不平等
    • 而且,您确定帧大小是 640x480x3?
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-05
      • 2011-01-25
      • 1970-01-01
      • 2019-11-02
      • 2019-08-26
      • 1970-01-01
      • 1970-01-01
      • 2017-09-10
      相关资源
      最近更新 更多