ARKit

2017-06-07 10 views
5

से आरजीबी पिक्सेल बफर प्राप्त करें मैं ऐप्पल के एआरकिट से आरजीबी रंग स्थान में CVPixelBuffer प्राप्त करने का प्रयास कर रहा हूं। func session(_ session: ARSession, didUpdate frame: ARFrame)ARSessionDelegate की विधि में मुझे ARFrame का उदाहरण मिलता है। पेज Displaying an AR Experience with Metal पर मैंने पाया कि यह पिक्सेल बफर वाईसीबीसीआर (वाईयूवी) रंग स्थान में है।ARKit

मुझे इसे आरजीबी रंग स्थान में बदलने की ज़रूरत है (मुझे वास्तव में CVPixelBuffer की आवश्यकता है और UIImage नहीं)। मुझे आईओएस पर रंग रूपांतरण के बारे में something मिला है लेकिन मैं इसे स्विफ्ट 3 में काम नहीं कर पाया।

+0

यूयूवी पर आरजीबी की आवश्यकता के लिए आपको क्या उपयोग करने की आवश्यकता है? – Guig

+0

मेरे पास एक कस्टम प्रसंस्करण पाइपलाइन है जिसके लिए आरजीबी – tomas789

+0

ठीक है। यदि आपकी पाइपलाइन में किसी प्रकार का ओपनग्ल/धातु शामिल है, तो वहां रूपांतरण करना आसान है। मुझे यकीन नहीं है कि सीधे आरजीबी प्राप्त करने का एक अच्छा तरीका है। – Guig

उत्तर

4

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

का उपयोग करते हुए धातु: आप एक नई परियोजना बनाते हैं, तो "संवर्धित वास्तविकता अनुप्रयोग," का चयन करें और चुनें सामग्री प्रौद्योगिकी के लिए "धातु", कोड और shaders आवश्यक इस रूपांतरण बनाने के लिए शामिल होंगे उत्पन्न परियोजना।

का उपयोग करते हुए ओपन: GLCameraRipple example एप्पल से कैमरे पर कब्जा करने के AVCaptureSession का उपयोग करता है, और (उदाहरण में प्रदान की फिर से,) बनावट है, जो तब shaders में आरजीबी में बदल दिए जाते जीएल को जिसके परिणामस्वरूप CVPixelBuffer मैप करने के लिए कैसे पता चलता है ।

गैर रीयलटाइम: जवाब this stackoverflow question करने के लिए एक UIImage करने के लिए बफर परिवर्तित पते, और यह करने के लिए एक बहुत आसान तरीका प्रदान करता है।

2

docs स्पष्ट रूप से कहता है कि आप लुमा और क्रोमा विमानों का उपयोग करने की जरूरत है:

ARKit एक समतल YCbCr प्रारूप प्रारूप (भी YUV रूप में जाना) में पिक्सेल बफ़र्स कैप्चर करता है। इन छवियों को डिवाइस डिस्प्ले पर प्रस्तुत करने के लिए, आपको पिक्सेल बफर के लुमा और क्रोमा विमानों तक पहुंचने और पिक्सेल मानों को आरजीबी प्रारूप में कनवर्ट करने की आवश्यकता होगी।

तो वहाँ के रूप में @joshue

1

मैं भी कई के लिए इस प्रश्न पर अटक है द्वारा वर्णित या तो धातु या OpenGL में कोई रास्ता नहीं सीधे आरजीबी विमानों को पाने के लिए है और आप अपने shaders में इस संभाल करने के लिए होगा, दिन .. सीवी पिक्सेलबफर को यूआईएममेज में परिवर्तित करने के संबंध में, इनइंटरनेट पर जो कोड स्निपेट मिल सकता है, वह स्विफ्ट के बजाय उद्देश्य-सी में लिखा गया है।

अंत में, निम्न कोड स्निपेट मेरे लिए एकदम सही काम करता है, एक यूयूवी छवि को या तो jpg या png फ़ाइल प्रारूप में परिवर्तित करने के लिए, और फिर आप इसे अपने एप्लिकेशन में स्थानीय फ़ाइल में लिख सकते हैं।

func pixelBufferToUIImage(pixelBuffer: CVPixelBuffer) -> UIImage { 
    let ciImage = CIImage(cvPixelBuffer: pixelBuffer) 
    let context = CIContext(options: nil) 
    let cgImage = context.createCGImage(ciImage, from: ciImage.extent) 
    let uiImage = UIImage(cgImage: cgImage!) 
    return uiImage 
} 
+0

यह वास्तव में सवाल का जवाब नहीं देता है। – tomas789

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