2011-04-12 12 views
23

मैं एक एंड्रॉइड एप्लिकेशन बनाने की कोशिश कर रहा हूं जो वास्तविक समय में कैमरा फ्रेम को संसाधित करेगा। शुरू करने के लिए, मैं बस कैमरे को देखता है कि एक ग्रेस्केल संस्करण प्रदर्शित करना चाहता हूँ। मैंने onPreviewFrame विधि में बाइट सरणी से उचित मान निकालने में कामयाब रहा है।रीयल टाइम में एंड्रॉइड कैमरा फ्रेम प्रोसेसिंग

byte[] pic; 
int pic_size; 
Bitmap picframe; 
public void onPreviewFrame(byte[] frame, Camera c) 
{ 
    pic_size = mCamera.getParameters().getPreviewSize().height * mCamera.getParameters().getPreviewSize().width; 
    pic = new byte[pic_size]; 
    for(int i = 0; i < pic_size; i++) 
    { 
     pic[i] = frame[i]; 
    } 
    picframe = BitmapFactory.decodeByteArray(pic, 0, pic_size); 
} 

byte[] फ्रेम सरणी के पहले [width*height] मूल्यों luminance (ग्रेस्केल) मान हैं: नीचे बस अपना कोड का एक टुकड़ा है। एक बार जब मैंने उन्हें निकाला है, तो मैं उन्हें स्क्रीन पर एक छवि के रूप में कैसे प्रदर्शित करूं? यह 2 डी सरणी भी नहीं है, तो मैं चौड़ाई और ऊंचाई कैसे निर्दिष्ट करूं?

उत्तर

-2

आप openFramworks (http://www.openframeworks.cc/) को आजमा सकते हैं। एक कैमरा संस्करण है! तो आपको निम्न स्तर की चीजें करने की ज़रूरत नहीं है।

10

आप OpenCV4Android SDK से व्यापक मार्गदर्शन प्राप्त कर सकते हैं। उनके उपलब्ध उदाहरणों को देखें, विशेष रूप से Tutorial 1 Basic. 0 Android Camera

लेकिन, जैसा कि यह मेरे मामले में गहन छवि प्रसंस्करण के लिए था, यह वास्तविक समय छवि प्रसंस्करण अनुप्रयोग के लिए स्वीकार्य से धीमा हो जाएगा। YUVImage करने के लिए अपने onPreviewFrame की बाइट सरणी रूपांतरण के लिए एक अच्छा प्रतिस्थापन:

YuvImage yuvImage = new YuvImage(frame, ImageFormat.NV21, width, height, null);

एक आयत छवि के रूप में एक ही आकार बनाएँ।

एक ByteArrayOutputStream बनाएं और इस पारित, आयत और compressToJpeg() करने के लिए संपीड़न मूल्य:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); yuvimage.compressToJpeg(imageSizeRectangle, 100, baos);

byte [] imageData = baos.toByteArray();

Bitmap previewBitmap = BitmapFactory.decodeByteArray(imageData , 0, imageData .length);

एक सतह पर इन previewFrames प्रतिपादन और शामिल सर्वोत्तम अभ्यास एक नया आयाम है। =)

+1

क्या यह वाईयूवी छवि को मध्यस्थ जेपीईजी के साथ बिटमैप में परिवर्तित करने के लिए होता है? मुश्किल से एक व्यवहार्य वास्तविक समय समाधान – Rekin

+0

मैं दृढ़ता से इसके खिलाफ सलाह दूंगा। एंड्रॉइड पर ओपनसीवी परियोजना में जटिलता जोड़ देगा और देशी पुस्तकालयों की भी आवश्यकता होगी जो लगभग 10 एमबी आकार में हैं। एंड्रॉइड के पास ओपी की आवश्यकता को पूरा करने के लिए सभी सुविधाएं हैं। ओपनसीवी एक महान पुस्तकालय है, लेकिन इस स्थिति के लिए अधिक है। – protectedmember

-2

वर्तमान एंड्रॉइड टूल/एपीआई उपलब्ध कराने के साथ यह हासिल करना एक आसान काम नहीं है। सामान्य रूप से, एनडीके स्तर पर रीयलटाइम छवि-प्रसंस्करण बेहतर होता है। केवल काले और सफेद दिखाने के लिए, आप इसे जावा में भी कर सकते हैं। फ्रेम डेटा युक्त बाइट सरणी वाईयूवी प्रारूप में है, जहां वाई-प्लेन पहले आता है। इसलिए, यदि आपको केवल वाई-प्लेन अकेला मिलता है (पहली चौड़ाई x ऊंचाई बाइट्स), यह आपको पहले से ही काले और सफेद देता है।

मैंने व्यापक कार्य और परीक्षणों के माध्यम से इसे हासिल किया। आप ऐप को Google पर देख सकते हैं: https://play.google.com/store/apps/details?id=com.nm.camerafx

1

इस बहुत पुरानी पोस्ट ने अब मेरा ध्यान खींचा है।

'11 में उपलब्ध एपीआई बहुत सीमित था। आज (कुछ) मैनिप्लेशंस के बाद कैमरा स्ट्रीम का पूर्वावलोकन करने के लिए सतह सतह का उपयोग कर सकते हैं (example देखें)।

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