Tanto JavaCV como OpenCV son muy fáciles de utilizar en un ordenador. Pero a la hora de trabajar en Android en seguida surge un pequeño problema: ¿Cómo cargo las imágenes?. La clase BufferedImage no existe en Android, y la mitad de los métodos no funcionan por una u otra razón.
Nota: Recordad que en OpenCV (y por lo tanto JavaCV), el formato por defecto es BGR para las imágenes en color (CV_LOAD_IMAGE_COLOR).
Soluciones para cargar imagenes
Desde recursos (p.ej: res/drawable/imagen.png)Aquí el problema consiste en que los recursos se accede a través de un identificador tipo int, así que el truco consiste en cargar un bitmap y copiar directamente los píxeles desde el bitmap a una IplImage:
// Se carga el recurso en un bitmap Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.imagen); // Se crea la imagen IplImage image = IplImage.create(bitmapMask.getWidth(), bitmapMask.getHeight(), IPL_DEPTH_8U, 4); // ARGB // Se copian los píxeles del bitmap a la imagen bitmap.copyPixelsToBuffer(image);
Desde Assets (p.ej: assets/imagen.jpg)
El problema consiste en que los archivos guardados en assets están comprimidos, por lo que acceder a través del path (file:///android_asset/imagen.jpg) no funciona. El truco consiste en copiarlo a la caché y cargar la imagen desde ahí:
// type: CV_LOAD_IMAGE_COLOR
public static IplImage loadImageFromAsset(Context context, String filename, int type) {
IplImage image = null;
File file = new File(context.getCacheDir() + "/" + filename);
if (!file.exists())
try {
InputStream is = context.getAssets().open(filename);
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
FileOutputStream fos = new FileOutputStream(file);
fos.write(buffer);
fos.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
if (file.exists()) {
image = cvLoadImage(file.getAbsolutePath(), type);
}
return image;
}
Y por último desde la SD o path (y aunque resulte obvio desde el ejemplo anterior):
IplImage image = cvLoadImage(path, CV_LOAD_IMAGE_COLOR);
No hay comentarios:
Publicar un comentario