2012-05-01 16 views
10

का उपयोग कर 12-बिट बेयर छवि को 8-बिट आरजीबी में कनवर्ट करें मैं 12-बिट बेयर छवि को 8-बिट आरजीबी छवि में बदलने के लिए ओपनसीवी 2.3.1 का उपयोग करने की कोशिश कर रहा हूं। इस तरह यह cvCvtColor फ़ंक्शन का उपयोग काफी सरल होना चाहिए लगता है, लेकिन समारोह एक अपवाद जब मैं इस कोड से कॉल करने की फेंकता है:ओपनसीवी

int cvType = CV_MAKETYPE(CV_16U, 1); 
cv::Mat bayerSource(height, width, cvType, sourceBuffer); 
cv::Mat rgbDest(height, width, CV_8UC3); 
cvCvtColor(&bayerSource, &rgbDest, CV_BayerBG2RGB); 

मैंने सोचा था कि मैं sourceBuffer के अंत अतीत चल रहा था, इनपुट डेटा के बाद से 12-बिट है, और मुझे 16-बिट प्रकार में गुजरना पड़ा क्योंकि ओपनसीवी में 12-बिट प्रकार नहीं है। तो मैंने चौड़ाई और ऊंचाई को 2 से विभाजित किया, लेकिन सीवीसीवीटीकॉलर ने अभी भी एक अपवाद फेंक दिया जिसमें इसमें कोई उपयोगी जानकारी नहीं थी (त्रुटि संदेश "अज्ञात अपवाद" था)।

कुछ महीने पहले पोस्ट किया गया similar question था जिसका उत्तर कभी नहीं दिया गया था, लेकिन चूंकि मेरा प्रश्न 12-बिट बेयर डेटा के साथ अधिक विशेष रूप से संबंधित है, मैंने सोचा कि यह एक नए प्रश्न की योग्यता के लिए पर्याप्त रूप से अलग था।

अग्रिम धन्यवाद।

संपादित: मैं, कुछ कमी किया जाना चाहिए, क्योंकि मैं भी 8 बिट डेटा पर काम करने के cvCvtColor समारोह नहीं मिल सकता है:

cv::Mat srcMat(100, 100, CV_8UC3); 
const cv::Scalar val(255,0,0); 
srcMat.setTo(val); 
cv::Mat destMat(100, 100, CV_8UC3); 
cvCvtColor(&srcMat, &destMat, CV_RGB2BGR); 
+2

तो यह पता चला है कि मैं * था * कुछ कमी:

संशोधित Gillfish के कोड (कैमरा संभालने 16bit बायर एन्कोडिंग में छवि देता है)। मेरे सहयोगी ने बताया कि मैं सी और सी ++ कॉल मिश्रण कर रहा था। सीवी :: सीवीटीकॉलर (srcMat, destMat, CV_RGB2BGR) पर अंतिम पंक्ति को बदलना; सबकुछ एक आकर्षण की तरह काम करता है। मैं अभी भी 16-बिट बेयर डेटा को 8-बिट आरजीबी डेटा में परिवर्तित करने की मूल समस्या पर काम कर रहा हूं, इसलिए यदि मुझे इसका उत्तर मिल जाए तो मैं एक अपडेट पोस्ट करूंगा। – Gillfish

+2

'cvCvtColor' पुराने सी ओपनसीवी एपीआई से संबंधित है, लेकिन 'सीवी :: मैट' सी ++ एपीआई से एक वर्ग है। उन्हें मिलाकर एक अच्छा विचार नहीं है और आप एपीआई के केवल एक संस्करण का बेहतर उपयोग करेंगे। 'सीवी :: सीवीटीकॉलर (srcMat, dstMat, COLOR_RGB2BGR) 'आपके लिए काम करना चाहिए। –

+0

"ग्रीन फ़िल्टर लुक" शायद इसका मतलब है कि आपने गलत बेयर पैटर्न निर्दिष्ट किया है। उन सभी को आजमाएं। – user3443369

उत्तर

3

