2012-02-25 19 views
8

moim celem jest wyświetlanie zmłobionego obrazu za pomocą przestrzeni kolorów HSV w taki sposób, aby pokazywały się tylko żółte obiekty. Używam tego kodu (na podstawie kodu podanego przez OpenCV próbki android 2.3.1):ANDROID - wykrywanie koloru za pomocą openCV - jak?

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; 
} 

podstawa (Abstract) klasa zawiera "run" metody:

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); 
... 
} 

uzyskać to zniekształcony podgląd, który myślę, że rozumiem (format HSV), ale dlaczego to się powtarza (i rysuję zieloną linię, aby to podkreślić) 4-krotnie? i jaka jest czarna pozioma linia? enter image description here co robię źle?

ostatnia rzecz, jaka jest logika:

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

dlaczego jest COLOR_RGB2HSV? nie powinno to być COLOR_HSV2RGB?

Załóżmy, że przekazałem ten problem, w jaki sposób mogę utworzyć obraz poziomu szarości z żółtymi obiektami w ich macierzystym kolorze? Myślałem, że przy użyciu metody Core.inRange(), ale kiedy to zrobię, dostaję czarny ekran.

tak, myślę, że wyglądam jak totalny szarpnięcie, ale muszę zacząć od czegoś, prawda?

10x!

Aktualizacja 1: próbowałem zrobić RGB->> RGB HSV ten sposób:

@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; 
} 

i mam: enter image description here

?

Aktualizacja 2:

końcu zrozumieć, że przed ustawieniem ramkę, to musi być przekształcony RGB przestrzeni. więc teraz spróbował próg z kodem następujące:

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); 

ale teraz daje mi wymusić zamknięcie ... jakieś pomysły?

+1

Wiem, że jakiś czas temu i nie jest to właściwy sposób zadawania pytań - ale czy zrobiłeś samouczek? ponieważ nie mogę uruchomić VideoCapture, byłbym zadowolony, gdybyś mógł podać swój kod lub części kodu na github. Wielkie dzięki – user1651460

+2

Hej tam. Naprawdę mi przykro, ale minęło trochę czasu odkąd pracowałem z openCV, Plus nie mam już kodu. Radzę zajrzeć tutaj: http://docs.opencv.org/doc/tutorials/highgui/video-write/video-write.html#videowritehighgui. Powodzenia, ciężka praca się opłaca :) – gor

Odpowiedz

5

myślę mHSVThreshed jest binarnym mata

więc może ta linia:

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

powinien zmienić się:

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

spędziłem dużo czasu do czynienia z „pokazano” proble m też ...

mam nadzieję, że ta pomoc ...

+0

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

+0

Hej, chcę dodać matrycę na podświetlonej części obrazu, czy możesz mnie poprowadzić? –

+0

Jakiego rodzaju macierzy? Masz na myśli narysować coś takiego jak AR? –

1

dlaczego to jest COLOR_RGB2HSV? nie powinno to być COLOR_HSV2RGB?

Powiedziałbym, że powinien :). Wygląda na problem z tym, jak opencv łapie piksele. Sprawdź, czy oba obrazy wejściowe i wyjściowe mają ten sam rozmiar i liczbę kanałów.

Ten

capture.retrieve(mHSV, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); 

również wygląda dziwnie na mnie, jesteś zapisywania obrazu RGBA, które można dostać w obraz w formacie HSV? To by wyjaśniało problem. Spróbuj zrobić coś takiego: RGB (przechwytywanie pobierania) => HSV (kolor cvt) => wykrywanie kolorów => RGB (kolor cvt ponownie)

+0

Wiem, że wygląda na podłączony, ale kiedy próbuję konwertować: capture.retrieve (mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); Imgproc.cvtColor (mRgba, mHSV, Imgproc.COLOR_HSV2RGB_FULL, 4); to nie działa ... – gor

2

Cóż, o ile widzę, to pobierz ramkę obrazu w RGBA i zapisz go pod nazwą „mHSV”

capture.retrieve(mHSV, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);

należy więc przechowywać go tam jako mRgba

w cvtColor trzeba przekształcić go do HSV poprzez COLOR_RGBA2HSV. Zakładając zmianie nazwy byłoby to:

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

i zakładam to powtarzanie obrazów pochodzi od „4” w sobie funkcję cvtColor od twojego obrazu HSV będzie miał tylko 3 kanały. Umieścić tam z 0 i powinny być wykrywane automatycznie ...

Mam nadzieję, że to pomaga ...

+0

Hej, dokładnie to, co miałem na myśli, ale z lepszymi wytłumaczeniami: p – jlengrand

+0

10x facetów. spróbuję .. – gor

+0

Zaktualizowałem Post, powinieneś to sprawdzić .. – gor

15

przyjaciół. Daję ci wynik 1 miesiąca ciężkiej pracy i pomocy przyjaciół zza oceanu: enter image description here

Ethan miał rację. ale kod wymagał naprawy.

kod:

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))... 

pierwszy, mata jest binarny 0 lub 255 więc przekształcić się szary poziom jest bardziej „naturalna”. po drugie, konwersja z HSV do RGB jest w rzeczywistości HSV-BGR !!. i ostatnią rzeczą jest to, że podgląd oczekuje bitmapy RGBA.

to wszystko. Mam nadzieję, że z tego postu skorzystają inne osoby. SHALOM!

+0

Kudos, to była świetna pomoc! – octopi

+0

świetnie! cieszę się, że udało mi się pomóc .. – gor

+0

Czy możesz dodać wartości mRgba, mHSV, mHSVThreshed, mRgba2? – dvrm

Powiązane problemy