26

jpeg 画像のデータをunsigned char*含むバッファーがあります。c++ と opencv を使用してその画像を表示したいと思います。私が行った場合:

Mat img(Size(640, 480), CV_8UC3, data);
namedWindow("image", 1);
imShow("image", img);

ノイズの多いピクセルの混乱が発生します。

データがjpeg(ヘッダあり)だからだと思います。これが機能するため:

Mat imgbuf(Size(640, 480), CV_8UC3, data);
Mat img = imdecode(imgbuf, CV_LOAD_IMAGE_COLOR);

しかし、GTK 2 に基づく highgui.h の imdecode 関数をそのまま使用することはできず、私のプロジェクトでは GTK 3 を使用しています。

では、バッファ データを表示するにはどうすればよいでしょうか。それが問題である場合、opencv で imdecode 以外の jpeg 画像をデコードする方法はありますか。Qtでopencvを再構築する必要はありません...

他の提案はありますか?

(Linux を使用)

4

2 に答える 2

54

この質問に対して、libjpeg を直接呼び出して OpenCV の imread() ルーチンをバイパスする必要があるという回答がネット上で多く見られます。

これは必要ありません。imdecode() を使用して、生の画像バッファをメモリからデコードできます。それを行う方法は直感的ではなく、初めてこれを行おうとする人々を支援するのに十分な文書がありません.

生のファイル データ (.jpg、.png、.tif、ファイルなどから直接 fread()) のポインター/サイズがある場合...

int    nSize = ...       // Size of buffer
uchar* pcBuffer = ...    // Raw buffer data


// Create a Size(1, nSize) Mat object of 8-bit, single-byte elements
Mat rawData( 1, nSize, CV_8UC1, (void*)pcBuffer );

Mat decodedImage  =  imdecode( rawData /*, flags */ );
if ( decodedImage.data == NULL )   
{
    // Error reading raw image data
}

それでおしまい!

これが将来誰かに役立つことを願っています。

于 2015-07-11T20:51:48.663 に答える
4

「解凍の詳細」の下のlibjpeg APIドキュメントlibjpegに記載されている標準手順を使用して、JPEG画像を解凍しました。

データを解凍した後、それを使用してcv::Mat. 解凍された画像は RGB 形式ですが、openCV は BGR 形式を使用するため、形式を使用したcvtColor()操作CV_RGB2BGRが必要です。

于 2013-02-26T15:21:34.283 に答える