2012-03-15 20 views
9

मेरे पास एक ऐसा एप्लीकेशन है जो कैमरा पूर्वावलोकन लेता है, प्रत्येक फ्रेम (जैसे किनारे का पता लगाने, रंग परिवर्तन, छवि वार इत्यादि) पर कुछ मूल छवि प्रसंस्करण फ़ंक्शन करता है और स्क्रीन में संशोधित फ्रेम प्रदर्शित करता है "रियल टाइम"। एंड्रॉइड मार्केट में "पेपर कैमरा" ऐप के समान।एंड्रॉइड: रीयल टाइम इमेज प्रोसेसिंग

मेरे दृष्टिकोण का एक सारांश:

1: बनाएँ framelayout में दो ओवरलैप दृश्य: Camera.setPreviewDisplay को पारित करने के लिए

एक SurfaceView()। (पासिंग नल कैमरे के पूर्वावलोकन को कुछ उपकरणों पर शुरू करने से रोक देगा - ओपनसीवी एंड्रॉइड 4.0 से पहले ऐसा करने के लिए इस्तेमाल किया जाता है?)।

"लाइवव्यू" नामक एक कक्षा जो दृश्य और लागू करता है कैमरा। पूर्वावलोकनवॉलबैक। यह दृश्य कैमरे से फ्रेम प्राप्त करता है, और संशोधन के बाद फ्रेम प्रदर्शित करता है (उदा। किनारे का पता लगाने)। यह दृश्य SurfaceView के शीर्ष पर है।

2: मैं Camera.setPreviewCallbackWithBuffer(), फोन ताकि फ्रेम मेरी LiveView

3 के लिए भेजा जाता:) LiveView की onPreviewFrame में (, मैं पर कब्जा कर लिया फ्रेम ले (बाइट []) , YUV से बदलें आरजीबी के लिए और छवि प्रसंस्करण कार्य करते हैं, और postInvalidate फोन() (YUV2RGB रूपांतरण और छवि प्रसंस्करण मूल कोड में किया जाता)

4: LiveView की विधि OnDraw() में, मैं बनाने के एक संशोधित आरजीबी फ्रेम (बाइट []) से बिटमैप, और कैनवास में बिटमैप खींचें।

यह काम करता है (विभिन्न उपकरणों पर 5fps और 10fps के बीच), लेकिन मैं यह सुनना चाहता हूं कि दूसरों ने इस समस्या से कैसे संपर्क किया है, और यह कैसे सुधार किया जा सकता है। विशेष रूप से:

  • क्या मुझे लाइवव्यू क्लास बनाने के बजाय GLSurfaceView को विस्तारित करके कोई प्रदर्शन प्राप्त होगा?
  • यह प्रत्येक फ्रेम के लिए दो सतहों को अद्यतन करने के लिए बहुत अक्षम है। क्या कोई विकल्प है?
  • इसे और अधिक कुशलतापूर्वक करने के लिए, क्या मुझे मूल स्तर पर कैमरे तक पहुंचाया जाना चाहिए? - मेरा मानना ​​है कि ओपनसीवी इस दृष्टिकोण को लेता है?

कई धन्यवाद

उत्तर

4

मैं भी कुछ इस तरह किया है। मैं क्या करता हूं कैमरा दृश्य का विस्तार करता है। मुझे नहीं लगता कि कैमरा दृश्य प्रत्येक फ्रेम को अद्यतन किया गया है, लेकिन पुनः प्राप्त किया गया। और केवल वह दृश्य जो आपने बदला है उसे अपडेट करना होगा। ओपनसीवी देशी कैमरे की तुलना में बेहतर काम करता है। org.opencv.highgui.VideoCapture आयात करने के बाद, आप सीधे का उपयोग कर कैमरे को एक्सेस कर सकते हैं: (org.opencv.imgproc.Imgproc)

Imgproc.cvtColor(mGrayMat, mRgbaMat, Imgproc.COLOR_GRAY2BGRA, 4); 
:

VideoCapture camera; 
camera.retrieve(mGrayMat, Highgui.CV_CAP_ANDROID_GREY_FRAME); 

mRgbaMat को mGrayMat कन्वर्ट करने के लिए

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