2013-02-06 18 views
11

से जेपीईजी छवि पढ़ें, मेरे पास unsigned char* बफर है जिसमें एक जेपीईजी छवि का डेटा है। मैं उस छवि को C++ और opencv का उपयोग करके प्रदर्शित करना चाहता हूं। अगर मैं करता हूं:opencv बफर

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

मुझे पिक्सल का शोर गड़बड़ मिलता है।

मुझे लगता है कि यह इसलिए है क्योंकि डेटा जेपीईजी (हेडर के साथ) है। क्योंकि यह काम करता है:

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

लेकिन मैं imdecode समारोह का उपयोग नहीं कर सकते हैं के रूप में यह highgui.h जो जीटीके 2 पर आधारित है से है, और अपने प्रोजेक्ट में मैं जीटीके का उपयोग 3.

तो, मैं कैसे कर सकते हैं बफर डेटा प्रदर्शित करें? ओपनसीवी में आईएमडीकोड के अलावा जेपीईजी छवि को डीकोड करने का कोई तरीका है, अगर यह समस्या है। मैं वास्तव में Qt के साथ opencv को पुनर्निर्माण नहीं करना चाहता ...

कोई अन्य सुझाव?

(लिनक्स का उपयोग करना)

+2

आप डिकोडिंग के लिए libjpeg' उपयोग कर सकते हैं नहीं 'और इसके साथ किया जा सकता है? क्या उस के साथ समस्या है? – mmgp

+0

@mmgp मैं libjpeg की कोशिश करेंगे, सिर्फ मैं कर सकता सोचा एक और लाइब्रेरी समेत एक ही चीज़। – Matekk

+1

ओपनसीवी जेपीईजी छवि लोड नहीं करेगा अगर आप करते हैं 'libjpeg' नहीं है, इसलिए कोई अन्य लाइब्रेरी शामिल नहीं है। – mmgp

उत्तर

4

मैं मानक प्रक्रिया 'विसंपीड़न विवरण' के तहत libjpeg API documentation में वर्णित का उपयोग कर libjpeg का उपयोग कर छवि decompressed है।

डेटा को डिकंप्रेस करने के बाद आप इसे cv::Mat बनाने के लिए उपयोग कर सकते हैं। आपको याद है, डिकंप्रेस्ड छवि आरजीबी प्रारूप में है, जबकि ओपनसीवी बीजीआर प्रारूप का उपयोग करता है, इसलिए cvtColor() प्रारूप CV_RGB2BGR प्रारूप के साथ ऑपरेशन की आवश्यकता है।

27

मैंने नेट पर इस सवाल के बारे में कई प्रतिक्रियाएं देखी हैं कि आपको सीधे libjpeg को कॉल करना चाहिए और ओपनसीवी के इमेड() दिनचर्या को बाईपास करना चाहिए।

यह आवश्यक नहीं है! आप स्मृति से कच्चे छवि बफर को डीकोड करने के लिए 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

इससे किसी की मदद मिली। ध्यान दें कि आपने 'nsize' के बजाय 'आकार' का उपयोग किया था, और आप सीधे निर्माता से कच्चे डेटा को प्रारंभ कर सकते थे। –