加载openv帧时ogre的loadRawData内存问题
loadRawData Memory issue in ogre while load opencv frames
我正在使用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)
为什么我总是得到这个内存错误?
快速的想法,可能内存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),并从这一点插入数据。
你必须找出在你的缓冲区头结束和你的数据开始的地方。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 加载openv帧时ogre的loadRawData内存问题