2013-02-06 138 views
11

我有一個unsigned char*緩衝區,其中包含一個jpeg圖像的數據。我想用C++和opencv顯示那個圖像。如果我這樣做:opencv從緩衝區中讀取jpeg圖像

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)

+2

你不能用'libjpeg'用於解碼,並用它做什麼的問題,那是什麼? – mmgp

+0

@mmgp我會努力的libjpeg,只是覺得我可以做同樣的事情,不包括另一個庫。 – Matekk

+1

如果你這樣做,opencv將不會加載jpeg圖像沒有'libjpeg',所以沒有包含其他庫。 – mmgp

回答

4

我已解壓縮的使用下「減壓細節」在libjpeg API documentation描述的標準方法,用libjpeg JPEG圖像。

解壓縮數據後,您可以使用它來構建cv::Mat。請注意,解壓縮後的圖像採用RGB格式,而openCV採用BGR格式,因此需要格式爲CV_RGB2BGRcvtColor()操作。

27

我在網上看到很多關於這個問題的回答,說你應該直接調用libjpeg並繞過OpenCV的imread()例程。

這不是必須的!您可以使用imdecode()從內存中解碼原始圖像緩衝區。實現這一目標的方式不直觀,並且沒有足夠的文檔來幫助人們嘗試第一次這樣做。

如果你有你的原始文件的數據的指針/尺寸(FREAD(直接)從爲.jpg,.png的.tif,文件等...

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 
} 

這就是它!

希望這可以幫助別人的未來。

+0

它確實幫助了某人。請注意,您使用'size'而不是'nsize',並且您可以直接從構造函數初始化rawData。 –