2012-02-25 10 views
8

मेरा लक्ष्य एचएसवी कलर स्पेस का उपयोग करके एक थ्रेस्ड छवि प्रदर्शित करना है जिस तरह से केवल पीले रंग की वस्तुओं को दिखाया जाएगा।एंड्रॉइड - ओपनसीवी का उपयोग करके रंग का पता लगाने - कैसे करें?

protected abstract Bitmap processFrame(VideoCapture capture); 

public void run() { 
... 
bmp = processFrame(mCamera); 
... 
canvas.drawBitmap(bmp, (canvas.getWidth() - bmp.getWidth())/2, (canvas.getHeight() - bmp.getHeight())/2, null); 
... 
} 

मैं इस मिल:

protected Bitmap processFrame(VideoCapture capture) { 
    //capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME); 
    //Imgproc.cvtColor(mGray, mRgba, Imgproc.COLOR_GRAY2RGBA, 4); 

    capture.retrieve(mHSV, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); 
    Imgproc.cvtColor(mHSV, mRgba, Imgproc.COLOR_RGB2HSV, 4); 
    //Core.inRange(mRgba, new Scalar(20, 100, 100), new Scalar(30, 255, 255), mRgba); 

    Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888); 

    if (Utils.matToBitmap(mRgba, bmp)) 
     return bmp; 

    bmp.recycle(); 
    return null; 
} 

आधार (सार) वर्ग "रन" विधि में शामिल हैं: मैं इस कोड (openCV द्वारा दिए गए एक कोड के आधार पर 2.3.1 एंड्रॉयड नमूने) का उपयोग विकृत पूर्वावलोकन जो मुझे लगता है कि मैं समझ सकता हूं (एचएसवी प्रारूप) लेकिन यह खुद को क्यों दोहरा रहा है (मैं इसे जोर देने के लिए एक हरा रेखा खींचता हूं) 4 बार? और काला क्षैतिज रेखा क्या है? enter image description here मैं क्या गलत कर रहा हूं?

Imgproc.cvtColor(mHSV, mRgba, Imgproc.COLOR_RGB2HSV, 4); 

कारण है कि यह COLOR_RGB2HSV है:

एक आखिरी बात, तर्क के पीछे क्या है? यह COLOR_HSV2RGB नहीं होना चाहिए?

मान लें कि मैंने इस समस्या को पारित किया है, मैं अपने मूल रंग में पीले रंग की वस्तुओं के साथ भूरे स्तर की छवि कैसे बना सकता हूं? मैंने Core.inRange() विधि का उपयोग करने पर सोचा लेकिन जब मैं ऐसा करता हूं तो मुझे ब्लैक स्क्रीन मिलती है।

हाँ, मुझे लगता है कि मैं कुल झटका की तरह दिखता हूं लेकिन मुझे कहीं से शुरू करने की ज़रूरत है, है ना?

10x!

अद्यतन 1: मैं RGB-> HSV-> आरजीबी इस तरह से करने की कोशिश की:

@Override 
protected Bitmap processFrame(VideoCapture capture) { 
    //capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME); 
    //Imgproc.cvtColor(mGray, mRgba, Imgproc.COLOR_GRAY2RGBA, 4); 

    capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGB); 
    Imgproc.cvtColor(mRgba, mHSV, Imgproc.COLOR_RGB2HSV,0); 
    //Imgproc.cvtColor(mRgba, mRgba, Imgproc.COLOR_BGR2RGB, 4); 
    //Core.inRange(mRgba, new Scalar(20, 100, 100), new Scalar(30, 255, 255), mRgba); 
    Imgproc.cvtColor(mHSV,mRgba , Imgproc.COLOR_HSV2RGB,0); 

    Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888); 

    if (Utils.matToBitmap(mRgba, bmp)) 
     return bmp; 

    bmp.recycle(); 
    return null; 
} 

और मुझे मिल गया: enter image description here

?

अद्यतन 2:

मैं अंत में समझते हैं कि एक फ्रेम सेट करने से पहले, यह आरजीबी एक अंतरिक्ष में परिवर्तित किया जाना चाहिए। तो मैं अब इस प्रकार कोड के साथ सीमा की कोशिश की:

capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); 
    Imgproc.cvtColor(mRgba, mHSV, Imgproc.COLOR_RGB2HSV,0); 
    Core.inRange(mHSV, new Scalar(20, 100, 100), new Scalar(30, 255, 255), mHSVThreshed); 
    Imgproc.cvtColor(mHSVThreshed, mRgba, Imgproc.COLOR_HSV2RGB, 0); 
    Imgproc.cvtColor(mRgba, mRgba, Imgproc.COLOR_RGB2RGBA, 0); 
    Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888); 

लेकिन अब यह मुझे बंद के लिए मजबूर कर देता है ... किसी भी विचार?

+1

मुझे कुछ समय पहले पता था और यह पूछने का सही तरीका नहीं है - लेकिन क्या आपने इसके लिए एक ट्यूटोरियल किया है? क्योंकि मुझे वीडियोकैप्चर काम नहीं मिल रहा है, अगर आप अपना कोड - या जिथब पर अपने कोड के कुछ हिस्सों को प्रदान कर सकते हैं तो मुझे खुशी होगी। बड़ा धन्यवाद – user1651460

+2

अरे वहाँ। मैं वास्तव में माफी चाहता हूं लेकिन यह थोड़ी देर हो गया है क्योंकि मैंने ओपनसीवी के साथ काम किया है, इसके अलावा मेरे पास अब कोड नहीं है। मैं आपको यहां देखने की सलाह देता हूं: http://docs.opencv.org/doc/tutorials/highgui/video-write/video-write.html#videowritehighgui। शुभकामनाएं, कड़ी मेहनत अंततः भुगतान करती है :) – gor

