2012-06-07 22 views
5

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

Input image
Output Image

उत्तर

2

निम्नलिखित कोड Fish Eye lens क्षेत्र बनाने के लिए और क्षेत्र और पृष्ठभूमि पीढ़ी को स्केल करने के लिए कुछ संशोधनों को लागू करने में मदद करता है, यह ज्यादातर वर्ग छवियों के लिए काम करेगा।

0

यह एक किरण अनुरेखण समस्या है। ओपनजीएल शायद यहां आपकी मदद भी नहीं करेगा क्योंकि ओपनजीएल रे आधारित 3 डी प्रदान नहीं करता है। हालांकि, यह वही हो सकता है जो आप खोज रहे हैं।

http://www1.cs.columbia.edu/CAVE/publications/pdfs/Garg_TR04.pdf

+0

मुझे नहीं लगता कि यह एक कठिन रेराट्रिंग समस्या है बशर्ते पृष्ठभूमि केवल एक बनावट है। आप किसी भी गोलाकार समन्वय प्रणाली या cubemap के साथ क्षेत्र में बनावट बना सकते हैं। यदि वह गतिशील 3 डी दृश्य को प्रतिबिंबित कर रहा था तो मैं आपके साथ सहमत होगा, लेकिन केवल एक बनावट को प्रतिबिंबित करना बहुत मुश्किल नहीं है। – Tim

+0

गैर-रेट्रैसिंग उदाहरण यह है कि मैंने जो पेपर प्रदान किया है वह है (मुझे यकीन है कि) !!! ऐसा करने का एक और तरीका (यहां तक ​​कि पृष्ठभूमि बनावट के साथ) अभी भी रे-ट्रेसिंग का उपयोग कर सकता है। – trumpetlicks

+2

"ओपनजीएल रे आधारित 3 डी प्रदान नहीं करता है" - शेडर्स का उपयोग करते समय यह निश्चित रूप से कर सकता है।मैंने एक विरूपण किया है जो ओपनजीएल ईएस 2.0 शेडर का उपयोग कर इसके करीब था: http://stackoverflow.com/a/9896856/19679 और जीएलएसएल ऑब्जेक्ट्स के माध्यम से प्रकाश अपवर्तन के लिए 'अपवर्तक()' फ़ंक्शन को भी परिभाषित करता है। मुझे देखने दें कि क्या मैं इस विशिष्ट प्रभाव को दोहराने के लिए एक शेडर बना सकता हूं। –

0

मैं टिम के साथ सहमत हैं। एक बिटमैप को दूसरे में बदलने के लिए 3 डी अंक की आवश्यकता नहीं होती है, न ही रे-ट्रेस, इसे बिल्कुल भूल जाते हैं, इसकी बस 2 डी। मुझे नहीं पता कि ओपनजीएल में कुछ बनाया गया है, लेकिन मेरे पास सही दिशा में आपको इंगित करने के लिए पर्याप्त 3 डी अनुभव है। आपको आपके द्वारा चुने गए * सर्कल क्षेत्र के अंदर सभी बिंदुओं को फिर से चालू करना होगा * यह सुराग है, और फिश-ईवाईई परिवर्तन का उपयोग कर रंग ढूंढें। आपको नेट पर बहुत कुछ मिला है। उम्मीद है कि यह

+0

व्यक्ति का दिखाया गया उदाहरण स्पिकुलर प्रतिबिंब, अपवर्तन, और पानी/ग्लास इत्यादि से जुड़ा एक वास्तविक परिपत्र दिखाता है ... भले ही आप ब्रैड लार्सन (+1 के माध्यम से महान लिंक) द्वारा प्रदान किए गए लिंक को देखते हैं गोलाकार सीमा पर छवि को वापस चिकनी संक्रमण कर रहे हैं। यह एक प्रभाव है, अनिवार्य रूप से यह उपयोगकर्ता क्या मांग रहा है। यदि उपर्युक्त छवि वास्तव में वह है जो वे खोज रहे हैं तो यह थोड़ी अधिक जटिल हो सकती है, फिर थोड़ा सा शेडर प्रकार फ़ंक्शंस। पूछताछ से उनकी व्याख्या के बारे में ज्यादा शब्द वापस नहीं मिला है ??? – trumpetlicks

4

मैं सिर्फ यह iOS पर OpenGL ES 2.0 का उपयोग कर काम करने का एक कार्यान्वयन है:

Spherical refraction example

हालांकि यह iOS पर है, टुकड़ा शेडर मैं इस्तेमाल किया सीधे Android के लिए भर में लाया जा सकता है। , radius सामान्यीकृत त्रिज्या है -

varying highp vec2 textureCoordinate; 

uniform sampler2D inputImageTexture; 

uniform highp vec2 center; 
uniform highp float radius; 
uniform highp float aspectRatio; 
uniform highp float refractiveIndex; 

void main() 
{ 
    highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); 
    highp float distanceFromCenter = distance(center, textureCoordinateToUse); 
    lowp float checkForPresenceWithinSphere = step(distanceFromCenter, radius); 

    distanceFromCenter = distanceFromCenter/radius; 

    highp float normalizedDepth = radius * sqrt(1.0 - distanceFromCenter * distanceFromCenter); 
    highp vec3 sphereNormal = normalize(vec3(textureCoordinateToUse - center, normalizedDepth)); 

    highp vec3 refractedVector = refract(vec3(0.0, 0.0, -1.0), sphereNormal, refractiveIndex); 

    gl_FragColor = texture2D(inputImageTexture, (refractedVector.xy + 1.0) * 0.5) * checkForPresenceWithinSphere;  
} 

center एक सामान्यीकृत गोले के केंद्र के लिए समन्वय (1.0 दोनों आयामों में 0.0 की एक अंतरिक्ष से) है: गोलाकार अपवर्तन भाग निम्नलिखित टुकड़ा शेडर का उपयोग कर पूरा किया है , refractiveIndex आपके क्षेत्र की वायु/सामग्री सूचकांक है, और aspectRatio छवि का पहलू अनुपात है (यह सुनिश्चित करने के लिए कि गोलाकार गोलाकार है और सामान्यीकृत समन्वय स्थान में अंडाकार नहीं है)।

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

पृष्ठभूमि को अलग-अलग गॉसियन ब्लर का उपयोग करके धुंधला कर दिया गया है जिसे मैं this answer में वर्णित करता हूं।

यह फ़िल्टर एक आईफोन पर वास्तविक समय में लाइव वीडियो फ़िल्टर करने के लिए पर्याप्त तेज़ है, इसलिए यह अधिकांश एंड्रॉइड डिवाइसों पर काफी प्रदर्शन करने वाला होना चाहिए। इसके लिए स्रोत कोड GPUImageSphereRefractionFilter के भीतर मेरे ओपन सोर्स GPUImage ढांचे में पाया जा सकता है।

+0

मैंने इसे ओपनजीएल में इस्तेमाल किया और यह पूरी तरह से काम किया। हालांकि मुझे गणित को समझने में परेशानी हो रही है। Y textureCoordinateToUse की गणना करते समय, मैं समझता हूं कि aspectRatio गुणा क्यों है, लेकिन शेष गणना की आवश्यकता क्यों है? – tanvi