2011-12-13 5 views
1

OpenCV를 사용하여 실시간으로 이미지를 캡처하고 있으며 이러한 이미지를 OGRE 창에 배경으로 표시하려고합니다. 따라서 각 프레임마다 배경이 변경됩니다.loadRawData opencv 프레임로드 중 오우거의 메모리 문제

가 나는 괴물 창에 이미지를로드 loadRawData과 함께 MemoryDataStream을 사용하려고하지만 다음과 같은 오류가 무엇입니까 :

OGRE EXCEPTION(2:InvalidParametersException): Stream size does not match calculated image size in Image::loadRawData at ../../../../../OgreMain/src/OgreImage.cpp (line 283)

이미지는 640 × 480 및 frame->buffer는 크기와 OpenCV의에서 온다 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) 

왜 나는 항상이 메모리 오류가 발생합니까?

답변

1

빠른 아이디어, 아마 메모리 4 바이트 정렬 문제?

Link 1와 내가 오우거 전문가가 아니에요 Link 2

+0

4 바이트 정렬을 시도했지만 변경 사항이 없습니다. 나는 항상 같은 기억 문제를 겪는다. – barzos

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가 나중에 내용의 삭제하도록한다.

+0

그것은 나에게 도움이되지 않는다. 내 문제는 이미지 크기와 버퍼 크기 간의 불균형에 관한 것입니다. – barzos

+0

그리고 프레임 크기가 640x480x3인지 확신 할 수 있습니까? – mevatron

+0

예 그 점에 대해 확신합니다. – barzos

0

나는 이미지 데이터를 OGRE로 가져 오는 것과 비슷한 문제가 있었는데, 내 경우에는 데이터가 ROS에서 가져온 것입니다 (ros.org 참조). 문제는 프레임 버퍼의 데이터가 RAW가 아니지만 파일 헤더 등을 가지고 있다는 것입니다. 제 솔루션은 이미지의 시작 부분에 대한 데이터 스트림을 검색하는 것이 었습니다 (데이터 블록에서 적절한 표시기를 찾아서, 예 : 0x4D 0x00)이 시점부터 데이터를 삽입하십시오.

버퍼에서 헤더가 끝나고 데이터가 시작되는 곳을 찾아야합니다.