उत्तर

5

मुझे लगता है कि mHSVThreshed एक द्विआधारी चटाई

तो शायद इस पंक्ति है:

Imgproc.cvtColor(mHSVThreshed, mRgba, Imgproc.COLOR_HSV2RGB, 0); 

Imgproc.cvtColor(mHSVThreshed, mRgba, Imgproc.COLOR_GRAY2RGB, 0); 

मैं बहुत समय बिताया "दिखाने" समस्याओं से निपटने:

में बदल जानी चाहिए एम भी ...

आशा है कि यह मदद ...

+0

תודה। מה ניסת לעשות? – gor

+0

अरे, क्या मैं छवि में हाइलाइट किए गए हिस्से पर एक मैट्रिक्स जोड़ना चाहता हूं, क्या आप मुझे मार्गदर्शन कर सकते हैं? –

+0

किस प्रकार का मैट्रिक्स? तुम्हारा मतलब एआर की तरह कुछ खींचना है? –

1

यह COLOR_RGB2HSV क्यों है? यह COLOR_HSV2RGB नहीं होना चाहिए?

मैं कहूंगा कि यह चाहिए :)। ओपनसीवी पिक्सल को कैसे पकड़ता है इस पर एक समस्या की तरह दिखता है। जांचें कि आपके इनपुट और आउटपुट छवियों में समान आकार और संख्या वाले चैनल हैं।

यह

capture.retrieve(mHSV, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); 

भी मुझे अजीब लग रहा है, आप RGBA छवि है कि आप एचएसवी प्रारूप में एक छवि में मिल भंडारण कर रहे हैं? इससे समस्या की व्याख्या होगी। ऐसा कुछ करने का प्रयास करें: आरजीबी (कैप्चर पुनर्प्राप्ति) => एचएसवी (सीवीटी रंग) => रंग का पता लगाने => आरजीबी (सीवीटी रंग फिर से)

+0

मुझे पता है कि यह वायर्ड दिखता है लेकिन जब मैं कनवर्ट करने का प्रयास करता हूं: capture.retrieve (mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); Imgproc.cvtColor (mRgba, mHSV, Imgproc.COLOR_HSV2RGB_FULL, 4); यह काम नहीं करता है ... – gor

2

वैसे जहां तक ​​मैं इसे देखता हूं आप आरजीबीए में छवि फ्रेम लाते हैं और cvtColor आप COLOR_RGBA2HSV के माध्यम से एचएसवी करने के लिए इसे बदलने के लिए की जरूरत है mRgba

के रूप में नाम के तहत इसे सहेजें "mHSV"

capture.retrieve(mHSV, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);

ताकि आप इसे वहाँ संग्रहीत करना चाहिए

। आप नाम बदल गए हैं यह मानते हुए किया जाएगा:

Imgproc.cvtColor(mRgba, mRSV, Imgproc.COLOR_RGB2HSV, 0); 

और मुझे लगता है छवियों के इस पुनरावृत्ति आप में cvtColor समारोह अपने एचएसवी चित्र के बाद से "4" से आता है केवल 3 चैनलों होगा। एक 0 वहाँ में डाल दिया और यह स्वचालित रूप से पता लगाया जा चाहिए ...

मुझे आशा है कि यह मदद करता है ...

+0

अरे, बिल्कुल मेरा मतलब क्या था, लेकिन बेहतर स्पष्टीकरण के साथ: पी – jlengrand

+0

10x लोग। मैं इसे आज़मा दूंगा .. – gor

+0

मैंने पोस्ट को अपडेट किया है, आपको इसे देखना चाहिए .. – gor

15

दोस्त। मैं आपको 1 महीने का कड़ी मेहनत का परिणाम देता हूं और सागर के दोस्तों से मदद करता हूं: enter image description here

एथन सही था। लेकिन कोड को कुछ फिक्सिंग की आवश्यकता थी।

कोड:

capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_BGRA); 
    Imgproc.cvtColor(mRgba, mHSV, Imgproc.COLOR_BGR2HSV,3); 
    Core.inRange(mHSV, new Scalar(0, 100, 30), new Scalar(5, 255, 255), mHSVThreshed); 
    Imgproc.cvtColor(mHSVThreshed, mRgba, Imgproc.COLOR_GRAY2BGR, 0); 
    Imgproc.cvtColor(mRgba, mRgba2, Imgproc.COLOR_BGR2RGBA, 0); 
    Bitmap bmp = Bitmap.createBitmap(mRgba2.cols(), mRgba2.rows(), Bitmap.Config.ARGB_8888); 


    if (Utils.matToBitmap(mRgba2, bmp))... 

पहले, चटाई 0 या 255 इसलिए स्तर ग्रे को बदलने द्विआधारी है और अधिक "प्राकृतिक" है। दूसरा, वास्तव में एचएसवी आरजीबीएस से रूपांतरण एचएसवी-बीजीआर !! और आखिरी बात यह है कि पूर्वावलोकन आरजीबीए बिटमैप की उम्मीद कर रहा है।

यह है कि। उम्मीद है कि अन्य इस पोस्ट से लाभ उठा सकते हैं। SHALOM!

+0

कुडोस, यह एक बहुत मददगार था! – octopi

+0

बढ़िया! खुशी है कि मैं आपकी मदद करने में कामयाब रहा .. – gor

+0

@gor क्या आप कृपया mRgba, mHSV, mHSVThreshed, mRgba2 के मान जोड़ सकते हैं? – dvrm

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