2012-02-25 42 views
8

mi objetivo es mostrar una imagen trillada utilizando el espacio de color HSV de forma que solo se muestren los objetos amarillos. i utilizar este código (basado en un código dado por el OpenCV 2.3.1 muestras androide):ANDROID - detección de color usando openCV - ¿cómo?

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

la base de clase (Abstract) contiene el método "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); 
... 
} 

consigo este vista previa distorsionada que creo que puedo entender (formato HSV) pero ¿por qué se repite (dibujaré una línea verde para enfatizar) 4 veces? y ¿cuál es la línea horizontal negra? enter image description here ¿Qué estoy haciendo mal?

una última cosa, ¿cuál es la lógica detrás:

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

por qué es COLOR_RGB2HSV? ¿No debería ser COLOR_HSV2RGB?

Digamos que he pasado este problema, ¿cómo puedo hacer una imagen de nivel gris con los objetos amarillos en su color nativo? Pensé usar el método Core.inRange() pero cuando hago esto, obtengo una pantalla negra.

sí, supongo que me veo como un idiota total, pero tengo que empezar de alguna parte, ¿no?

10x!

Actualización 1: que traté de hacer RGB-> HSV-> RGB de esta manera:

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

y que tengo: enter image description here

?

Actualización 2:

por fin entiendo que antes de establecer un marco, que debe ser convertido en RGB Un espacio. así que ahora trataron el umbral con el código de la siguiente manera:

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

pero ahora me da Forzar el apagado ... alguna idea?

+1

Sé que es hace algún tiempo y no es la forma correcta de preguntar, pero ¿has hecho un tutorial para esto? como no puedo hacer funcionar el VideoCapture, me alegraría que pudieras proporcionar tu código, o partes de tu código en github. Muchas gracias – user1651460

+2

Hola. Lo siento mucho, pero ha pasado un tiempo desde que trabajé con openCV. Además, ya no tengo el código. Le aconsejo que consulte aquí: http://docs.opencv.org/doc/tutorials/highgui/video-write/video-write.html#videowritehighgui. Buena suerte, el trabajo duro finalmente paga :) – gor

Respuesta

5

Creo mHSVThreshed es una estera binaria

así que tal vez esta línea:

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

debe cambiar a:

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

pasé un montón de tiempo a tratar con el proble "proyección" m también ...

esperanza esta ayuda ...

+0

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

+0

Hola, quiero agregar una matriz en la parte resaltada en la imagen, ¿me pueden guiar? –

+0

¿Qué tipo de matriz? ¿Quieres decir dibujar algo como AR? –

1

¿por qué es COLOR_RGB2HSV? ¿No debería ser COLOR_HSV2RGB?

Yo diría que debería :). Parece un problema sobre cómo OpenCV captura los píxeles. Verifique que sus imágenes de entrada y salida tengan el mismo tamaño y número de canales.

Este

capture.retrieve(mHSV, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); 

se ve también raro para mí, es usted el almacenamiento de la imagen RGBA que se obtiene en una imagen en formato VHS? Eso explicaría el problema. Intente hacer algo como eso: RGB (recuperación de captura) => HSV (color cvt) => detección de color => RGB (color cvt otra vez)

+0

Sé que parece cableado, pero cuando intento convertir: capture.retrieve (mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); Imgproc.cvtColor (mRgba, mHSV, Imgproc.COLOR_HSV2RGB_FULL, 4); no funciona ... – gor

2

Hasta donde yo veo, busca el marco de la imagen en RGBA y guardarlo con el nombre de "MHSV"

capture.retrieve(mHSV, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);

por lo que debe haber almacenarla como mRgba

en el cvtColor que necesita para transformarla a través de HSV COLOR_RGBA2HSV. Suponiendo que usted ha cambiado los nombres de esto sería:

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

y supongo que esta repetición de las imágenes proviene de la "4" en el que la función cvtColor ya que su imagen VHS sólo tendrá 3 canales. Poner en un 0 allí y que debe ser detectada automáticamente ...

espero que ayude ...

+0

Oye, exactamente lo que quise decir, pero con mejores explicaciones: p – jlengrand

+0

10x chicos. Voy a intentarlo ... – gor

+0

He actualizado la publicación, deberías echarle un vistazo. – gor

15

amigos. te doy el resultado de 1 mes de trabajo duro y ayuda de amigos al otro lado del océano: enter image description here

Ethan tenía razón. pero el código necesitaba algo de fijación.

el código:

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

primera, la estera es binario 0 ó 255 por lo que la transformación a nivel gris es más "natural". segundo, la conversión de HSV a RGB es, de hecho, HSV-BGR !!. y lo último es que la vista previa está esperando RGBA Bitmap.

eso es todo. Espero que otros puedan beneficiarse de esta publicación. SHALOM!

+0

Felicitaciones, ¡fue una gran ayuda! – octopi

+0

¡genial! me alegré de poder ayudarte ... – gor

+0

@gor ¿podrías agregar los valores de mRgba, mHSV, mHSVThreshed, mRgba2? – dvrm