Я новичок как в OpenCv, так и в StackOverflow, и почти новичок в программировании на Android, поэтому извините меня, если мой вопрос глуп.
Я пытаюсь сопоставить изображение, полученное с камеры, с некоторыми файлами изображений,чтобы увидеть, какой файл изображения больше похож на изображение с камеры.Поэтому я использую DescriptorExtractor.compute для получения ключевых точек изображения файла и изображения камеры с помощью SURF (я также пробовал SIFT), чтобы сопоставить их, но ... метод, примененный к изображению файла, всегда возвращает пустой список ключевых точек, в то время какесли я использую его на изображении с камеры, я всегда получаю непустой список (в среднем сто баллов).Больше всего меня озадачивает то, что даже при использовании одного и того же изображения, загружаемого сначала из камеры, а затем из файла, я получаю такое поведение.
Не могли бы вы помочь мне понять, что я делаю неправильно?Вот некоторый тестовый код (только для файловой части, но я использую тот же метод getKp для извлечения ключевых точек из камеры).
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;
}
}
Большое спасибо.
Ale