2012-02-25 23 views
8

il mio obiettivo è visualizzare un'immagine trebbiata utilizzando lo spazio colore HSV in modo che vengano mostrati solo gli oggetti gialli. io uso questo codice (sulla base di un codice proposta dal OpenCV 2.3.1 campioni Android):ANDROID - rilevamento del colore tramite openCV - come?

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

base (Abstract) classe contiene il metodo "run":

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

ottengo questo anteprima distorta che penso di poter capire (formato HSV), ma perché si ripete da sola (ho disegnato una linea verde per enfatizzarla) 4 volte? e qual è la linea nera orizzontale? enter image description here cosa sto facendo di sbagliato?

un'ultima cosa, qual è la logica che sta dietro:

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

perché è COLOR_RGB2HSV? non dovrebbe essere COLOR_HSV2RGB?

Diciamo che ho superato questo problema, come posso creare un'immagine a livello di grigio con gli oggetti gialli nel loro colore nativo? Ho pensato di usare il metodo Core.inRange() ma quando lo faccio ottengo lo schermo nero.

sì, credo di sembrare un cretino totale ma ho bisogno di partire da qualche parte, no?

10x!

Update 1: ho cercato di fare RGB-> HSV> RGB in questo modo:

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

ed ho ottenuto: enter image description here

?

Aggiornamento 2:

ho finalmente capito che prima di un frame, deve essere convertito in RGB Un spazio. così ho provato oggi la soglia con il codice come segue:

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

ma ora mi dà forza di spegnimento ... tutte le idee?

+1

So che è qualche tempo fa e non è il modo corretto per chiedere - ma hai fatto un tutorial per questo? dato che non riesco a far funzionare VideoCapture, sarei lieto se tu potessi fornire il tuo codice o parti del tuo codice su github. Grazie mille – user1651460

+2

Ehi lì. Sono davvero dispiaciuto, ma è da un po 'che non lavoro con OpenCV, in più non ho più il codice. Ti consiglio di guardare qui: http://docs.opencv.org/doc/tutorials/highgui/video-write/video-write.html#videowritehighgui. Buona fortuna, il duro lavoro paga alla fine :) – gor

risposta

5

penso mHSVThreshed e un tappetino a binario

quindi forse questa linea:

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

dovrebbe cambiare a:

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

ho passato un sacco di tempo affrontare il proble "proiezione" m anche ...

spero che questo aiuto ...

+0

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

+0

Ehi, voglio aggiungere una matrice sulla parte evidenziata nell'immagine, puoi guidarmi? –

+0

Che tipo di matrice? Vuoi dire disegnare qualcosa su di esso come AR? –

1

perché COLOR_RGB2HSV? non dovrebbe essere COLOR_HSV2RGB?

Direi che dovrebbe :). Sembra un problema su come opencv cattura i pixel. Verifica che le tue immagini di input e di output abbiano le stesse dimensioni e il numero di canali.

Questo

capture.retrieve(mHSV, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); 

sembra anche strano per me, Stai memorizzare l'immagine RGBA che si ottiene in un'immagine in formato HSV? Questo spiegherebbe il problema. Prova a fare qualcosa del genere: RGB (cattura recuperare) => HSV (colore cvt) => rilevamento del colore => RGB (colore cvt di nuovo)

+0

so che sembra cablato, ma quando provo la conversione: capture.retrieve (mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); Imgproc.cvtColor (mRgba, mHSV, Imgproc.COLOR_HSV2RGB_FULL, 4); non funziona ... – gor

2

Bene fino a quando vedo che si recupera la cornice dell'immagine in RGBA e salvarlo con il nome di "mHSV"

capture.retrieve(mHSV, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);

modo ci dovrebbe conservarlo come mRgba

nel cvtColor è necessario trasformarla a HSV via COLOR_RGBA2HSV. Supponendo di aver cambiato i nomi questo sarebbe:

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

e presumo questa ripetizione delle immagini viene dal "4" in voi la funzione cvtColor poiché la vostra immagine HSV avrà solo 3 canali. Mettete in una 0 lì e dovrebbe essere rilevato automaticamente ...

Spero che aiuta ...

+0

Ehi, esattamente quello che intendevo, ma con spiegazioni migliori: p – jlengrand

+0

10x ragazzi. lo proverò .. – gor

+0

ho aggiornato il Post, dovresti verificarlo .. – gor

15

amici. Ti do il risultato di 1 mese di duro lavoro e l'aiuto di amici dall'altra parte dell'oceano: enter image description here

Ethan aveva ragione. ma il codice aveva bisogno di qualche correzione.

codice:

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

primo, il tappetino è binario 0 o 255 così la trasformazione al grigio livello è più "naturale". in secondo luogo, la conversione da HSV a RGB è in effetti HSV-BGR !!. e l'ultima cosa è che l'anteprima si aspetta RGBA Bitmap.

questo è tutto. spero che altri possano beneficiare di questo post. SHALOM!

+0

Complimenti, questo è stato di grande aiuto! – octopi

+0

fantastico! felice di essere riuscito ad aiutarti ... – gor

+0

@gor potresti aggiungere i valori di mRgba, mHSV, mHSVThreshed, mRgba2? – dvrm

Problemi correlati