ARCore

2017-08-29 7 views
6

में छवि डेटा बाइट एक्सेस करना मैंने एक ARCore Session बनाया है और Session#setCameraTextureName विधि के माध्यम से अपना कैमरा डेटा प्रदर्शित करने के लिए ओपनजीएल बनावट आईडी संलग्न की है। मैं बनावट पर प्रदर्शित कैमरे छवि डेटा बाइट्स तक पहुंच प्राप्त करना चाहता हूं।ARCore

ARKit और Tango प्रत्येक फ्रेम के लिए छवि बाइट तक पहुंच प्रदान करता है लेकिन ऐसा लगता है कि ARCore API में आसानी से प्रदान नहीं किया जाता है।

क्या ARCore का उपयोग करते समय मैं छवि बाइट्स तक पहुंच सकता हूं?

उत्तर

1

उस समय के लिए, छवि डेटा तक पहुंचने के लिए आपकी सबसे अच्छी शर्त शायद रेंडरबफर में बनावट बना रही है और glReadPixels को लगातार मैप किए गए पिक्सेल अनपैक बफर में उपयोग कर रही है। GlReadPixels पूर्ण होने पर पता लगाने के लिए बाड़ सिंक का उपयोग करें।

एक और विकल्प एक गणना शेडर का उपयोग करना है और सीधे लगातार मैप किए गए एसएसबीओ पर लिखना है। (ध्यान न लगातार नक्शे का सुझाव। मैंने सोचा था कि EXT_buffer_storage व्यापक समर्थन प्राप्त था)

बाद में संभवतः है कम प्रतियां (renderbuffer पिक्सल अभी भी DRAM हिट हो सकता है भले ही आप इसे glReadPixels के बाद अमान्य), लेकिन यह भी एक less- है सामान्य कोड पथ और कनवर्टर्स को प्रस्तुत/गणना करता है, इसलिए मेरे पास अंतर्ज्ञान नहीं है कि कौन सा दृष्टिकोण अधिक कुशल होगा।

+0

क्या यह हमें कैमरा बफर से वाईयूवी डेटा प्राप्त करने देगा? – MrAlbean

+1

नहीं। अब के लिए कच्चे YUV डेटा तक पहुंचने का कोई तरीका नहीं है। ओपनजीएल नमूना आपके लिए आरजीबी में परिवर्तित हो जाएगा। –

+0

@IanM उत्तर के लिए धन्यवाद। क्या आपको लगता है कि भविष्य में इसके लिए एक आधिकारिक (और अधिक प्रदर्शन करने वाला) तरीका होगा? आखिरकार, एआर के लिए कंप्यूटर विजन महत्वपूर्ण है :-) – PhilLab

0

शायद यह आपकी मदद कर सकता है मैं एक बिटमैप रूप में कैमरा दृश्य प्राप्त करना चाहता था। मैंने सैमसंग एस 8 पर परीक्षण किया है।

int w=1080; 
    int h = 2220; 
    int b[]=new int[w*(0+h)]; 
    int bt[]=new int[w*h]; 
    IntBuffer ib = IntBuffer.wrap(b); 
    ib.position(0); 
    GLES20.glReadPixels(0, 0, w, h, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ib); 

    for(int i=0, k=0; i<h; i++, k++) 
    {//remember, that OpenGL bitmap is incompatible with Android bitmap 
     //and so, some correction need. 
     for(int j=0; j<w; j++) 
     { 
      int pix=b[i*w+j]; 
      int pb=(pix>>16)&0xff; 
      int pr=(pix<<16)&0x00ff0000; 
      int pix1=(pix&0xff00ff00) | pr | pb; 
      bt[(h-k-1)*w+j]=pix1; 
     } 
    } 

    sb=Bitmap.createBitmap(bt, w, h, Bitmap.Config.ARGB_8888);