web-dev-qa-db-ja.com

opencvはバッファからJPEG画像を読み込みます

を持っています unsigned char* JPEG画像のデータを含むバッファ。その画像を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を使用)

23
Matekk

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

データを解凍した後、それを使用して_cv::Mat_を構築できます。ちなみに、openCVはBGR形式を使用しているため、解凍された画像はRGB形式であるため、形式_CV_RGB2BGR_のcvtColor()操作が必要です。

4
Matekk

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
}

それでおしまい!

これが将来の誰かを助けることを願っています。

46
Jeff Reeder