加载openv帧时ogre的loadRawData内存问题

loadRawData Memory issue in ogre while load opencv frames

本文关键字:loadRawData 内存 问题 ogre openv 帧时 加载      更新时间:2023-10-16

我正在使用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)

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

快速的想法,可能内存4字节对齐问题?

参见链接1和链接2

我不是一个食人魔专家,但它是否工作,如果你使用loadddynamicimage代替?

EDIT:只是为了咧嘴笑,尝试使用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稍后删除它的内容。

我在将图像数据输入OGRE时遇到了类似的问题,在我的情况下,数据来自ROS(参见ros.org)。问题是,你的数据在帧->缓冲区不是RAW,但有一个文件头等。我认为我的解决方案是在数据流中搜索图像的开头(通过在数据块中找到适当的指示器,例如0x4D 0x00),并从这一点插入数据。

你必须找出在你的缓冲区头结束和你的数据开始的地方。