2013-08-26 9 views
10

मैं एक ऐसे एप्लिकेशन को डिज़ाइन कर रहा हूं जिसमें ओपनजीएल प्रसंस्करण पाइपलाइन (शेडर्स का संग्रह) है और साथ ही अंतिम उपयोगकर्ता को अनप्रोसेस्ड कैमरा पूर्वावलोकन देखने की आवश्यकता है।एक साथ कैमरा पूर्वावलोकन और प्रसंस्करण

उदाहरण के लिए, मान लीजिए कि आप उपयोगकर्ता को कैमरा पूर्वावलोकन दिखाना चाहते हैं और साथ ही कैमरे से प्राप्त दृश्यों में लाल वस्तुओं की संख्या की गणना भी करते हैं, लेकिन किसी भी शेडर्स का उपयोग आप वस्तुओं को गिनने के लिए करते हैं ह्यू फ़िल्टरिंग आदि के रूप में उपयोगकर्ता द्वारा नहीं देखा जाना चाहिए।

मैं इसे ठीक से स्थापित करने के बारे में कैसे जाउंगा?

मुझे पता है कि मैं एक कैमरा पूर्वावलोकन सेट कर सकता हूं और फिर कॉलबैक पर वाईयूवी प्रारूप में कैमरा फ्रेम डेटा प्राप्त कर सकता है, फिर उसे ओपनजीएल बनावट में डंप करें और उस तरह से फ्रेम को संसाधित करें, हालांकि, इसमें इसके साथ प्रदर्शन की समस्याएं हैं। मुझे कैमरे के हार्डवेयर से डेटा को वीएम तक ले जाना है, फिर इसे वापस GPU मेमोरी में पास करना होगा। मैं सीधे कैमरे से ओपनजीएल समझने योग्य प्रारूप में डेटा प्राप्त करने के लिए SurfaceTexture का उपयोग कर रहा हूं और इस समस्या को हल करने के लिए अपने शेडरों को पास कर रहा हूं।

मैंने सोचा कि मैं कि एक ही असंसाधित SurfaceTexture अंतिम उपयोगकर्ता को दिखाने में सक्षम होना चाहते हैं, लेकिन TextureView एक निर्माता या एक सेटर जहां मैं इसे SurfaceTexture मैं इसे प्रस्तुत करना चाहता हूँ पारित कर सकते हैं नहीं है। यह हमेशा अपना खुद का बनाता है।

  • GLRenderThread:

    यह मेरे वर्तमान सेटअप का संक्षिप्त विवरण है इस वर्ग थ्रेड से फैली हुई है, ओपन संदर्भ, प्रदर्शन, आदि setups और सतह के रूप में एक SurfaceTexture (eglCreateWindowSurface 3 पैरामीटर) का उपयोग करता है।

  • जीएलफ़िल्टर चेन: इनपुट बनावट पर पहचान करने वाले शेडरों का संग्रह।
  • कैमरा: एक अलग SurfaceTexture जो GLFilterChain के इनपुट के रूप में प्रयोग किया जाता है एक TextureView GLRenderThread के SurfaceTexture को प्रदर्शित करता है कि

