[英]opencv read jpeg image from buffer
我有一個包含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);
但我不能使用imdecode函數,因為它來自highgui.h,它基於GTK 2,在我的項目中我使用GTK 3。
那么,我該如何顯示緩沖區數據呢? 有沒有辦法在opencv中解碼除imdecode之外的jpeg圖像,如果這是問題。 我真的不想用Qt重建opencv ...
還有其他建議嗎?
(使用Linux)
我在網上看到很多關於這個問題的回答說你應該直接調用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
}
而已!
希望這可以幫助將來的某個人。
我使用libjpeg
使用libjpeg API文檔中描述的標准過程解壓縮JPEG圖像,該文檔位於“Decompression details”下。
解壓縮數據后,您可以使用它來構造cv::Mat
。 你要知道,解壓縮的圖像是RGB格式,而OpenCV的使用BGR格式,所以cvtColor()
與格式化操作CV_RGB2BGR
是必要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.