2011-11-15 30 views
11

Me disculpo si esta pregunta ya se ha cubierto en este sitio, pero parece que no puedo encontrar una respuesta directa. Estoy creando una aplicación para Android que usa OpenCV para tomar una foto, procesarla para detectar objetos y descubrir las coordenadas de esos objetos en la escena.Cargando una imagen usando OpenCV en Android

Todos los tutoriales que encuentro para Android parecen ser el procesamiento en tiempo real de la vista previa de la cámara o el uso de C++, que preferiría no tener que bajar por la carretera C++. Estoy seguro de que me falta algo simple pero no sé qué es.

En otra nota, los objetos que estoy tratando de detectar son bolas de billar sobre una mesa. ¿Cuál sería la mejor técnica de preprocesamiento para detectar mejor las bolas? Hice una prueba rápida usando el método astuto, y parece que la luz que se refleja en las bolas rompe la forma del círculo.

+1

Trate de buscar en HoughCircles – Adrian

Respuesta

16

Para cargar imágenes en Android, puede utilizar

Bitmap bMap=BitmapFactory.decodeResource(getResources(),R.drawable.image1) 

donde imagen1 es una imagen en la carpeta Recursos de su proyecto Android. Luego convierta Bitmap a bytes o Mat y procese en C++ (OpenCV) o Java con los métodos matToBitmap o MatToBitmap en android-opencv.

Si se siente cómodo en el procesamiento de datos utilizando el tipo de estera, puede utilizar (se necesita android-opencv proyecto para utilizar este)

Mat m = Highgui.imread("/media/path_to_image"); 

Puede usar gotas, círculos Hough para detectar las bolas de billar. No hay una manera segura de responder esto. Puedes intentar utilizar espacios de colores RGB o Lab normalizados para jugar (para eliminar el reflejo de las bolas de billar) y ver si detectas las bolas de billar (haciendo círculos de masa, detectores de manchas).

El escenario en tiempo real requerirá que utilice técnicas de aprendizaje automático para detectar bolas de billar mediante el uso de ciertos vectores de características, luego realice entrenamiento y pruebas.

+0

Gracias, yo era capaz de entenderlo, pero también se enteraron de javacv cuales se mantiene más fiel al código opencv nativo, por lo que es más fácil seguirlo junto con otros tutoriales. – vince88

+0

@ vince88 ¿dónde encontraste los tutoriales javacv? ¿Y también podría decirme cómo configurarlo en Windows? Gracias. –

+0

También después de declarar el tipo de datos Mat, ¿qué tengo que hacer para mostrarlo? –

2

Sé que es demasiado tarde, pero alguien puede usar esto.

Highgui se ha eliminado de opencv para android.

En su lugar, puede usar Imgcodes.

Mat BGRMat = Imgcodecs.imread(getResources().getDrawable(R.drawable.img).toString()); 
+0

no demasiado tarde, ¡ayúdame! getDrawable está en desuso por lo que puede usar: Mat BGRMat = Imgcodecs.imread (ResourcesCompat.getDrawable (getResources(), R.drawable.img, null) .toString()); – syonip

+1

en realidad no pude hacer esto, porque un recurso dibujable no tiene una ruta que pueda usar imread. toString() simplemente devuelve el nombre del recurso ... – syonip

+0

@syonip Veo su código anterior, y hay algunos errores :) Asegúrese de copiar el código correctamente. Por ejemplo, después del método getResources(), debe poner. (Punto) en lugar de, (coma). Buena suerte... –

5

Esto funciona para mí (tengo la respuesta desde aquí: How to get Mat with a drawable input in Android using OpenCV)

Mat img = null; 
try { 
    img = Utils.loadResource(this, R.drawable.image_id, CvType.CV_8UC4); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

Hola, utilicé este código para cargar una imagen RGB, pero para algunos reson el tipo 'Mat' era' CV_8UC1'. alguna idea de por qué es eso? – noamgot

Cuestiones relacionadas