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? ¿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:
?
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?
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
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