Je suis nouveau sur OpenCv et StackOverflow, et presque nouveau dans la programmation Android, alors excusez-moi si ma question est stupide.
J'essaie de faire correspondre une image acquise à partir d'une caméra à certains fichiers d'image, afin de voir quel fichier d'image est le plus similaire à l'image de la caméra. J'utilise donc DescriptorExtractor.compute pour obtenir les points clés de l'image du fichier et de l'image de la caméra avec SURF (j'ai aussi essayé SIFT) afin de les faire correspondre mais... la méthode appliquée à l'image du fichier renvoie toujours une liste de points clés vide, alors que si je l'utilise sur l'image de la caméra, j'obtiens toujours une liste non vide (une centaine de points en moyenne). Ce qui m'intrigue le plus, c'est que même en utilisant la même image, chargée d'abord depuis la caméra, puis depuis le fichier, j'obtiens ce comportement.
Pourriez-vous m'aider à comprendre ce que je fais mal ? Voici un peu de code de test (seulement pour la partie fichier, mais j'utilise la même méthode getKp pour extraire les points clés de la caméra également).
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;
}
}
Merci beaucoup.
Ale