我正在使用OpenCV实时捕捉图像,我想在OGRE窗口中将这些图像显示为背景。因此,对于每一帧,背景都会改变。
我正在尝试使用MemoryDataStream
和loadRawData
将图片加载到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)
为什么我总是得到这个内存错误?
答案 0 :(得分:1)
答案 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),然后从此处插入数据。
您必须找到缓冲区中的标题结束以及数据开始的位置。