Soy nuevo en OpenCv y StackOverflow, y casi nuevo en la programación de Android, así que discúlpeme si mi pregunta es estúpida.OpenCv en Android: detección de punto clave en imágenes desde el archivo
Estoy tratando de hacer coincidir una imagen adquirida de la cámara con algunos archivos de imagen, para ver qué archivo de imagen es más similar a la imagen de la cámara. Así que uso DescriptorExtractor.compute para obtener los puntos clave de la imagen del archivo y la imagen de la cámara con SURF (también intenté SIFT) para hacer coincidirlos, pero ... el método aplicado a la imagen del archivo siempre devuelve una lista de puntos clave vacía, mientras si lo uso en la imagen de la cámara, siempre obtengo una lista no vacía (un centenar de puntos en promedio). Lo que más me desconcierta es que incluso usando la misma imagen, cargada desde la cámara primero, y luego desde el archivo, obtengo este comportamiento.
¿Podría por favor ayudarme a descubrir qué estoy haciendo mal? Aquí hay un código de prueba (solo para la parte del archivo, pero utilizo el mismo método getKp para extraer los puntos clave de la cámara también).
public class HelloOpenCvActivity extends Activity {
private static final int FILE_REQUEST = 400;
/** Called when the activity is first created. */
ImageView img;
TextView txt;
Bitmap logo;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
img = (ImageView) findViewById(R.id.image);
txt = (TextView) findViewById(R.id.kp);
img.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
chooseFile();
}
});
}
private void chooseFile(){
Intent fileIntent = new Intent(Intent.ACTION_GET_CONTENT);
fileIntent.addCategory(Intent.CATEGORY_OPENABLE);
fileIntent.setType("image/*");
startActivityForResult(Intent.createChooser(fileIntent,"prova"), FILE_REQUEST);
}
/*Quando ho il risultato della chiamata al file explorer, viene invocata questa callback */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == FILE_REQUEST) {
// obtain the filename
Uri uri = data.getData();
String filePath = null;
if (uri != null) {
if (uri.toString().startsWith("file:")) {
filePath = uri.getPath();
} else { // uri.startsWith("content:")
Cursor c = getContentResolver().query(uri, null, null, null, null);
if (c != null && c.moveToFirst()) {
int id = c.getColumnIndex(Images.Media.DATA);
if (id != -1) {
filePath = c.getString(id);
}
}
}
}
if (filePath != null) {
logo = BitmapFactory.decodeFile(filePath);
img.setImageBitmap(logo);
txt.setText(""+getKp(logo).size());
}
}
}
private List<KeyPoint> getKp(Bitmap bm){
Mat image = Utils.bitmapToMat(bm);
List<KeyPoint> kp = new ArrayList<KeyPoint>();
FeatureDetector fd = FeatureDetector.create(FeatureDetector.SURF);
fd.detect(image, kp);
return kp;
}
}
Muchas gracias.
Ale
¡Funciona como un encanto, listo! –