2011-10-31 7 views
8

में वाईयूवी को बीजीआर या आरजीबी में कनवर्ट करना मेरे पास एक टीवी कैप्चर कार्ड है जिसमें एक यूयूवी प्रारूप के रूप में एक फीड आ रही है। मैंने इस प्रश्न के समान अन्य पोस्ट यहां देखी हैं और कहा कि हर संभव विधि का प्रयास करने का प्रयास किया गया है, लेकिन उनमें से कोई भी स्पष्ट छवि प्रदान नहीं करता है। फिलहाल ओपनसीवी cvCvtColor(scr, dst, CV_YUV2BGR) फ़ंक्शन कॉल के साथ सबसे अच्छे परिणाम थे।ओवीसीवी

मैं वर्तमान में वाईयूवी प्रारूप से अनजान हूं और ईमानदार होने के लिए मुझे थोड़ा सा भ्रमित करता है क्योंकि ऐसा लगता है कि यह 4 चैनल स्टोर करता है, लेकिन केवल 3 है? मैंने कैप्चर कार्ड से एक छवि शामिल की है ताकि उम्मीद की जा सके कि कोई यह समझ सके कि संभवतः क्या हो रहा है कि मैं रिक्त स्थान भरने के लिए उपयोग कर सकता हूं।

YUV to BGR converted image

फ़ीड के माध्यम से एक decklink तीव्रता प्रो कार्ड में आ रहा है और एक विंडोज 7 के माहौल में OpenCV का उपयोग करने में एक सी ++ आवेदन में एक्सेस किए जा रहे।

अद्यतन

मैं इस जानकारी के बारे में एक विकिपीडिया लेख को देखा और अपने आवेदन में सूत्र का उपयोग करने का प्रयास किया। नीचे से प्राप्त आउटपुट के साथ कोड ब्लॉक है। किसी भी सलाह की काफी सराहना की जाती है।

BYTE* pData; 

    videoFrame->GetBytes((void**)&pData); 

    m_nFrames++; 

    printf("Num Frames executed: %d\n", m_nFrames); 

    for(int i = 0; i < 1280 * 720 * 3; i=i+3) 
    { 
     m_RGB->imageData[i] = pData[i] + pData[i+2]*((1 - 0.299)/0.615); 
     m_RGB->imageData[i+1] = pData[i] - pData[i+1]*((0.114*(1-0.114))/(0.436*0.587)) - pData[i+2]*((0.299*(1 - 0.299))/(0.615*0.587)); 
     m_RGB->imageData[i+2] = pData[i] + pData[i+1]*((1 - 0.114)/0.436); 
    } 

Attempted RGB conversion

+0

"मैं YUV प्रारूप की वर्तमान में अनजान हूँ" -> विकिपीडिया। इसके बारे में पढ़ें: http://en.wikipedia.org/wiki/YUV#Conversion_to.2Ffrom_RGB – NickLH

+0

उस लेख को जोड़ने के लिए धन्यवाद, लेकिन क्या मुझे लगता है कि मैं ए, यू, वी, और वाई 1 के साथ काम कर रहा हूं और एक आरजीबी बराबर उत्पादन करने के लिए उन चर का उपयोग कर? क्या मुझे उन सभी को एक साथ मर्ज करने के लिए मूल्यों के प्रत्येक सेट को लेने के लिए 4 अलग-अलग सरणी बनाना होगा? – Seb

+0

आपको केवल 3 एरे की आवश्यकता होगी क्योंकि आरजीबी में 3 रंग घटक हैं। लेकिन हाँ, आपको मूल रूप से रंग घटकों की व्यक्तिगत रूप से गणना करने और उन्हें कहीं स्टोर करने की आवश्यकता है। – NickLH

उत्तर

5

ऐसा लगता है कि आप YUV4422 स्ट्रीम को YUV444 के रूप में डीकोड कर रहे हैं। कोड आपके द्वारा दी गई करने के लिए इस संशोधन का प्रयास करें:

