2016-11-18 5 views
6

मैं कस्टम कैमरा एपीआई 2 ऐप विकसित कर रहा हूं, और मुझे लगता है कि जब मैं ImageReader कॉलबैक का उपयोग करता हूं तो कैप्चर प्रारूप रूपांतरण कुछ डिवाइसों पर भिन्न होता है।मैं छवि रीडर कैमरा एपीआई 2 में एनवी 21 और वाईवी 12 कोडिफिकेशन के बीच अंतर कैसे कर सकता हूं?

उदाहरण के लिए नेक्सस 4 में ठीक काम नहीं करता है और नेक्सस 5 एक्स में ठीक दिखता है, यहां आउटपुट है।

enter image description here

मैं इस रूप में ImageReader प्रारंभ:

mImageReader = ImageReader.newInstance(320, 240, ImageFormat.YUV_420_888,2); 

और मेरी कॉलबैक सरल कॉलबैक ImageReader कॉलबैक है।

mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() { 

    @Override 
    public void onImageAvailable(ImageReader reader) { 

     try { 
      mBackgroundHandler.post(
       new ImageController(reader.acquireNextImage()) 
      ); 
     } 
     catch(Exception e) 
     { 
      //exception 
     } 
     } 

};

और नेक्सस 4 के मामले में: मुझे यह त्रुटि थी।

D/qdgralloc: gralloc_lock_ycbcr: Invalid format passed: 0x32315659 

जब मैं दोनों उपकरणों में कच्ची फ़ाइल लिखने का प्रयास करता हूं, तो मेरे पास ये अलग-अलग छवियां होती हैं। इसलिए मैं समझता हूं कि नेक्सस 5 एक्स छवि में एनवी 21 कोडिफिकेशन है और नेक्सस 4 में वाईवी 12 कोडिफिकेशन है। enter image description here

मुझे image format का एक विनिर्देश मिला और मैं ImageReader में प्रारूप प्राप्त करने का प्रयास करता हूं। वाईवी 12 और एनवी 21 विकल्प हैं, लेकिन जाहिर है, जब मैं प्रारूप प्राप्त करने का प्रयास करता हूं तो मुझे YUV_420_888 प्रारूप मिलता है।

int test=mImageReader.getImageFormat(); 

तो वहाँ किसी भी तरह से कैमरा इनपुट प्रारूप (NV21 या YV12) कैमरा कक्षा में इस संहिताकरण प्रकार भेदभाव करने के लिए प्राप्त करने के लिए है? कैमरा लक्षण शायद?

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

यूनई। पीडी: मैं प्रदर्शित आरजीबी छवियों के लिए ओपनजीएल का उपयोग करता हूं, और मैं वाईयूवी_420_888 में रूपांतरण करने के लिए ओपनसीवी का उपयोग करता हूं।

+0

'Image.getFormat()' 'ImageReader' प्रारूप के समान देता है? और ऐसा लगता है कि आप अकेले नहीं हैं: http://stackoverflow.com/questions/34717969/imagereader-format-overridden-in-some-devices – nandsito

+0

@nandsito आपकी सलाह के लिए धन्यवाद, लेकिन दुर्भाग्यवश वे दोनों मामलों में समान मूल्य 35 वापस कर देते हैं जो वास्तव में YUV_420_888 है। – uelordi

+0

क्या आपने 'कैमरा' पैरामीटर की जांच की है .getSupportedPictureFormats() 'कौन से प्रारूप समर्थित हैं? – Robert

उत्तर

0

YUV_420_888 एक रैपर है जो एनवी 21 और वाईवी 12 छवियों दोनों (दूसरों के बीच) होस्ट कर सकता है। अगर व्यक्ति को रंग का उपयोग करने के विमानों और प्रगति का उपयोग करना चाहिए:

ByteBuffer Y = image.getPlanes()[0]; 
ByteBuffer U = image.getPlanes()[1]; 
ByteBuffer V = image.getPlanes()[2]; 

अंतर्निहित पिक्सल NV21 प्रारूप में हैं (Nexus 4 पर के रूप में), तो pixelStride 2 हो जाएगा, और

int getU(image, col, row) { 
    return getPixel(image.getPlanes()[1], col/2, row/2); 
} 

int getPixel(plane, col, row) { 
    return plane.getBuffer().get(col*plane.getPixelStride() + row*plane.getRowStride()); 
} 

हम ले आधा कॉलम और आधा पंक्ति क्योंकि इस प्रकार यू और वी (क्रोमा) विमान 420 छवि में संग्रहीत किए जाते हैं।

यह कोड चित्रण के लिए है, यह बहुत अक्षम है, आप शायद get(byte[], int, int), या एक टुकड़े टुकड़े के माध्यम से या जेएनआई फ़ंक्शन GetDirectBufferAddress के माध्यम से मूल कोड में पिक्सेल तक पहुंचना चाहते हैं। आप क्या उपयोग नहीं कर सकते हैं, विधि plane.array() है, क्योंकि विमानों को सीधे बाइट बफर होने की गारंटी है।

संबंधित मुद्दे