2012-08-06 15 views
7

मुझे एक फोटोग्रामेट्रिक एप्लिकेशन के लिए परीक्षण छवियों की कुछ श्रृंखला उत्पन्न करने की आवश्यकता है। इन्हें साधारण वस्तुओं (डिस्क, आयतों, आदि) में एक बहुत ही सटीक स्थिति के साथ होना चाहिए।ओपनजीएल में उप-पिक्सेल प्रतिपादन - सटीकता समस्या

सफेद पृष्ठभूमि पर एक काले आयताकार की 8 बिट ग्रेस्केल छवि को ध्यान में रखते हुए, एक छोटा अवलोकन करने योग्य विस्थापन (इंटरपोलेशन के बाद) 1/256 पिक्सेल होना चाहिए, क्योंकि प्रत्येक पिक्सेल के 256 संभावित तीव्रता स्तर हैं।

मैं ऐसी छवियों रेंडर करने के लिए (अजगर + pyglet के साथ) OpenGL का उपयोग करने का फैसला किया, के रूप में बाद में मैं और अधिक जटिल (3 डी दृश्य, स्टीरियो छवि जोड़े) प्रस्तुत करना

दुर्भाग्य से, सबसे अच्छा सटीकता मैं हासिल किया होगा पिक्सेल/10 के आसपास है, पूर्ण तीव्रता गहराई का उपयोग नहीं किया जाता है।

क्या यह बेहतर करना संभव है, आदर्श - पूर्ण 1/256 पिक्सल सटीकता प्राप्त करना? ऐसा करने के बारे में कोई संकेत, कृपया?

नमूना कोड, एक आंशिक डिस्क की छवियों पैदा करने, प्रत्येक फ्रेम

#-*- coding: utf-8 -*- 
import pyglet 
from pyglet.gl import * 
from PIL import Image, ImageGrab 

config = pyglet.gl.Config(width = 800, height = 600, sample_buffers=1, samples=16) 
window = pyglet.window.Window(config=config, resizable=True) 
window.set_size(800, 600) 

printScreenNr = 0 

@window.event 
def on_draw(): 
    global printScreenNr 
    window.clear() 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glLoadIdentity() 
    glEnable(GL_LINE_SMOOTH) 
    glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); 

    glTranslated(200, 200,0) 

    circleQuad = gluNewQuadric() 
    glTranslated(200+(printScreenNr*0.01), 0, 0) 
    gluPartialDisk(circleQuad, 0, 50, 500, 500, 0, 180) 

@window.event 
def on_resize(width, height): 
    glViewport(0, 0, width, height) 
    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity() 
    glOrtho (0, width, height, 0, 0, 1); 
    glMatrixMode(GL_MODELVIEW) 
    return pyglet.event.EVENT_HANDLED 

@window.event 
def on_text(text): 
    global printScreenNr 
    if(text == "p"): 
     pyglet.image.get_buffer_manager().get_color_buffer().save('photo'+str(printScreenNr)+'.tiff') 
     printScreenNr += 1 

pyglet.app.run() 

(उपरोक्त कोड gluPartialDisk उपयोग कर रहा है में और अधिक 0.01 पिक्सेल ले जाया गया, लेकिन मैं यह भी मुद्दा परीक्षण किया है चतुर्भुजों का उपयोग कर, परिणाम 'सटीकता किया अलग नहीं)

+0

क्या आपने 32-बिट रंग गहराई का उपयोग करने का प्रयास किया है? कारण मैं यह कहता हूं कि 32-बिट पथ सबसे अधिक उपयोग किए जाते हैं और इसलिए आजकल ग्राफिक्स ड्राइवरों में सबसे अधिक बनाए रखा कोड-पथ हैं। यदि यह काम करता है, तो आप बाद में एक उच्च गुणवत्ता वाले रंग गहराई को पुन: प्राप्त कर सकते हैं। – Ani

+0

ने कोशिश की, लेकिन परिणाम नहीं बदला ... अभी भी, धन्यवाद – Pietro

उत्तर

4

ऐसा करने का एक आसान तरीका छवि को एक कारक से स्केल करना है। यदि आप 4.0 तक छवि को स्केल करते हैं, तो 16 मूल पिक्सल एक लक्ष्य पिक्सेल में विलय किए जाएंगे जो आपको शुद्ध बी & डब्ल्यू छवि स्केल करते समय ग्रे के 16 रंग देता है।

लेकिन एक पकड़ है जो शायद आपकी समस्या बताती है।

...##### 
    ...##### 
    ...##### 
    ...##### 

: यदि आप इस किया है (बाएं: सफेद, सही: काले भरा आयत), तो आप 12 सफेद और 4 काले पिक्सल है कि एक ही उत्पादन पिक्सेल में योगदान किया है। 1 ब्लैक पिक्सेल प्राप्त करने के लिए, इनपुट को यह होना आवश्यक होगा:

....#### 
    ....#### 
    ....#### 
    ...##### 

देखें? भले ही ब्लैक बॉक्स सफेद अंतरिक्ष में केवल एक पिक्सेल लीक करता है, यह चार गुना करता है। तो यह सुनिश्चित करने के लिए कि आपका उप-पिक्सेल रेंडरिंग कोड काम करता है, आपको किनारों पर नहीं, एकल पिक्सेल या कोनों को देखना होगा।

+0

एक (रास्ता) बड़ी छवि प्रस्तुत करना एक समाधान होगा, लेकिन मुझे लगता है कि स्क्रीन का आकार एक सीमा है? तो इससे आपके उत्तर के दूसरे भाग के बारे में मदद नहीं करेगा, मुझे यकीन नहीं है कि मैं सही ढंग से समझता हूं ... यदि छवि 4x (प्रत्येक दिशा में) स्केल की गई है, तो 4 संभावित रंगों को देखते हुए किनारे (और 16 बिंदु को देखते समय) लेकिन फिर भी, यह पूर्ण गहराई सटीकता – Pietro

+0

के साथ स्थित किनारे उत्पन्न करने के लिए किसी भी तरह से संभव होना चाहिए? किनारे में केवल चार अलग-अलग स्थितियां हैं, इसलिए आप 16 रंगों में से केवल 4 प्राप्त कर सकते हैं। –

+0

अगर मैं अभी भी गलत हूं तो कृपया मुझे सही करें मान लें कि छवि को 256 कारक द्वारा स्केल किया गया है। किनारे के पास 256 पद होंगे, और एक बिंदु: 256^2 (जिसे गोलाकार किया जाएगा) मुझे नहीं पता, अगर ओपनजीएल में ऐसा करना संभव है (इस मामले में प्रदर्शन कोई मुद्दा नहीं है), लेकिन मैं इन आवश्यकताओं को पूरा करने वाली छवियों को आम तौर पर उत्पन्न करना संभव है। मेरा सवाल है: यह कैसे करें .. – Pietro

1

भले ही आप ऑर्थोगोनल प्रोजेक्शन का उपयोग कर रहे हों, GL_PERSPECTIVE_CORRECTION_HINT को सटीकता प्रतिपादन पर असर पड़ सकता है। कम से कम मैं अस्पष्ट रूप से glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) याद करता हूं; कई साल पहले मेरे ऑर्थोगोनियल अनुमानित दृश्य पर कुछ अंतराल को ठीक करना।

+0

धन्यवाद, उन्होंने कहा, इस समय परिणाम नहीं बदला, लेकिन भविष्य में 3 डी मोड में शायद इसकी आवश्यकता होगी – Pietro

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