for(int i = 0, j=0; i < 1280 * 720 * 3; i+=6, j+=4) 
{ 
    m_RGB->imageData[i] = pData[j] + pData[j+3]*((1 - 0.299)/0.615); 
    m_RGB->imageData[i+1] = pData[j] - pData[j+1]*((0.114*(1-0.114))/(0.436*0.587)) - pData[j+3]*((0.299*(1 - 0.299))/(0.615*0.587)); 
    m_RGB->imageData[i+2] = pData[j] + pData[j+1]*((1 - 0.114)/0.436); 
    m_RGB->imageData[i+3] = pData[j+2] + pData[j+3]*((1 - 0.299)/0.615); 
    m_RGB->imageData[i+4] = pData[j+2] - pData[j+1]*((0.114*(1-0.114))/(0.436*0.587)) - pData[j+3]*((0.299*(1 - 0.299))/(0.615*0.587)); 
    m_RGB->imageData[i+5] = pData[j+2] + pData[j+1]*((1 - 0.114)/0.436); 
} 

मुझे यकीन है कि आप अपने स्थिरांक सही मिल गया है नहीं कर रहा हूँ, लेकिन कम से सबसे खराब अपने रंग बंद हो जाएगा - छवि पहचानने योग्य होना चाहिए।

+0

आप सही नहीं होने वाले स्थिरांक के बारे में सही थे। मैं एक अच्छी और स्पष्ट छवि देखता हूं। मुझे इस मुद्दे को ठीक करने के लिए केवल यूयूवी 422 स्थिरांक शोध करना होगा। इस सलाह के लिए धन्यवाद। – Seb

1

यह गलत रास्ता हो सकता है, लेकिन कई लोगों (मेरा मतलब है, इंजीनियरों) YCbCr साथ YUV मिश्रण है।

कोशिश

cvCvtColor(src, dsc, CV_YCbCr2RGB) 

या CV_YCrCb2RGB या हो सकता है एक और अधिक विदेशी प्रकार के।

+0

मेरी क्षमा है यह सीवी_वाईसीबीसीआर है। ओपनसीवी में वाईयूवी गणक नहीं है। – Seb

+2

यह यूयूवी स्रोत एसडी होने पर ही ठीक से काम करेगा। यह एक मूल दृश्य निरीक्षण के साथ सही लग सकता है लेकिन रंग वास्तव में सही नहीं हैं। ऐसा इसलिए है क्योंकि वाईयूवी रूपांतरण के लिए अभी नवीनतम ओपनसीवी स्रोत (2.4.10) केवल पीएएल/एनटीएससी/एसईसीएएम के 601 रंगस्थान का समर्थन करता है और एचडी के 70 9 या यूएचडी के 2020 का समर्थन नहीं करता है। –

+0

ओपनसीवी 2.4। * में यूयूवी एन्यूमेरेटर है और इसमें कोई सीवी_वाईसीबीसीआर 2 आरजीबी नहीं है। इसके बजाय CV_YCrCb2RGB है। – Temak

2

ब्लैकमैजिक तीव्रता सॉफ्टवेयर bmdFormat8BitYUV में YUVY प्रारूप को वापस लौटाता है, इसलिए 2 स्रोत पिक्सेल 4bytes में संपीड़ित होते हैं - मुझे नहीं लगता कि ओपनसीवी का सीवीटी रंग यह संभाल सकता है।

आप या तो यह अपने आप कर सकते हैं, या सिर्फ फोन तीव्रता सॉफ्टवेयर ConvertFrame() फ़ंक्शन

संपादित करें: YUV सामान्य रूप से के रूप में
enter image description here

संग्रहीत किया जाता है नहीं है प्रत्येक पिक्सेल के लिए एक वाई (चमक), लेकिन पंक्ति में प्रत्येक वैकल्पिक पिक्सेल के लिए केवल एक यू और वी (रंग)।

तो यदि डेटा ऊपर दिखाए गए अनुसार स्मृति की शुरुआत को इंगित करने वाला एक हस्ताक्षरित चार है।

पिक्सेल 1, वाई = डेटा [0] यू = डेटा [+1] वी = डेटा [+3]
पिक्सेल 2, वाई = डेटा [2] यू = डेटा [+1] वी = डेटा [ +3]