जाहिर है, इस सेटअप के साथ, मैं दिखा रहा हूँ उपयोग करता है और पकड़ लेता है कैमरे के पूर्वावलोकन

  • अंत में उपयोगकर्ता को संसाधित फ्रेम जो मैं नहीं चाहता हूं। इसके अलावा, फ्रेम की प्रसंस्करण वास्तविक समय नहीं है। असल में, मैं एक बार श्रृंखला के माध्यम से कैमरे से इनपुट चलाता हूं और एक बार सभी फ़िल्टर किए जाने के बाद, मैं कैमरे से अगले फ्रेम को पकड़ने के लिए updateTexImage पर कॉल करता हूं। मेरा प्रोसेसिंग नेक्सस 4 पर प्रति सेकंड लगभग 10 फ्रेम है।

    मुझे लगता है कि मुझे शायद 2 जीएल संदर्भों का उपयोग करने की आवश्यकता है, एक वास्तविक समय पूर्वावलोकन के लिए और एक प्रसंस्करण के लिए, लेकिन मुझे यकीन नहीं है। मुझे उम्मीद है कि कोई मुझे सही दिशा में धक्का दे सकता है।

  • +0

    http://stackoverflow.com/questions/12519235/modifying-camera-output-using-surfacetexture-and-opengl –

    उत्तर

    0

    क्या आप कृपया इस्तेमाल कर रहे कोड में से कुछ अपलोड कर सकते हैं?

    आप प्रारंभिक रूप से पूर्वावलोकन प्रदर्शित करने के लिए उपयोग किए जा रहे सतह दृश्य के लिए बनाए गए और बाध्य किए गए बनावट पर glDrawArrays को कॉल करने में सक्षम हो सकते हैं, और उसके बाद विश्लेषण कर सकते हैं और विश्लेषण के लिए अपने अन्य बनावट के साथ एक अलग बनावट बांध सकते हैं?

    GLES20.glUseProgram(simpleProgram); 
    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[0]); 
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 
    
    GLES20.glUseProgram(crazyProgram); 
    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[1]); 
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 
    

    की तरह कुछ जहां अपने कैमरे का पूर्वावलोकन surfacetexture [0] बनावट के लिए बाध्य है और फिर बनावट के लिए बनाई गई एक अलग surfacetexture [1]

    शायद?

    +0

    मेरा कोड कई वर्गों को फैलाता है, लेकिन मैं प्रश्न में सारांश जोड़ने का प्रयास करूंगा। तो अपने विचार को दोबारा शुरू करने के लिए: सरल प्रोग्राम सिर्फ इनपुट पिक्सेल के मान में gl_FragColor सेट करता है। पागलप्रोग्राम वास्तविक प्रसंस्करण करता है। मैं TextureView का उपयोग करने के लिए बिल्कुल नहीं जा रहा हूं और उपयोगकर्ता को पूर्वावलोकन दिखाने के लिए एक GLSurfaceView का उपयोग नहीं कर रहा हूं। मैं texturres [0] को बनावट [1] में कैसे कॉपी करूं और मैं रीयल-टाइम में कैमरा पूर्वावलोकन कैसे रखूं? मेरी समझ के आधार पर, मैं पागलप्रोग्राम का उपयोग करने से पहले, मुझे एक गैर-डिफ़ॉल्ट फ्रेमबफर बांधना होगा जिसका अर्थ है कि अगला कैमरा पूर्वावलोकन तब तक इंतजार करना चाहिए जब तक कि पागल प्रोग्राम ने अपनी सभी प्रोसेसिंग नहीं की है। – Ameen

    0

    जब तक आपकी प्रसंस्करण वास्तविक समय की तुलना में धीमी गति से चलती है, तो उत्तर एक साधारण है: केवल मूल कैमरा बनावट को छूटे रखें, संसाधित छवि को एक अलग बनावट पर गणना करें और उपयोगकर्ता को दोनों को एक तरफ दिखाएं GLView। एक धागा रखें, क्योंकि सभी प्रोसेसिंग जीपीयू पर भी होती है। एकाधिक धागे केवल यहां मामलों को जटिल करते हैं।

    प्रसंस्करण चरणों की संख्या वास्तव में कोई फर्क नहीं पड़ता है, क्योंकि मनमाने ढंग से इंटरमीडिएट बनावट (पिंग-पोंगिंग भी देखें) जो उपयोगकर्ता को कभी प्रदर्शित नहीं होती है - कोई भी नहीं और कुछ भी आपको मजबूर नहीं कर रहा है।

    वास्तविक समय की धारणा शायद यहां भ्रमित हो रही है। बस एक फ्रेम के बारे में एक अवांछित समय स्नैपशॉट के रूप में सोचो। ऐसा करके, आप छवि को कैमरे से स्क्रीन पर जाने के लिए देरी की अनदेखी करेंगे, लेकिन यदि आप इसे इंटरैक्टिव फ्रेम दर (जैसे प्रति सेकंड कम से कम 20 फ्रेम) पर रख सकते हैं, तो यह ज्यादातर हो सकता है अवहेलना करना।

    दूसरी तरफ, यदि आपकी प्रसंस्करण बहुत धीमी है, तो आपको कैमरे की फीड में देरी शुरू करने और केवल हर एनएच फ्रेम को संसाधित करने के बीच एक विकल्प बनाने की ज़रूरत है, या वैकल्पिक रूप से हर कैमरे के फ्रेम को वास्तविक समय में प्रदर्शित करें और अगले को दें संसाधित फ्रेम पीछे पीछे। ऐसा करने के लिए, आपको एसिंक्रोनस प्रोसेसिंग को सक्षम करने के लिए शायद दो अलग-अलग प्रतिपादन संदर्भों की आवश्यकता होगी, जो एंड्रॉइड पर संभवतः कठिन हो सकता है (या शायद दूसरा जीएलवी व्यू बनाने के समान ही सरल हो सकता है, क्योंकि आप संदर्भों के बीच डेटा साझा किए बिना जी सकते हैं)।

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