गिल्फ़िश का जवाब तकनीकी रूप से काम करता है लेकिन रूपांतरण के दौरान यह इनपुट की तुलना में छोटी डेटा संरचना (सीवी_8 यूसी 1) का उपयोग करता है (जो सीवी_16 यूसी 1 है) और कुछ रंगीन जानकारी खो देता है।

मैं पहले बेयर एन्कोडिंग को डीकोड करने का सुझाव दूंगा लेकिन प्रति चैनल 16-बिट्स में रहूंगा (सीवी_16 यूसी 1 से सीवी_16 यूसी 3 तक) और बाद में सीवी_8 यूसी 3 में परिवर्तित करें।

// Copy the data into an OpenCV Mat structure 
cv::Mat mat16uc1_bayer(height, width, CV_16UC1, inputBuffer); 

// Decode the Bayer data to RGB but keep using 16 bits per channel 
cv::Mat mat16uc3_rgb(width, height, CV_16UC3); 
cv::cvtColor(mat16uc1_bayer, mat16uc3_rgb, cv::COLOR_BayerGR2RGB); 

// Convert the 16-bit per channel RGB image to 8-bit per channel 
cv::Mat mat8uc3_rgb(width, height, CV_8UC3); 
mat16uc3_rgb.convertTo(mat8uc3_rgb, CV_8UC3, 1.0/256); //this could be perhaps done more effectively by cropping bits 
14

मैं अपने डेटा को परिवर्तित करने में सक्षम था 8 बिट निम्नलिखित कोड का उपयोग कर आरजीबी:

// Copy the data into an OpenCV Mat structure 
cv::Mat bayer16BitMat(height, width, CV_16UC1, inputBuffer); 

// Convert the Bayer data from 16-bit to to 8-bit 
cv::Mat bayer8BitMat = bayer16BitMat.clone(); 
// The 3rd parameter here scales the data by 1/16 so that it fits in 8 bits. 
// Without it, convertTo() just seems to chop off the high order bits. 
bayer8BitMat.convertTo(bayer8BitMat, CV_8UC1, 0.0625); 

// Convert the Bayer data to 8-bit RGB 
cv::Mat rgb8BitMat(height, width, CV_8UC3); 
cv::cvtColor(bayer8Bit, rgb8BitMat, CV_BayerGR2RGB); 

मैं गलती से मान लिया था कि 12 बिट डेटा मैं कैमरे से हो रही थी कसकर पैक किया गया था, ताकि दो 12 बिट मूल्यों 3 बाइट्स में निहित थे। यह पता चला है कि प्रत्येक मान 2 बाइट्स में निहित था, इसलिए मुझे ओपनसीवी द्वारा समर्थित 16-बिट सरणी में अपना डेटा प्राप्त करने के लिए कोई अनपॅकिंग करने की आवश्यकता नहीं थी।

संपादित करें: रूपांतरण के दौरान किसी भी रंग की जानकारी खोने से बचने के लिए 8-बिट्स में कनवर्ट करने से पहले @ पेटी का बेहतर उत्तर देखें जो आरजीबी में परिवर्तित हो जाता है।

+0

मैं यहां जैसा ही कर रहा हूं लेकिन मेरी छवियों में छवि के एक हरे रंग के फ़िल्टर की प्रतीत होती है। सुनिश्चित नहीं है कि –

+0

@pksorensen: यदि आपके पास कोई संबंधित समस्या है, तो बस इसे एक नए प्रश्न में पूछें और इसे वापस लिंक करें। इस तरह आप अपनी विशेष समस्या के बारे में अधिक जानकारी जोड़ सकते हैं। – Gillfish

+0

मैंने डी-बेयर करने के लिए एक अलग रास्ता लेने और निकोन एसडीके का उपयोग करके समाप्त कर दिया क्योंकि मुझे कुछ मुद्दों का सामना करना पड़ा जो इसे libraw और opencv के साथ करने का प्रयास कर रहा था। निकोन का उपयोग करके एसडीके ने मुझे बेहतर परिणाम दिए और यह पता लगाया कि क्यों नतीजों को libraw और opencv के साथ प्राप्त नहीं किया जा सकता है। फिर भी धन्यवाद। –