फिर अपने नमूना कोड में उपयोग किए गए YUV-> आरजीबी गुणांक का उपयोग करें।

+0

मैंने उस फ़ंक्शन में देखा, लेकिन यह IDEckLinkInputFrame क्लास पर काम नहीं करता है। सबसे अच्छा तरीका यह खुद ऐसा प्रतीत होता है। यूवीवी क्या है इसका जिक्र करने के लिए धन्यवाद, लेकिन क्या आप उस चीज़ के आधार पर रूपांतरण के बारे में जानना चाहते हैं जिस पर आपने ठोकर खाई थी? अगर आपको कोई जानकारी नहीं है तो कृपया मेरी मदद करने के लिए अपने रास्ते से बाहर न जाएं। धन्यवाद – Seb

+0

पीएस को यू/वी सीआर/सीबी गलत तरीके से मिल सकता है - लेकिन यह स्पष्ट होना चाहिए! –

6

OPENCV के नए संस्करण में समारोह में निर्मित करने के लिए इस्तेमाल किया जा सकता एक YUVRGB रूपांतरण के लिए

cvtColor(src,dst,CV_YUV2BGR_YUY2);

YUV प्रारूप अंडरस्कोर के बाद इस CV_YUYV2BGR_xxxx

+0

मैं opencv 2.4 का उपयोग करता हूं।5 – kyencn

+0

यह यूयूवी स्रोत एसडी है तो यह ठीक से काम करेगा। यह एक मूल दृश्य निरीक्षण के साथ सही लग सकता है लेकिन रंग वास्तव में सही नहीं हैं। ऐसा इसलिए है क्योंकि वाईयूवी रूपांतरण के लिए अभी नवीनतम ओपनसीवी स्रोत (2.4.10) केवल पीएएल/एनटीएससी/एसईसीएएम के 601 रंगस्थान का समर्थन करता है और एचडी के 70 9 या यूएचडी के 2020 का समर्थन नहीं करता है। –

1

हो सकता है कि किसी को पसंद निर्दिष्ट किया जाता है, रंग मॉडल वाईसीबीसीआर और वाईयूवी द्वारा उलझन में है। ओपनसीवी वाईसीबीसीआर संभाल नहीं करता है। इसके बजाय इसमें YCrCb है, और यह ओपनसीवी में YUV जैसा ही लागू किया गया है।

opencv सूत्रों https://github.com/Itseez/opencv/blob/2.4/modules/imgproc/src/color.cpp#L3830 से

:

case CV_BGR2YCrCb: case CV_RGB2YCrCb: 
case CV_BGR2YUV: case CV_RGB2YUV: 
    // ... 
    // 1 if it is BGR, 0 if it is RGB 
    bidx = code == CV_BGR2YCrCb || code == CV_BGR2YUV ? 0 : 2; 
    //... converting to YUV with the only difference that brings 
    // order of Blue and Red channels (variable bidx) 

लेकिन वहाँ एक और बात कहने के लिए है।
वर्तमान में OpenCV शाखा 2.4 में एक bug रूपांतरण में CV_BGR2YUV और CV_RGB2YUV नहीं है। *।

वर्तमान में, इस सूत्र का कार्यान्वयन में प्रयोग किया जाता है:

Y = 0.299B + 0.587G + 0.114R 
U = 0.492(R-Y) 
V = 0.877(B-Y) 

क्या यह (wikipedia के अनुसार) होना चाहिए:

Y = 0.299R + 0.587G + 0.114B 
U = 0.492(B-Y) 
V = 0.877(R-Y) 

चैनलों लाल और नीले कार्यान्वित सूत्र में रख दिए जाते हैं।

संभावित समाधान, BGR-> YUV कन्वर्ट करने के लिए, जबकि बग को ठीक नहीं कर रहा है:

cv::Mat source = cv::imread(filename, CV_LOAD_IMAGE_COLOR); 
    cv::Mat yuvSource;  
    cvtColor(source, yuvSource, cv::COLOR_BGR2RGB); // rearranges B and R in the appropriate order 
    cvtColor(yuvSource, yuvSource, cv::COLOR_BGR2YUV); 
    // yuvSource will contain here correct image in YUV color space