2014-04-17 5 views
6

मुझे लगता है कि कैमरा शुरू होता है और सभी पूर्वावलोकन बफर JNI इंटरफ़ेस का उपयोग कर देशी घटकों के लिए नीचे भेज एक Android आवेदन को लागू किया है से चटाई वस्तु बनाने के। चूंकि पूर्वावलोकन डेटा एनवी 21 छवि प्रारूप में है, इसलिए मुझे इसमें से एक सीवी :: मैट इंस्टेंस बनाना होगा। मैं इसके लिए खोज की है और नीचे समाधान नहीं मिला:opencv सी ++ एंड्रॉयड NV21 छवि डेटा बफर

cv::Mat _yuv(height, width, CV_8UC1, (uchar *) imagebuffer); 

where imagebuffer is jbyte* 

हालांकि, उत्पादन छवि में उम्मीद छवि नहीं मिलता है। यह सब कुछ यादृच्छिक रेखाओं से भरा है आदि। क्या कोई जानता है कि मैं इसे कैसे कर सकता हूं?

उत्तर

13

आपको वाईयूवी छवि को आरजीबीए छवि में परिवर्तित करने की आवश्यकता है।

cv::Mat _yuv(height+height/2, width, CV_8UC1, (uchar *)imagebuffer); 
cv::cvtColor(_yuv, _yuv, CV_YUV2RGBA_NV21); 

आमतौर पर, YUV छवियों 1.5*height साथ 1 चैनल छवियाँ हैं (अगर यह एक आरजीबी या ग्रेस्केल छवि थे)।

या आप एक नया चटाई बना सकते हैं और देशी कार्य करने के लिए jint सरणी गुजरती हैं और कि सरणी का उपयोग बिटमैप की पिक्सेल सेट करने के लिए कर सकता है।

jint *_out = env->GetIntArrayElements(out, 0);  

cv::Mat _yuv(height + height/2, width, CV_8UC1, (uchar*)imagebuffer); 
cv::Mat _rgba(height, width, CV_8UC4, (uchar *)_out); 

cv::cvtColor(_yuv, _rgba, CV_YUV2RGBA_NV21); 

env->ReleaseIntArrayElements(out, _out, 0); 

जावा में,

bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
pixels = new int[width * height]; 

native_function(height, width, bytedata, pixels); 

bitmap.setPixels(pixels, 0, width, 0, 0, width, height); 
+0

यह करने के बाद, छवि सब हरा है। इसे कैसे ठीक करें? –

+0

मुझे एक ही समस्या है (सभी हरा) क्या आप इसे हल कर सकते हैं ?? – isra60

0

1 जवाब के रूप में सही रंग छवि काम करता है नहीं हो सकता है। यह कोड मेरा जवाब है।

cv::Mat yuv(height+height/2, width, CV_8UC1,(uchar *)nv21ImageBuffer); 
    cv::Mat converted(height, width, CV_8UC3); 
    cv::cvtColor(yuv, converted, CV_YUV2BGR_NV21); 
    cv::imwrite("anywhere/colorImage.jpg",converted);