1

OpenCV を使用してリアルタイムで画像をキャプチャしており、これらの画像を背景として OGRE ウィンドウに表示したいと考えています。そのため、フレームごとに背景が変わります。

MemoryDataStreamとともに使用して画像を OGRE ウィンドウにロードしようとしてloadRawDataいますが、次のエラーが発生します。

OGRE EXCEPTION(2:InvalidParametersException): ストリーム サイズが、../../../../../OgreMain/src/OgreImage.cpp の Image::loadRawData で計算された画像サイズと一致しません (283 行目)

画像は、サイズが 640x480 の OpenCV から取得され、OpenCV 2.3frame->bufferの一種です。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

3 に答える 3

1

簡単なアイデア、おそらくメモリの4バイトアライメントの問題?

リンク1および リンク2を参照してください

于 2011-12-13T23:42:44.087 に答える
1

私は Ogre の専門家ではありませんが、代わりに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後でその内容を削除できるようになります。

于 2011-12-14T04:48:15.710 に答える
0

画像データを OGRE に取り込む際にも同様の問題がありました。私の場合、データは ROS からのものでした (ros.org を参照)。問題は、frame->buffer のデータが RAW ではなく、ファイル ヘッダーなどを持っていることです。私の解決策は、データ ストリームで画像の先頭を検索することだったと思います (データ ブロックで適切なインジケーターを見つけることにより、たとえば、 0x4D 0x00)、およびこの時点からデータを挿入します。

バッファ内にヘッダーが終わり、データがどこから始まるかを調べる必要があります。

于 2014-04-24T14:47:46.600 に答える